Instances of this class are responsible for maintaining the collection of Arrow::Applets in an application..
Create a new Arrow::AppletRegistry object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 210
210: def initialize( config )
211: @config = config
212:
213: @classmap = nil
214: @filemap = {}
215: @urispace = {}
216: @template_factory = Arrow::TemplateFactory.new( config )
217:
218: self.load_applets
219: super()
220: end
Check the applets path for new/updated/deleted applets if the poll interval has passed.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 329
329: def check_for_updates
330: interval = @config.applets.pollInterval
331: if interval.nonzero?
332: if Time.now - @loadTime > interval
333: self.log.debug "Checking for applet updates: poll interval at %ds" % interval
334: self.reload_applets
335: end
336: else
337: self.log.debug "Dynamic applet reloading turned off, continuing"
338: end
339: end
Find the chain of applets indicated by the given uri and return an Array of ChainLink structs.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 257
257: def find_applet_chain( uri )
258: self.log.debug "Searching urispace %p for appletchain for %p" %
259: [@urispace.keys.sort, uri]
260:
261: uri_parts = uri.sub(%r{^/(?=.)}, '').split(%r{/}).grep( IDENTIFIER )
262: appletchain = []
263: args = []
264:
265: # If there's an applet installed at the base, prepend it to the
266: # appletchain
267: if @urispace.key?( "" )
268: appletchain << ChainLink.new( @urispace[""], "", uri_parts )
269: self.log.debug "Added base applet to chain."
270: end
271:
272: # Only allow reference to internal handlers (handlers mapped to
273: # directories that start with '_') if allow_internal is set.
274: self.log.debug "Split URI into parts: %p" % [uri_parts]
275:
276: # Map uri fragments onto registry entries, stopping at any element
277: # which isn't a valid Ruby identifier.
278: uri_parts.each_index do |i|
279: newuri = uri_parts[0,i+1].join("/")
280: self.log.debug "Testing %s against %p" % [ newuri, @urispace.keys.sort ]
281: appletchain << ChainLink.new( @urispace[newuri], newuri, uri_parts[(i+1)..-1] ) if
282: @urispace.key?( newuri )
283: end
284:
285: return appletchain
286: end
Load any new applets in the registry‘s path, reload any previously- loaded applets whose files have changed, and discard any applets whose files have disappeared.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 303
303: def load_applets
304: self.log.debug "Loading applet registry"
305:
306: @classmap = self.build_classmap
307: filelist = self.find_appletfiles
308:
309: # Remove applet files which correspond to files that are no longer
310: # in the list
311: self.purge_deleted_applets( @filemap.keys - filelist ) unless
312: @filemap.empty?
313:
314: # Now search the applet path for applet files
315: filelist.each do |appletfile|
316: self.log.debug "Found applet file %p" % appletfile
317: self.load_applets_from_file( appletfile )
318: self.log.debug "After %s, registry has %d entries" %
319: [ appletfile, @urispace.length ]
320: end
321:
322: @loadTime = Time.now
323: end
Make and return a Hash which inverts the registry‘s applet layout into a map of class name to the URIs onto which instances of them should be installed.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 449
449: def build_classmap
450: classmap = Hash.new {|ary,k| ary[k] = []}
451:
452: # Invert the applet layout into Class => [ uris ] so as classes
453: # load, we know where to put 'em.
454: @config.applets.layout.each do |uri, klassname|
455: uri = uri.to_s.sub( %r{^/}, '' )
456: self.log.debug "Mapping %p to %p" % [ klassname, uri ]
457: classmap[ klassname ] << uri
458: end
459:
460: return classmap
461: end
Find applet files by looking in the applets path of the registry‘s configuration for files matching the configured pattern. Return an Array of fully-qualified applet files. If the optional excludeList is given, exclude any files specified from the return value.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 468
468: def find_appletfiles( excludeList=[] )
469: files = []
470: dirCount = 0
471:
472: # For each directory in the configured applets path,
473: # fully-qualify it and untaint the specified pathname.
474: @config.applets.path.each do |path|
475:
476: # Look for files under a directory
477: if File.directory?( path )
478: dirCount += 1
479: pat = File.join( path, @config.applets.pattern )
480: pat.untaint
481:
482: self.log.debug "Looking for applets: %p" % pat
483: files.push( *Dir[ pat ] )
484: elsif File.file?( path )
485: files.push( path )
486: end
487: end
488:
489: self.log.info "Fetched %d applet file paths from %d directories (out of %d)" %
490: [ files.nitems, dirCount, @config.applets.path.dirs.nitems ]
491:
492: files.each {|file| file.untaint }
493: return files - excludeList
494: end
Load the applet classes from the given path and return them in an Array. If a block is given, then each loaded class is yielded to the block in turn, and the return values are used in the Array instead.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 371
371: def load_applets_from_file( path )
372:
373: # Reload mode -- don't do anything unless the file's been updated
374: if @filemap.key?( path )
375: file = @filemap[ path ]
376:
377: if file.has_changed?
378: self.log.info "File %p has changed since loaded. Reloading." % [path]
379: self.purge_deleted_applets( path )
380: elsif !file.loaded_okay?
381: self.log.warning "File %s could not be loaded: %s" %
382: [path, file.exception.message]
383: file.exception.backtrace.each do |frame|
384: self.log.debug " " + frame
385: end
386: else
387: self.log.debug "File %p has not changed." % [path]
388: return nil
389: end
390: end
391:
392: self.log.debug "Attempting to load applet objects from %p" % path
393: @filemap[ path ] = AppletFile.new( path )
394:
395: @filemap[ path ].appletclasses.each do |appletclass|
396: self.log.debug "Registering applet class %s from %p" % [appletclass.name, path]
397: begin
398: uris = self.register_applet_class( appletclass )
399: @filemap[ path ].uris << uris
400: rescue ::Exception => err
401: frames = filter_backtrace( err.backtrace )
402: self.log.error "%s loaded, but failed to initialize: %s" % [
403: appletclass.normalized_name,
404: err.message,
405: ]
406: self.log.debug " " + frames.collect {|frame| "[%s]" % frame }.join(" ")
407: @filemap[ path ].exception = err
408: end
409: end
410:
411: end
Remove the applets that were loaded from the given missing_files from the registry.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 349
349: def purge_deleted_applets( *missing_files )
350:
351: # For each filename, find the applets which were loaded from it,
352: # map the name of each applet to a uri via the classmap, and delete
353: # the entries by uri
354: missing_files.flatten.each do |filename|
355: self.log.info "Unregistering old applets from %p" % [ filename ]
356:
357: @filemap[ filename ].uris.each do |uri|
358: self.log.debug " Removing %p, registered at %p" % [ @urispace[uri], uri ]
359: @urispace.delete( uri )
360: end
361:
362: @filemap.delete( filename )
363: end
364: end
Register an instance of the given klass with the broker if the classmap includes it, returning the URIs which were mapped to instances of the klass.
# File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 417
417: def register_applet_class( klass )
418: uris = []
419:
420: # Trim the Module serving as private namespace from the
421: # class name
422: appletname = klass.normalized_name
423: self.log.debug "Registering %p applet as %p" % [ klass.name, appletname ]
424:
425: # Look for a uri corresponding to the loaded class, and instantiate it
426: # if there is one.
427: if @classmap.key?( appletname )
428: self.log.debug " Found one or more uris for '%s'" % appletname
429:
430:
431: # Create a new instance of the applet for each uri it's
432: # registered under, then wrap that in a RegistryEntry
433: # and put it in the entries hash we'll return later.
434: @classmap[ appletname ].each do |uri|
435: @urispace[ uri ] = klass.new( @config, @template_factory, uri )
436: uris << uri
437: end
438: else
439: self.log.debug "No uri for '%s': Not instantiated" % appletname
440: end
441:
442: return uris
443: end
--- SEC00019
--- ""
--- | Class <a href="AppletRegistry/AppletFile.html" class="link">Arrow::AppletRegistry::AppletFile</a><br />
---
- name: config
rw: R
a_desc: |+
The <a href="Config.html">Arrow::Config</a> object which specified the
registry‘s behavior.
- name: filemap
rw: R
a_desc: |+
The internal hash of Entry objects keyed by the file they were loaded from
- name: urispace
rw: R
a_desc: |+
The internal hash of Entry objects, keyed by URI
---
- methods:
- visibility: public
aref: M000386
name: new
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 210</span>\n\
210: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span> )\n\
211: <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\
212: \n\
213: <span class=\"ruby-ivar\">@classmap</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
214: <span class=\"ruby-ivar\">@filemap</span> = {}\n\
215: <span class=\"ruby-ivar\">@urispace</span> = {}\n\
216: <span class=\"ruby-ivar\">@template_factory</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">TemplateFactory</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">config</span> )\n\
217: \n\
218: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_applets</span>\n\
219: <span class=\"ruby-keyword kw\">super</span>()\n\
220: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Create a <a href="AppletRegistry.html#M000386">new</a> <a
href="AppletRegistry.html">Arrow::AppletRegistry</a> object.
</p>
params: ( config )
category: Class
type: Public
- methods:
- visibility: public
aref: M000390
name: check_for_updates
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 329</span>\n\
329: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">check_for_updates</span>\n\
330: <span class=\"ruby-identifier\">interval</span> = <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">pollInterval</span>\n\
331: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">interval</span>.<span class=\"ruby-identifier\">nonzero?</span>\n\
332: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-ivar\">@loadTime</span> <span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">interval</span>\n\
333: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Checking for applet updates: poll interval at %ds"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">interval</span>\n\
334: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">reload_applets</span>\n\
335: <span class=\"ruby-keyword kw\">end</span>\n\
336: <span class=\"ruby-keyword kw\">else</span>\n\
337: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Dynamic applet reloading turned off, continuing"</span>\n\
338: <span class=\"ruby-keyword kw\">end</span>\n\
339: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Check the applets path for new/updated/deleted applets if the poll interval
has passed.
</p>
params: ()
- visibility: public
aref: M000387
name: find_applet_chain
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 257</span>\n\
257: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">find_applet_chain</span>( <span class=\"ruby-identifier\">uri</span> )\n\
258: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Searching urispace %p for appletchain for %p"</span> <span class=\"ruby-operator\">%</span>\n\
259: [<span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">keys</span>.<span class=\"ruby-identifier\">sort</span>, <span class=\"ruby-identifier\">uri</span>]\n\
260: \n\
261: <span class=\"ruby-identifier\">uri_parts</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">sub</span>(<span class=\"ruby-regexp re\">%r{^/(?=.)}</span>, <span class=\"ruby-value str\">''</span>).<span class=\"ruby-identifier\">split</span>(<span class=\"ruby-regexp re\">%r{/}</span>).<span class=\"ruby-identifier\">grep</span>( <span class=\"ruby-constant\">IDENTIFIER</span> )\n\
262: <span class=\"ruby-identifier\">appletchain</span> = []\n\
263: <span class=\"ruby-identifier\">args</span> = []\n\
264: \n\
265: <span class=\"ruby-comment cmt\"># If there's an applet installed at the base, prepend it to the</span>\n\
266: <span class=\"ruby-comment cmt\"># appletchain</span>\n\
267: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-value str\">""</span> )\n\
268: <span class=\"ruby-identifier\">appletchain</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-constant\">ChainLink</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-value str\">""</span>], <span class=\"ruby-value str\">""</span>, <span class=\"ruby-identifier\">uri_parts</span> )\n\
269: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Added base applet to chain."</span>\n\
270: <span class=\"ruby-keyword kw\">end</span>\n\
271: \n\
272: <span class=\"ruby-comment cmt\"># Only allow reference to internal handlers (handlers mapped to </span>\n\
273: <span class=\"ruby-comment cmt\"># directories that start with '_') if allow_internal is set.</span>\n\
274: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Split URI into parts: %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">uri_parts</span>]\n\
275: \n\
276: <span class=\"ruby-comment cmt\"># Map uri fragments onto registry entries, stopping at any element </span>\n\
277: <span class=\"ruby-comment cmt\"># which isn't a valid Ruby identifier.</span>\n\
278: <span class=\"ruby-identifier\">uri_parts</span>.<span class=\"ruby-identifier\">each_index</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">|</span>\n\
279: <span class=\"ruby-identifier\">newuri</span> = <span class=\"ruby-identifier\">uri_parts</span>[<span class=\"ruby-value\">0</span>,<span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">+</span><span class=\"ruby-value\">1</span>].<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"/"</span>)\n\
280: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Testing %s against %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">newuri</span>, <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">keys</span>.<span class=\"ruby-identifier\">sort</span> ]\n\
281: <span class=\"ruby-identifier\">appletchain</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-constant\">ChainLink</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-identifier\">newuri</span>], <span class=\"ruby-identifier\">newuri</span>, <span class=\"ruby-identifier\">uri_parts</span>[(<span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">+</span><span class=\"ruby-value\">1</span>)<span class=\"ruby-operator\">..</span><span class=\"ruby-value\">-1</span>] ) <span class=\"ruby-keyword kw\">if</span>\n\
282: <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">newuri</span> )\n\
283: <span class=\"ruby-keyword kw\">end</span>\n\
284: \n\
285: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">appletchain</span>\n\
286: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Find the chain of applets indicated by the given <tt>uri</tt> and return an
Array of ChainLink structs.
</p>
params: ( uri )
- visibility: public
aref: M000388
name: load_applets
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 303</span>\n\
303: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_applets</span>\n\
304: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Loading applet registry"</span>\n\
305: \n\
306: <span class=\"ruby-ivar\">@classmap</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">build_classmap</span>\n\
307: <span class=\"ruby-identifier\">filelist</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">find_appletfiles</span>\n\
308: \n\
309: <span class=\"ruby-comment cmt\"># Remove applet files which correspond to files that are no longer</span>\n\
310: <span class=\"ruby-comment cmt\"># in the list</span>\n\
311: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">keys</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">filelist</span> ) <span class=\"ruby-keyword kw\">unless</span> \n\
312: <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">empty?</span>\n\
313: \n\
314: <span class=\"ruby-comment cmt\"># Now search the applet path for applet files</span>\n\
315: <span class=\"ruby-identifier\">filelist</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">appletfile</span><span class=\"ruby-operator\">|</span>\n\
316: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Found applet file %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletfile</span>\n\
317: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_applets_from_file</span>( <span class=\"ruby-identifier\">appletfile</span> )\n\
318: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"After %s, registry has %d entries"</span> <span class=\"ruby-operator\">%</span>\n\
319: [ <span class=\"ruby-identifier\">appletfile</span>, <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">length</span> ]\n\
320: <span class=\"ruby-keyword kw\">end</span>\n\
321: \n\
322: <span class=\"ruby-ivar\">@loadTime</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>\n\
323: <span class=\"ruby-keyword kw\">end</span>"
aka:
- aref: AppletRegistry.html#M000389
name: reload_applets
m_desc: |-
<p>
Load any <a href="AppletRegistry.html#M000386">new</a> applets in the
registry‘s path, reload any previously- loaded applets whose files
have changed, and discard any applets whose files have disappeared.
</p>
params: ()
- visibility: public
aref: M000389
name: reload_applets
m_desc: |-
<p>
Alias for <a href="AppletRegistry.html#M000388">#load_applets</a>
</p>
params: ()
category: Instance
type: Public
- methods:
- visibility: protected
aref: M000394
name: build_classmap
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 449</span>\n\
449: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">build_classmap</span>\n\
450: <span class=\"ruby-identifier\">classmap</span> = <span class=\"ruby-constant\">Hash</span>.<span class=\"ruby-identifier\">new</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">ary</span>,<span class=\"ruby-identifier\">k</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">ary</span>[<span class=\"ruby-identifier\">k</span>] = []}\n\
451: \n\
452: <span class=\"ruby-comment cmt\"># Invert the applet layout into Class => [ uris ] so as classes</span>\n\
453: <span class=\"ruby-comment cmt\"># load, we know where to put 'em.</span>\n\
454: <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">layout</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span>, <span class=\"ruby-identifier\">klassname</span><span class=\"ruby-operator\">|</span>\n\
455: <span class=\"ruby-identifier\">uri</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">%r{^/}</span>, <span class=\"ruby-value str\">''</span> )\n\
456: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Mapping %p to %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">klassname</span>, <span class=\"ruby-identifier\">uri</span> ]\n\
457: <span class=\"ruby-identifier\">classmap</span>[ <span class=\"ruby-identifier\">klassname</span> ] <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">uri</span>\n\
458: <span class=\"ruby-keyword kw\">end</span>\n\
459: \n\
460: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">classmap</span>\n\
461: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Make and return a Hash which inverts the registry‘s applet layout
into a map of class name to the URIs onto which instances of them should be
installed.
</p>
params: ()
- visibility: protected
aref: M000395
name: find_appletfiles
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 468</span>\n\
468: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">find_appletfiles</span>( <span class=\"ruby-identifier\">excludeList</span>=[] )\n\
469: <span class=\"ruby-identifier\">files</span> = []\n\
470: <span class=\"ruby-identifier\">dirCount</span> = <span class=\"ruby-value\">0</span>\n\
471: \n\
472: <span class=\"ruby-comment cmt\"># For each directory in the configured applets path,</span>\n\
473: <span class=\"ruby-comment cmt\"># fully-qualify it and untaint the specified pathname.</span>\n\
474: <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">path</span><span class=\"ruby-operator\">|</span>\n\
475: \n\
476: <span class=\"ruby-comment cmt\"># Look for files under a directory</span>\n\
477: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">directory?</span>( <span class=\"ruby-identifier\">path</span> )\n\
478: <span class=\"ruby-identifier\">dirCount</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-value\">1</span>\n\
479: <span class=\"ruby-identifier\">pat</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-identifier\">path</span>, <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">pattern</span> )\n\
480: <span class=\"ruby-identifier\">pat</span>.<span class=\"ruby-identifier\">untaint</span>\n\
481: \n\
482: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Looking for applets: %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">pat</span>\n\
483: <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-constant\">Dir</span>[ <span class=\"ruby-identifier\">pat</span> ] )\n\
484: <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">file?</span>( <span class=\"ruby-identifier\">path</span> )\n\
485: <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">path</span> )\n\
486: <span class=\"ruby-keyword kw\">end</span>\n\
487: <span class=\"ruby-keyword kw\">end</span>\n\
488: \n\
489: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"Fetched %d applet file paths from %d directories (out of %d)"</span> <span class=\"ruby-operator\">%</span>\n\
490: [ <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">nitems</span>, <span class=\"ruby-identifier\">dirCount</span>, <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">dirs</span>.<span class=\"ruby-identifier\">nitems</span> ]\n\
491: \n\
492: <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">file</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">untaint</span> }\n\
493: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">files</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">excludeList</span>\n\
494: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Find applet files by looking in the applets path of the registry‘s
configuration for files matching the configured pattern. Return an Array of
fully-qualified applet files. If the optional <tt>excludeList</tt> is
given, exclude any files specified from the return value.
</p>
params: ( excludeList=[] )
- visibility: protected
aref: M000392
name: load_applets_from_file
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 371</span>\n\
371: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_applets_from_file</span>( <span class=\"ruby-identifier\">path</span> )\n\
372: \n\
373: <span class=\"ruby-comment cmt\"># Reload mode -- don't do anything unless the file's been updated</span>\n\
374: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">path</span> )\n\
375: <span class=\"ruby-identifier\">file</span> = <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ]\n\
376: \n\
377: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">has_changed?</span>\n\
378: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"File %p has changed since loaded. Reloading."</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">path</span>]\n\
379: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-identifier\">path</span> )\n\
380: <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">loaded_okay?</span>\n\
381: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-value str\">"File %s could not be loaded: %s"</span> <span class=\"ruby-operator\">%</span> \n\
382: [<span class=\"ruby-identifier\">path</span>, <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">exception</span>.<span class=\"ruby-identifier\">message</span>]\n\
383: <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">exception</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">frame</span><span class=\"ruby-operator\">|</span>\n\
384: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">" "</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">frame</span>\n\
385: <span class=\"ruby-keyword kw\">end</span>\n\
386: <span class=\"ruby-keyword kw\">else</span>\n\
387: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"File %p has not changed."</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">path</span>]\n\
388: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\
389: <span class=\"ruby-keyword kw\">end</span>\n\
390: <span class=\"ruby-keyword kw\">end</span>\n\
391: \n\
392: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Attempting to load applet objects from %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">path</span>\n\
393: <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ] = <span class=\"ruby-constant\">AppletFile</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">path</span> )\n\
394: \n\
395: <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">appletclasses</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">appletclass</span><span class=\"ruby-operator\">|</span>\n\
396: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Registering applet class %s from %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">appletclass</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">path</span>]\n\
397: <span class=\"ruby-keyword kw\">begin</span>\n\
398: <span class=\"ruby-identifier\">uris</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">register_applet_class</span>( <span class=\"ruby-identifier\">appletclass</span> )\n\
399: <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">uris</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">uris</span>\n\
400: <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Exception</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\
401: <span class=\"ruby-identifier\">frames</span> = <span class=\"ruby-identifier\">filter_backtrace</span>( <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span> )\n\
402: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"%s loaded, but failed to initialize: %s"</span> <span class=\"ruby-operator\">%</span> [\n\
403: <span class=\"ruby-identifier\">appletclass</span>.<span class=\"ruby-identifier\">normalized_name</span>,\n\
404: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>,\n\
405: ]\n\
406: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">" "</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">frames</span>.<span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">frame</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-value str\">"[%s]"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">frame</span> }.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">" "</span>)\n\
407: <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">exception</span> = <span class=\"ruby-identifier\">err</span>\n\
408: <span class=\"ruby-keyword kw\">end</span>\n\
409: <span class=\"ruby-keyword kw\">end</span>\n\
410: \n\
411: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Load the applet classes from the given <tt>path</tt> and return them in an
Array. If a block is given, then each loaded class is yielded to the block
in turn, and the return values are used in the Array instead.
</p>
params: ( path )
- visibility: protected
aref: M000391
name: purge_deleted_applets
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 349</span>\n\
349: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">missing_files</span> )\n\
350: \n\
351: <span class=\"ruby-comment cmt\"># For each filename, find the applets which were loaded from it, </span>\n\
352: <span class=\"ruby-comment cmt\"># map the name of each applet to a uri via the classmap, and delete</span>\n\
353: <span class=\"ruby-comment cmt\"># the entries by uri</span>\n\
354: <span class=\"ruby-identifier\">missing_files</span>.<span class=\"ruby-identifier\">flatten</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">filename</span><span class=\"ruby-operator\">|</span>\n\
355: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"Unregistering old applets from %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">filename</span> ]\n\
356: \n\
357: <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">filename</span> ].<span class=\"ruby-identifier\">uris</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span><span class=\"ruby-operator\">|</span>\n\
358: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">" Removing %p, registered at %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-identifier\">uri</span>], <span class=\"ruby-identifier\">uri</span> ]\n\
359: <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">uri</span> )\n\
360: <span class=\"ruby-keyword kw\">end</span>\n\
361: \n\
362: <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">filename</span> )\n\
363: <span class=\"ruby-keyword kw\">end</span>\n\
364: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Remove the applets that were loaded from the given <tt>missing_files</tt>
from the registry.
</p>
params: ( *missing_files )
- visibility: protected
aref: M000393
name: register_applet_class
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 417</span>\n\
417: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">register_applet_class</span>( <span class=\"ruby-identifier\">klass</span> )\n\
418: <span class=\"ruby-identifier\">uris</span> = []\n\
419: \n\
420: <span class=\"ruby-comment cmt\"># Trim the Module serving as private namespace from the</span>\n\
421: <span class=\"ruby-comment cmt\"># class name</span>\n\
422: <span class=\"ruby-identifier\">appletname</span> = <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">normalized_name</span>\n\
423: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Registering %p applet as %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">appletname</span> ]\n\
424: \n\
425: <span class=\"ruby-comment cmt\"># Look for a uri corresponding to the loaded class, and instantiate it</span>\n\
426: <span class=\"ruby-comment cmt\"># if there is one.</span>\n\
427: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@classmap</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">appletname</span> )\n\
428: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">" Found one or more uris for '%s'"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletname</span>\n\
429: \n\
430: \n\
431: <span class=\"ruby-comment cmt\"># Create a new instance of the applet for each uri it's</span>\n\
432: <span class=\"ruby-comment cmt\"># registered under, then wrap that in a RegistryEntry</span>\n\
433: <span class=\"ruby-comment cmt\"># and put it in the entries hash we'll return later.</span>\n\
434: <span class=\"ruby-ivar\">@classmap</span>[ <span class=\"ruby-identifier\">appletname</span> ].<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span><span class=\"ruby-operator\">|</span>\n\
435: <span class=\"ruby-ivar\">@urispace</span>[ <span class=\"ruby-identifier\">uri</span> ] = <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@config</span>, <span class=\"ruby-ivar\">@template_factory</span>, <span class=\"ruby-identifier\">uri</span> )\n\
436: <span class=\"ruby-identifier\">uris</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">uri</span>\n\
437: <span class=\"ruby-keyword kw\">end</span>\n\
438: <span class=\"ruby-keyword kw\">else</span>\n\
439: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"No uri for '%s': Not instantiated"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletname</span>\n\
440: <span class=\"ruby-keyword kw\">end</span>\n\
441: \n\
442: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">uris</span>\n\
443: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Register an instance of the given <tt>klass</tt> with the broker if the
classmap includes it, returning the URIs which were mapped to instances of
the <tt>klass</tt>.
</p>
params: ( klass )
category: Instance
type: Protected
---
---
- name: SVNRev
desc: |+
SVN Revision
value: "%q$Rev: 437 $"
- name: SVNId
desc: |+
SVN Id
value: "%q$Id: appletregistry.rb 437 2008-03-28 00:49:20Z deveiant $"
- name: IDENTIFIER
desc: |+
Pattern for matching valid components of the uri
value: /^\w[-\w]*/
- name: ChainLink
desc: |+
Link in an applet chain
value: Struct.new( 'ArrowAppletChainLink', :applet, :path, :args )
Generated with the Darkfish Rdoc Generator.