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.