Added feed aggregation module.
Redesigned the CMS_BLOCK system,
- added condition attribute. It can be set via configuration file
with
[blocks]
{blockid}.region={region_name}
{blockid}.conditions[]=is_front
{blockid}.conditions[]=path:location-path/foo/bar
- For backward compatibility, the CMS will check only conditions for block name prefixed by "?".
Improved the configuration library to support list and table properties.
Updated theme for now, to include the feed examples.
Added "cache" classes, to ease caching of html output for instance. (TODO: improve by providing a cache manager).
This commit is contained in:
94
src/cache/cms_cache.e
vendored
Normal file
94
src/cache/cms_cache.e
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
note
|
||||
description: "Abstract interface for cache of value conforming to formal {G}."
|
||||
date: "$Date: 2014-12-03 16:12:08 +0100 (mer., 03 déc. 2014) $"
|
||||
revision: "$Revision: 96232 $"
|
||||
|
||||
deferred class
|
||||
CMS_CACHE [G -> ANY]
|
||||
|
||||
feature -- Status report
|
||||
|
||||
exists: BOOLEAN
|
||||
-- Do associated cache file exists?
|
||||
deferred
|
||||
end
|
||||
|
||||
expired (a_reference_date: detachable DATE_TIME; a_duration_in_seconds: INTEGER): BOOLEAN
|
||||
-- Is associated cached item expired?
|
||||
-- If `a_reference_date' is attached, cache is expired if `a_reference' is more recent than cached item.
|
||||
local
|
||||
d1, d2: DATE_TIME
|
||||
do
|
||||
if exists then
|
||||
if
|
||||
a_reference_date /= Void and then
|
||||
a_reference_date > cache_date_time
|
||||
then
|
||||
Result := True
|
||||
else
|
||||
if a_duration_in_seconds = -1 then
|
||||
Result := False -- Never expires
|
||||
elseif a_duration_in_seconds = 0 then
|
||||
Result := True -- Always expires
|
||||
elseif a_duration_in_seconds > 0 then
|
||||
d1 := cache_date_time
|
||||
d2 := current_date_time
|
||||
d2.second_add (- a_duration_in_seconds) --| do not modify `cache_date_time'
|
||||
Result := d2 > d1 -- cached date + duration is older than current date
|
||||
else
|
||||
-- Invalid expiration value
|
||||
-- thus always expired.
|
||||
Result := True
|
||||
end
|
||||
end
|
||||
else
|
||||
Result := True
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
item: detachable G
|
||||
-- Value from the cache.
|
||||
deferred
|
||||
end
|
||||
|
||||
cache_date_time: DATE_TIME
|
||||
-- Date time for current cache if exists.
|
||||
-- Note: it may be UTC or not , depending on cache type.
|
||||
deferred
|
||||
end
|
||||
|
||||
cache_duration_in_seconds: INTEGER_64
|
||||
-- Number of seconds since cache was set.
|
||||
require
|
||||
exists: exists
|
||||
local
|
||||
d1, d2: DATE_TIME
|
||||
do
|
||||
d1 := cache_date_time
|
||||
d2 := current_date_time
|
||||
Result := d2.relative_duration (d1).seconds_count
|
||||
end
|
||||
|
||||
current_date_time: DATE_TIME
|
||||
-- Current date time for relative duration with cache_date_time.
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
delete
|
||||
-- Remove cache.
|
||||
deferred
|
||||
end
|
||||
|
||||
put (g: G)
|
||||
-- Put `g' into cache.
|
||||
deferred
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
150
src/cache/cms_file_cache.e
vendored
Normal file
150
src/cache/cms_file_cache.e
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
note
|
||||
description: "Cache using a local file."
|
||||
date: "$Date: 2015-09-24 18:24:06 +0200 (jeu., 24 sept. 2015) $"
|
||||
revision: "$Revision: 97926 $"
|
||||
|
||||
deferred class
|
||||
CMS_FILE_CACHE [G -> ANY]
|
||||
|
||||
inherit
|
||||
CMS_CACHE [G]
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_cache_filename: PATH)
|
||||
do
|
||||
path := a_cache_filename
|
||||
end
|
||||
|
||||
path: PATH
|
||||
|
||||
feature -- Status report
|
||||
|
||||
exists: BOOLEAN
|
||||
-- Do associated cache file exists?
|
||||
local
|
||||
ut: FILE_UTILITIES
|
||||
do
|
||||
Result := ut.file_path_exists (path)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
cache_date_time: DATE_TIME
|
||||
-- <Precursor>
|
||||
local
|
||||
f: RAW_FILE
|
||||
do
|
||||
create f.make_with_path (path)
|
||||
if f.exists then
|
||||
Result := utc_file_date_time (f)
|
||||
else
|
||||
create Result.make_now_utc
|
||||
end
|
||||
end
|
||||
|
||||
current_date_time: DATE_TIME
|
||||
-- <Precursor>
|
||||
do
|
||||
-- UTC, since `cache_date_time' is UTC!
|
||||
create Result.make_now_utc
|
||||
end
|
||||
|
||||
file_size: INTEGER
|
||||
-- Associated file size.
|
||||
require
|
||||
exists: exists
|
||||
local
|
||||
f: RAW_FILE
|
||||
do
|
||||
create f.make_with_path (path)
|
||||
if f.exists and then f.is_access_readable then
|
||||
Result := f.count
|
||||
end
|
||||
end
|
||||
|
||||
item: detachable G
|
||||
local
|
||||
f: RAW_FILE
|
||||
retried: BOOLEAN
|
||||
do
|
||||
if not retried then
|
||||
create f.make_with_path (path)
|
||||
if f.exists and then f.is_access_readable then
|
||||
f.open_read
|
||||
Result := file_to_item (f)
|
||||
f.close
|
||||
end
|
||||
end
|
||||
rescue
|
||||
retried := True
|
||||
retry
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
delete
|
||||
-- <Precursor>
|
||||
local
|
||||
f: RAW_FILE
|
||||
retried: BOOLEAN
|
||||
do
|
||||
if not retried then
|
||||
create f.make_with_path (path)
|
||||
-- Create recursively parent directory if it does not exists.
|
||||
if f.exists and then f.is_access_writable then
|
||||
f.delete
|
||||
end
|
||||
end
|
||||
rescue
|
||||
retried := True
|
||||
retry
|
||||
end
|
||||
|
||||
put (g: G)
|
||||
-- <Precursor>
|
||||
local
|
||||
f: RAW_FILE
|
||||
d: DIRECTORY
|
||||
do
|
||||
create f.make_with_path (path)
|
||||
-- Create recursively parent directory if it does not exists.
|
||||
create d.make_with_path (path.parent)
|
||||
if not d.exists then
|
||||
d.recursive_create_dir
|
||||
end
|
||||
if not f.exists or else f.is_access_writable then
|
||||
f.open_write
|
||||
item_to_file (g, f)
|
||||
f.close
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
utc_file_date_time (f: FILE): DATE_TIME
|
||||
-- Last change date for file `f'.
|
||||
require
|
||||
f.exists
|
||||
do
|
||||
create Result.make_from_epoch (f.date.as_integer_32)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
file_to_item (f: FILE): detachable G
|
||||
require
|
||||
is_open_write: f.is_open_read
|
||||
deferred
|
||||
end
|
||||
|
||||
item_to_file (g: G; f: FILE)
|
||||
require
|
||||
is_open_write: f.is_open_write
|
||||
deferred
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
49
src/cache/cms_file_object_cache.e
vendored
Normal file
49
src/cache/cms_file_object_cache.e
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
note
|
||||
description: "Cache for value conforming to formal {G}, and implemented using local file."
|
||||
date: "$Date: 2014-10-30 12:13:25 +0100 (jeu., 30 oct. 2014) $"
|
||||
revision: "$Revision: 96016 $"
|
||||
|
||||
class
|
||||
CMS_FILE_OBJECT_CACHE [G -> ANY]
|
||||
|
||||
inherit
|
||||
CMS_FILE_CACHE [G]
|
||||
|
||||
SED_STORABLE_FACILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
file_to_item (f: FILE): detachable G
|
||||
local
|
||||
retried: BOOLEAN
|
||||
l_reader: SED_MEDIUM_READER_WRITER
|
||||
l_void: detachable G
|
||||
do
|
||||
if retried then
|
||||
Result := l_void
|
||||
else
|
||||
create l_reader.make_for_reading (f)
|
||||
if attached {G} retrieved (l_reader, True) as l_data then
|
||||
Result := l_data
|
||||
end
|
||||
end
|
||||
rescue
|
||||
retried := True
|
||||
retry
|
||||
end
|
||||
|
||||
item_to_file (a_data: G; f: FILE)
|
||||
local
|
||||
l_writer: SED_MEDIUM_READER_WRITER
|
||||
do
|
||||
create l_writer.make_for_writing (f)
|
||||
basic_store (a_data, l_writer, True)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
69
src/cache/cms_file_string_8_cache.e
vendored
Normal file
69
src/cache/cms_file_string_8_cache.e
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
note
|
||||
description: "Cache system for STRING_8 value."
|
||||
date: "$Date: 2014-10-30 12:13:25 +0100 (jeu., 30 oct. 2014) $"
|
||||
revision: "$Revision: 96016 $"
|
||||
|
||||
class
|
||||
CMS_FILE_STRING_8_CACHE
|
||||
|
||||
inherit
|
||||
CMS_FILE_CACHE [STRING]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Access
|
||||
|
||||
append_to (a_output: STRING)
|
||||
-- Append `item' to `a_output'.
|
||||
local
|
||||
f: RAW_FILE
|
||||
retried: BOOLEAN
|
||||
do
|
||||
if not retried then
|
||||
create f.make_with_path (path)
|
||||
if f.exists and then f.is_access_readable then
|
||||
f.open_read
|
||||
if attached file_to_item (f) as s then
|
||||
a_output.append (s)
|
||||
end
|
||||
f.close
|
||||
end
|
||||
end
|
||||
rescue
|
||||
retried := True
|
||||
retry
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
file_to_item (f: FILE): detachable STRING
|
||||
local
|
||||
retried: BOOLEAN
|
||||
do
|
||||
if retried then
|
||||
Result := Void
|
||||
else
|
||||
from
|
||||
create Result.make_empty
|
||||
until
|
||||
f.exhausted or f.end_of_file
|
||||
loop
|
||||
f.read_stream_thread_aware (1_024)
|
||||
Result.append (f.last_string)
|
||||
end
|
||||
end
|
||||
rescue
|
||||
retried := True
|
||||
retry
|
||||
end
|
||||
|
||||
item_to_file (a_data: STRING; f: FILE)
|
||||
do
|
||||
f.put_string (a_data)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
61
src/cache/cms_memory_cache.e
vendored
Normal file
61
src/cache/cms_memory_cache.e
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
note
|
||||
description: "Cache relying on memory."
|
||||
date: "$Date: 2014-12-03 16:57:00 +0100 (mer., 03 déc. 2014) $"
|
||||
revision: "$Revision: 96234 $"
|
||||
|
||||
deferred class
|
||||
CMS_MEMORY_CACHE [G -> ANY]
|
||||
|
||||
inherit
|
||||
CMS_CACHE [G]
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
cache_date_time := current_date_time
|
||||
end
|
||||
|
||||
|
||||
feature -- Status report
|
||||
|
||||
exists: BOOLEAN
|
||||
-- Do associated cache memory exists?
|
||||
do
|
||||
Result := item /= Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
cache_date_time: DATE_TIME
|
||||
|
||||
current_date_time: DATE_TIME
|
||||
-- <Precursor>
|
||||
do
|
||||
create Result.make_now_utc
|
||||
end
|
||||
|
||||
item: detachable G
|
||||
|
||||
feature -- Element change
|
||||
|
||||
delete
|
||||
-- <Precursor>
|
||||
local
|
||||
l_default: detachable G
|
||||
do
|
||||
item := l_default
|
||||
cache_date_time := current_date_time
|
||||
end
|
||||
|
||||
put (g: G)
|
||||
-- <Precursor>
|
||||
do
|
||||
item := g
|
||||
cache_date_time := current_date_time
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
Reference in New Issue
Block a user