AbstractFactory for templates — defer specification of which templating system to use until load time, and provide timestamp-based caching for template files.
Given an Arrow::Config object (config), attempt to load and instantiate the configured template loader object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 45
45: def self::build_template_loader( config )
46:
47: # Resolve the loader name into the Class object by traversing
48: # constants.
49: klass = config.templates.loader.
50: split( /::/ ).
51: inject( Object ) {|mod, name|
52: mod.const_get( name ) or raise ConfigError,
53: "No such template loader class #{name} for #{mod.name}"
54: }
55:
56: if klass.respond_to?( :load )
57: return klass
58: else
59: return klass.new( config )
60: end
61: end
Create a new TemplateFactory from the given configuration object, which should specify a loader class for templates.
# File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 70
70: def initialize( config )
71: @config = config
72: @cache = nil
73:
74: if config.templates.cache
75: @cache = Arrow::Cache.new(
76: "Template Factory",
77: config.templates.cacheConfig,
78: &method(:template_expiration_hook) )
79: end
80:
81: @loader = self.class.build_template_loader( config )
82: @path = config.templates.path
83:
84: super()
85: end
Load a template object with the specified name.
# File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 103
103: def get_template( name )
104: self.log.debug "Fetching template '#{name}'"
105:
106: if @cache
107: self.log.debug "Doing cached fetch."
108: tmpl = @cache.fetch( name, &method(:load_from_file) )
109:
110: if tmpl.changed?
111: self.log.debug "Template has changed on disk: reloading"
112: @cache.invalidate( name )
113: tmpl = @cache.fetch( name, &method(:load_from_file) )
114: end
115:
116: return tmpl.dup
117: else
118: self.log.debug "Caching disabled. Loading from file."
119: return self.load_from_file( name )
120: end
121: end
Load a template from its source file (ie., if caching is turned off or if the cached version is either expired or not yet seen)
# File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 126
126: def load_from_file( name )
127: self.log.debug "Loading template #{name} from the filesystem"
128: return @loader.load( name, @path )
129: end
Called when a template is expired from the cache
# File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 133
133: def template_expiration_hook( key, template )
134: self.log.debug "Template %s is expiring." % key
135: end
--- SEC00180
--- ""
---
- name: cache
rw: RW
a_desc: |+
The <a href="Cache.html">Arrow::Cache</a> object used to cache template
objects.
- name: loader
rw: RW
a_desc: |+
The loader object that the factory uses to load templates
- name: path
rw: RW
a_desc: |+
The path to search for templates
---
- methods:
- visibility: public
aref: M000368
name: build_template_loader
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 45</span>\n\
45: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">build_template_loader</span>( <span class=\"ruby-identifier\">config</span> )\n\
46: \n\
47: <span class=\"ruby-comment cmt\"># Resolve the loader name into the Class object by traversing</span>\n\
48: <span class=\"ruby-comment cmt\"># constants.</span>\n\
49: <span class=\"ruby-identifier\">klass</span> = <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">loader</span>.\n\
50: <span class=\"ruby-identifier\">split</span>( <span class=\"ruby-regexp re\">/::/</span> ).\n\
51: <span class=\"ruby-identifier\">inject</span>( <span class=\"ruby-constant\">Object</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">mod</span>, <span class=\"ruby-identifier\">name</span><span class=\"ruby-operator\">|</span>\n\
52: <span class=\"ruby-identifier\">mod</span>.<span class=\"ruby-identifier\">const_get</span>( <span class=\"ruby-identifier\">name</span> ) <span class=\"ruby-keyword kw\">or</span> <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ConfigError</span>,\n\
53: <span class=\"ruby-node\">"No such template loader class #{name} for #{mod.name}"</span>\n\
54: }\n\
55: \n\
56: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">respond_to?</span>( <span class=\"ruby-identifier\">:load</span> )\n\
57: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">klass</span>\n\
58: <span class=\"ruby-keyword kw\">else</span>\n\
59: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">config</span> )\n\
60: <span class=\"ruby-keyword kw\">end</span>\n\
61: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Given an <a href="Config.html">Arrow::Config</a> object (<tt>config</tt>),
attempt to load and instantiate the configured template loader object.
</p>
params: ( config )
- visibility: public
aref: M000369
name: new
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 70</span>\n\
70: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span> )\n\
71: <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\
72: <span class=\"ruby-ivar\">@cache</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
73: \n\
74: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">cache</span>\n\
75: <span class=\"ruby-ivar\">@cache</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Cache</span>.<span class=\"ruby-identifier\">new</span>(\n\
76: <span class=\"ruby-value str\">"Template Factory"</span>,\n\
77: <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">cacheConfig</span>,\n\
78: <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">method</span>(<span class=\"ruby-identifier\">:template_expiration_hook</span>) )\n\
79: <span class=\"ruby-keyword kw\">end</span>\n\
80: \n\
81: <span class=\"ruby-ivar\">@loader</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">build_template_loader</span>( <span class=\"ruby-identifier\">config</span> )\n\
82: <span class=\"ruby-ivar\">@path</span> = <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">path</span>\n\
83: \n\
84: <span class=\"ruby-keyword kw\">super</span>()\n\
85: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Create a <a href="TemplateFactory.html#M000369">new</a> <a
href="TemplateFactory.html">TemplateFactory</a> from the given
configuration object, which should specify a loader class for templates.
</p>
params: ( config )
category: Class
type: Public
- methods:
- visibility: public
aref: M000370
name: get_template
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 103</span>\n\
103: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">get_template</span>( <span class=\"ruby-identifier\">name</span> )\n\
104: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-node\">"Fetching template '#{name}'"</span>\n\
105: \n\
106: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@cache</span>\n\
107: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Doing cached fetch."</span>\n\
108: <span class=\"ruby-identifier\">tmpl</span> = <span class=\"ruby-ivar\">@cache</span>.<span class=\"ruby-identifier\">fetch</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">method</span>(<span class=\"ruby-identifier\">:load_from_file</span>) )\n\
109: \n\
110: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">tmpl</span>.<span class=\"ruby-identifier\">changed?</span>\n\
111: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Template has changed on disk: reloading"</span>\n\
112: <span class=\"ruby-ivar\">@cache</span>.<span class=\"ruby-identifier\">invalidate</span>( <span class=\"ruby-identifier\">name</span> )\n\
113: <span class=\"ruby-identifier\">tmpl</span> = <span class=\"ruby-ivar\">@cache</span>.<span class=\"ruby-identifier\">fetch</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">method</span>(<span class=\"ruby-identifier\">:load_from_file</span>) )\n\
114: <span class=\"ruby-keyword kw\">end</span>\n\
115: \n\
116: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">tmpl</span>.<span class=\"ruby-identifier\">dup</span>\n\
117: <span class=\"ruby-keyword kw\">else</span>\n\
118: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Caching disabled. Loading from file."</span>\n\
119: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_from_file</span>( <span class=\"ruby-identifier\">name</span> )\n\
120: <span class=\"ruby-keyword kw\">end</span>\n\
121: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Load a template object with the specified name.
</p>
params: ( name )
- visibility: public
aref: M000371
name: load_from_file
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 126</span>\n\
126: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_from_file</span>( <span class=\"ruby-identifier\">name</span> )\n\
127: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-node\">"Loading template #{name} from the filesystem"</span>\n\
128: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@loader</span>.<span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-ivar\">@path</span> )\n\
129: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Load a template from its source file (ie., if caching is turned off or if
the cached version is either expired or not yet seen)
</p>
params: ( name )
- visibility: public
aref: M000372
name: template_expiration_hook
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/templatefactory.rb, line 133</span>\n\
133: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">template_expiration_hook</span>( <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-identifier\">template</span> )\n\
134: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Template %s is expiring."</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">key</span>\n\
135: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Called when a template is expired from the cache
</p>
params: ( key, template )
category: Instance
type: Public
---
---
- name: SVNRev
desc: |+
SVN Revision
value: "%q$Rev: 437 $"
- name: SVNId
desc: |+
SVN Id
value: "%q$Id: templatefactory.rb 437 2008-03-28 00:49:20Z deveiant $"
Generated with the Darkfish Rdoc Generator.