Instance of this class contain a map of applets registered to a given location..
Create a new Arrow::Broker object from the specified config (an Arrow::Config object).
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 47 47: def initialize( config ) 48: @config = config 49: @registry = Arrow::AppletRegistry.new( config ) 50: @start_time = Time.now 51: end
Dispatch the specified transaction txn to the appropriate handler based on the request‘s path_info.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 68 68: def delegate( txn ) 69: rval = appletchain = nil 70: self.log.debug "Start of delegation (%s)" % [ txn.unparsed_uri ] 71: 72: # Fetch the path and trim the leading '/' 73: path = txn.path 74: path.sub!( %r{^/}, '' ) 75: self.log.debug "Request's path is %p" % path 76: 77: # Check for updated/deleted/added applets 78: @registry.check_for_updates 79: 80: # Get the chain of applets to execute for the request 81: appletchain = @registry.find_applet_chain( path ) 82: 83: # If the pathinfo doesn't correspond to at least one applet, run 84: # the no-such-applet handler. 85: if appletchain.empty? 86: rval = self.run_missing_applet_handler( txn, path ) 87: else 88: rval = self.run_applet_chain( txn, appletchain ) 89: end 90: 91: # Set the request status to declined if it hasn't been set yet and 92: # the return value is false. 93: if !rval 94: self.log.error "Applet returned false value. " + 95: "Setting status to DECLINED" 96: txn.status = Apache::DECLINED 97: end 98: 99: # self.log.debug "Returning %p" % [ rval ] 100: return rval 101: end
The builtin missing-applet handler routine. Returns false, which causes the dispatcher to decline the request.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 214 214: def builtin_missing_handler( txn, *args ) 215: self.log.notice "Using builtin missing-applet handler." 216: return false 217: end
The builtin error handler routine. Outputs a plain-text backtrace for the given exception err and applet to the given transaction txn.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 256 256: def default_error_handler( applet, txn, err ) 257: self.log.notice "Using builtin error handler." 258: txn.request.content_type = "text/plain" 259: txn.status = Apache::OK 260: 261: return "Arrow Applet Error in '%s': %s\n\t%s" % 262: [ applet.class.signature.name, err.message, err.backtrace.join("\n\t") ] 263: end
Run the specified applet with the given txn (an Arrow::Transaction) and the rest of the path_info split on ’/’.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 171 171: def run_applet( applet, txn, rest ) 172: self.log.debug "Running '%s' with args: %p" % 173: [ applet.signature.name, rest ] 174: return applet.run( txn, *rest ) 175: rescue ::Exception => err 176: self.log.error "[%s]: Error running %s (%s): %s:\n\t%s" % [ 177: txn.serial, 178: applet.signature.name, 179: applet.class.filename, 180: err.message, 181: err.backtrace.join("\n\t"), 182: ] 183: return self.run_error_handler( applet, txn, err ) 184: end
Given a chain of applets built from a URI, run the +index+th one with the specified transaction (txn). Applets before the last get called via their #delegate method, while the last one is called via #run.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 111 111: def run_applet_chain( txn, chain ) 112: self.log.debug "Running applet chain: #{chain.inspect}" 113: raise Arrow::AppletError, "Malformed applet chain" if 114: chain.empty? || !chain.first.respond_to?( :applet ) 115: 116: res = nil 117: applet, txn.applet_path, args = self.unwrap_chain_link( chain.first ) 118: 119: # If there's only one item left, run it 120: if chain.nitems == 1 121: self.log.debug "Running final applet in chain" 122: res = self.run_applet( applet, txn, args ) 123: 124: # Otherwise, delegate the transaction to the next applet with the 125: # remainder of the chain. 126: else 127: dchain = chain[ 1..-1 ] 128: self.log.debug "Running applet %s in chain of %d; chain = %p" % 129: [ applet.signature.name, chain.nitems, dchain ] 130: 131: begin 132: res = applet.delegate( txn, dchain, *args ) do |subchain| 133: subchain = dchain if subchain.nil? 134: self.log.debug "Delegated call to appletchain %p" % [ subchain ] 135: self.run_applet_chain( txn, subchain ) 136: end 137: rescue ::Exception => err 138: self.log.error "Error while executing applet chain: %p (/%s): %s:\n\t%s" % [ 139: applet, 140: chain.first[1], 141: err.message, 142: err.backtrace.join("\n\t"), 143: ] 144: res = self.run_error_handler( applet, txn, err ) 145: end 146: end 147: 148: return res 149: end
Handle the given applet error err for the specified applet, using the given transaction txn. This will attempt to run whatever applet is configured as the error-handler, or run a builtin handler applet if none is configured or the configured one isn‘t loaded.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 224 224: def run_error_handler( applet, txn, err ) 225: rval = nil 226: handlerName = @config.applets.errorApplet.sub( %r{^/}, '' ) 227: 228: unless handlerName == "(builtin)" or !@registry.key?( handlerName ) 229: handler = @registry[handlerName] 230: self.log.notice "Running error handler applet '%s' (%s)" % 231: [ handler.signature.name, handlerName ] 232: 233: begin 234: rval = handler.run( txn, "report_error", applet, err ) 235: rescue ::Exception => err2 236: self.log.error "Error while attempting to use custom error "\ 237: "handler '%s': %s\n\t%s" % [ 238: handler.signature.name, 239: err2.message, 240: err2.backtrace.join("\n\t"), 241: ] 242: 243: rval = self.default_error_handler( applet, txn, err ) 244: end 245: else 246: rval = self.default_error_handler( applet, txn, err ) 247: end 248: 249: return rval 250: end
Handle requests that target an applet that doesn‘t exist.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 188 188: def run_missing_applet_handler( txn, uri ) 189: rval = appletchain = nil 190: handlerUri = @config.applets.missingApplet 191: args = uri.split( %r{/} ) 192: 193: # Build an applet chain for user-configured handlers 194: if handlerUri != "(builtin)" 195: appletchain = @registry.find_applet_chain( handlerUri ) 196: self.log.error "Configured MissingApplet handler (%s) doesn't exist" % 197: handlerUri if appletchain.empty? 198: end 199: 200: # If the user-configured handler maps to one or more handlers, run 201: # them. Otherwise, run the build-in handler. 202: unless appletchain.nil? || appletchain.empty? 203: rval = self.run_applet_chain( txn, appletchain ) 204: else 205: rval = self.builtin_missing_handler( txn, *args ) 206: end 207: 208: return rval 209: end
Check the specified link of an applet chain for sanity and return its constituent bits for assignment. This is necessary to provide sensible errors if a delegating app screws up a chain somehow.
# File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 155 155: def unwrap_chain_link( link ) 156: applet = link.applet or raise Arrow::AppletChainError, "Null applet" 157: path = link.path or raise Arrow::AppletChainError, "Null path" 158: args = link.args or raise Arrow::AppletChainError, "Null argument list" 159: unless args.is_a?( Array ) 160: emsg = "Argument list is a %s: expected an Array" % 161: args.class.name 162: raise Arrow::AppletChainError, emsg 163: end 164: 165: return applet, path, args 166: end
--- SEC00025
--- ""
--- - name: registry rw: RW a_desc: |+ The Hash of RegistryEntry structs keyed by uri - name: start_time rw: R a_desc: |+ The Time when the <a href="Broker.html">Broker</a> was started
--- - methods: - visibility: public aref: M000341 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 47</span>\n\ 47: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span> )\n\ 48: <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\ 49: <span class=\"ruby-ivar\">@registry</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletRegistry</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">config</span> )\n\ 50: <span class=\"ruby-ivar\">@start_time</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>\n\ 51: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="Broker.html#M000341">new</a> <a href="Broker.html">Arrow::Broker</a> object from the specified <tt>config</tt> (an <a href="Config.html">Arrow::Config</a> object). </p> params: ( config ) category: Class type: Public - methods: - visibility: public aref: M000342 name: delegate sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 68</span>\n 68: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">delegate</span>( <span class=\"ruby-identifier\">txn</span> )\n 69: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">appletchain</span> = <span class=\"ruby-keyword kw\">nil</span>\n 70: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Start of delegation (%s)"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">unparsed_uri</span> ]\n 71: \n 72: <span class=\"ruby-comment cmt\"># Fetch the path and trim the leading '/'</span>\n 73: <span class=\"ruby-identifier\">path</span> = <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">path</span>\n 74: <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">sub!</span>( <span class=\"ruby-regexp re\">%r{^/}</span>, <span class=\"ruby-value str\">''</span> )\n 75: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Request's path is %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">path</span>\n 76: \n 77: <span class=\"ruby-comment cmt\"># Check for updated/deleted/added applets</span>\n 78: <span class=\"ruby-ivar\">@registry</span>.<span class=\"ruby-identifier\">check_for_updates</span>\n 79: \n 80: <span class=\"ruby-comment cmt\"># Get the chain of applets to execute for the request</span>\n 81: <span class=\"ruby-identifier\">appletchain</span> = <span class=\"ruby-ivar\">@registry</span>.<span class=\"ruby-identifier\">find_applet_chain</span>( <span class=\"ruby-identifier\">path</span> )\n 82: \n 83: <span class=\"ruby-comment cmt\"># If the pathinfo doesn't correspond to at least one applet, run</span>\n 84: <span class=\"ruby-comment cmt\"># the no-such-applet handler.</span>\n 85: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">appletchain</span>.<span class=\"ruby-identifier\">empty?</span>\n 86: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_missing_applet_handler</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">path</span> )\n 87: <span class=\"ruby-keyword kw\">else</span>\n 88: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_applet_chain</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">appletchain</span> )\n 89: <span class=\"ruby-keyword kw\">end</span>\n 90: \n 91: <span class=\"ruby-comment cmt\"># Set the request status to declined if it hasn't been set yet and</span>\n 92: <span class=\"ruby-comment cmt\"># the return value is false.</span>\n 93: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">rval</span>\n 94: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Applet returned false value. "</span> <span class=\"ruby-operator\">+</span>\n 95: <span class=\"ruby-value str\">"Setting status to DECLINED"</span>\n 96: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">status</span> = <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">DECLINED</span>\n 97: <span class=\"ruby-keyword kw\">end</span>\n 98: \n 99: <span class=\"ruby-comment cmt\"># self.log.debug "Returning %p" % [ rval ]</span>\n\ 100: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span>\n\ 101: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Dispatch the specified transaction <tt>txn</tt> to the appropriate handler based on the request‘s path_info. </p> params: ( txn ) category: Instance type: Public - methods: - visibility: protected aref: M000347 name: builtin_missing_handler sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 214</span>\n\ 214: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">builtin_missing_handler</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 215: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Using builtin missing-applet handler."</span>\n\ 216: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">false</span>\n\ 217: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> The builtin missing-applet handler routine. Returns <tt>false</tt>, which causes the dispatcher to decline the request. </p> params: ( txn, *args ) - visibility: protected aref: M000349 name: default_error_handler sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 256</span>\n\ 256: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">default_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 257: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Using builtin error handler."</span>\n\ 258: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">content_type</span> = <span class=\"ruby-value str\">"text/plain"</span>\n\ 259: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">status</span> = <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">OK</span>\n\ 260: \n\ 261: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-value str\">"Arrow Applet Error in '%s': %s\\n\\t%s"</span> <span class=\"ruby-operator\">%</span>\n\ 262: [ <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>) ]\n\ 263: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> The builtin error handler routine. Outputs a plain-text backtrace for the given exception <tt>err</tt> and <tt>applet</tt> to the given transaction <tt>txn</tt>. </p> params: ( applet, txn, err ) - visibility: protected aref: M000345 name: run_applet sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 171</span>\n\ 171: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run_applet</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">rest</span> )\n\ 172: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Running '%s' with args: %p"</span> <span class=\"ruby-operator\">%</span>\n\ 173: [ <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">rest</span> ]\n\ 174: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">run</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">rest</span> )\n\ 175: <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\ 176: <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]: Error running %s (%s): %s:\\n\\t%s"</span> <span class=\"ruby-operator\">%</span> [\n\ 177: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">serial</span>,\n\ 178: <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>,\n\ 179: <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">filename</span>,\n\ 180: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>,\n\ 181: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>),\n\ 182: ]\n\ 183: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 184: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Run the specified <tt>applet</tt> with the given <tt>txn</tt> (an <a href="Transaction.html">Arrow::Transaction</a>) and the <tt>rest</tt> of the path_info split on ’/’. </p> params: ( applet, txn, rest ) - visibility: protected aref: M000343 name: run_applet_chain sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 111</span>\n\ 111: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run_applet_chain</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">chain</span> )\n\ 112: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-node\">"Running applet chain: #{chain.inspect}"</span>\n\ 113: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>, <span class=\"ruby-value str\">"Malformed applet chain"</span> <span class=\"ruby-keyword kw\">if</span>\n\ 114: <span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">empty?</span> <span class=\"ruby-operator\">||</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">first</span>.<span class=\"ruby-identifier\">respond_to?</span>( <span class=\"ruby-identifier\">:applet</span> )\n\ 115: \n\ 116: <span class=\"ruby-identifier\">res</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 117: <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">applet_path</span>, <span class=\"ruby-identifier\">args</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">unwrap_chain_link</span>( <span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">first</span> )\n\ 118: \n\ 119: <span class=\"ruby-comment cmt\"># If there's only one item left, run it</span>\n\ 120: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">nitems</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-value\">1</span>\n\ 121: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Running final applet in chain"</span>\n\ 122: <span class=\"ruby-identifier\">res</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_applet</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">args</span> )\n\ 123: \n\ 124: <span class=\"ruby-comment cmt\"># Otherwise, delegate the transaction to the next applet with the</span>\n\ 125: <span class=\"ruby-comment cmt\"># remainder of the chain.</span>\n\ 126: <span class=\"ruby-keyword kw\">else</span>\n\ 127: <span class=\"ruby-identifier\">dchain</span> = <span class=\"ruby-identifier\">chain</span>[ <span class=\"ruby-value\">1</span><span class=\"ruby-operator\">..</span><span class=\"ruby-value\">-1</span> ]\n\ 128: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Running applet %s in chain of %d; chain = %p"</span> <span class=\"ruby-operator\">%</span>\n\ 129: [ <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">nitems</span>, <span class=\"ruby-identifier\">dchain</span> ]\n\ 130: \n\ 131: <span class=\"ruby-keyword kw\">begin</span>\n\ 132: <span class=\"ruby-identifier\">res</span> = <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">delegate</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">dchain</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> ) <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">subchain</span><span class=\"ruby-operator\">|</span>\n\ 133: <span class=\"ruby-identifier\">subchain</span> = <span class=\"ruby-identifier\">dchain</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">subchain</span>.<span class=\"ruby-identifier\">nil?</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\">"Delegated call to appletchain %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">subchain</span> ]\n\ 135: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_applet_chain</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">subchain</span> )\n\ 136: <span class=\"ruby-keyword kw\">end</span>\n\ 137: <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\ 138: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Error while executing applet chain: %p (/%s): %s:\\n\\t%s"</span> <span class=\"ruby-operator\">%</span> [\n\ 139: <span class=\"ruby-identifier\">applet</span>,\n\ 140: <span class=\"ruby-identifier\">chain</span>.<span class=\"ruby-identifier\">first</span>[<span class=\"ruby-value\">1</span>],\n\ 141: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>,\n\ 142: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>),\n\ 143: ]\n\ 144: <span class=\"ruby-identifier\">res</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 145: <span class=\"ruby-keyword kw\">end</span>\n\ 146: <span class=\"ruby-keyword kw\">end</span>\n\ 147: \n\ 148: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">res</span>\n\ 149: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Given a chain of applets built from a URI, run the +index+th one with the specified transaction (<tt>txn</tt>). Applets before the last get called via their <a href="Broker.html#M000342">#delegate</a> method, while the last one is called via #run. </p> params: ( txn, chain ) - visibility: protected aref: M000348 name: run_error_handler sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 224</span>\n\ 224: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 225: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 226: <span class=\"ruby-identifier\">handlerName</span> = <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">errorApplet</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">%r{^/}</span>, <span class=\"ruby-value str\">''</span> )\n\ 227: \n\ 228: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">handlerName</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-value str\">"(builtin)"</span> <span class=\"ruby-keyword kw\">or</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-ivar\">@registry</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">handlerName</span> )\n\ 229: <span class=\"ruby-identifier\">handler</span> = <span class=\"ruby-ivar\">@registry</span>[<span class=\"ruby-identifier\">handlerName</span>]\n\ 230: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Running error handler applet '%s' (%s)"</span> <span class=\"ruby-operator\">%</span>\n\ 231: [ <span class=\"ruby-identifier\">handler</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">handlerName</span> ]\n\ 232: \n\ 233: <span class=\"ruby-keyword kw\">begin</span>\n\ 234: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">handler</span>.<span class=\"ruby-identifier\">run</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-value str\">"report_error"</span>, <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">err</span> )\n\ 235: <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\">err2</span>\n\ 236: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Error while attempting to use custom error "</span>\\\n\ 237: <span class=\"ruby-value str\">"handler '%s': %s\\n\\t%s"</span> <span class=\"ruby-operator\">%</span> [\n\ 238: <span class=\"ruby-identifier\">handler</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>,\n\ 239: <span class=\"ruby-identifier\">err2</span>.<span class=\"ruby-identifier\">message</span>,\n\ 240: <span class=\"ruby-identifier\">err2</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>),\n\ 241: ]\n\ 242: \n\ 243: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">default_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 244: <span class=\"ruby-keyword kw\">end</span>\n\ 245: <span class=\"ruby-keyword kw\">else</span>\n\ 246: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">default_error_handler</span>( <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">err</span> )\n\ 247: <span class=\"ruby-keyword kw\">end</span>\n\ 248: \n\ 249: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span>\n\ 250: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Handle the given applet error <tt>err</tt> for the specified <tt>applet</tt>, using the given transaction <tt>txn</tt>. This will attempt to run whatever applet is configured as the error-handler, or run a builtin handler applet if none is configured or the configured one isn‘t loaded. </p> params: ( applet, txn, err ) - visibility: protected aref: M000346 name: run_missing_applet_handler sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 188</span>\n\ 188: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run_missing_applet_handler</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">uri</span> )\n\ 189: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">appletchain</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 190: <span class=\"ruby-identifier\">handlerUri</span> = <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">missingApplet</span>\n\ 191: <span class=\"ruby-identifier\">args</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">split</span>( <span class=\"ruby-regexp re\">%r{/}</span> )\n\ 192: \n\ 193: <span class=\"ruby-comment cmt\"># Build an applet chain for user-configured handlers</span>\n\ 194: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">handlerUri</span> <span class=\"ruby-operator\">!=</span> <span class=\"ruby-value str\">"(builtin)"</span>\n\ 195: <span class=\"ruby-identifier\">appletchain</span> = <span class=\"ruby-ivar\">@registry</span>.<span class=\"ruby-identifier\">find_applet_chain</span>( <span class=\"ruby-identifier\">handlerUri</span> )\n\ 196: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Configured MissingApplet handler (%s) doesn't exist"</span> <span class=\"ruby-operator\">%</span>\n\ 197: <span class=\"ruby-identifier\">handlerUri</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">appletchain</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 198: <span class=\"ruby-keyword kw\">end</span>\n\ 199: \n\ 200: <span class=\"ruby-comment cmt\"># If the user-configured handler maps to one or more handlers, run</span>\n\ 201: <span class=\"ruby-comment cmt\"># them. Otherwise, run the build-in handler.</span>\n\ 202: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">appletchain</span>.<span class=\"ruby-identifier\">nil?</span> <span class=\"ruby-operator\">||</span> <span class=\"ruby-identifier\">appletchain</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 203: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">run_applet_chain</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">appletchain</span> )\n\ 204: <span class=\"ruby-keyword kw\">else</span>\n\ 205: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">builtin_missing_handler</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 206: <span class=\"ruby-keyword kw\">end</span>\n\ 207: \n\ 208: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span>\n\ 209: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Handle requests that target an applet that doesn‘t exist. </p> params: ( txn, uri ) - visibility: protected aref: M000344 name: unwrap_chain_link sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/broker.rb, line 155</span>\n\ 155: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">unwrap_chain_link</span>( <span class=\"ruby-identifier\">link</span> )\n\ 156: <span class=\"ruby-identifier\">applet</span> = <span class=\"ruby-identifier\">link</span>.<span class=\"ruby-identifier\">applet</span> <span class=\"ruby-keyword kw\">or</span> <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletChainError</span>, <span class=\"ruby-value str\">"Null applet"</span>\n\ 157: <span class=\"ruby-identifier\">path</span> = <span class=\"ruby-identifier\">link</span>.<span class=\"ruby-identifier\">path</span> <span class=\"ruby-keyword kw\">or</span> <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletChainError</span>, <span class=\"ruby-value str\">"Null path"</span>\n\ 158: <span class=\"ruby-identifier\">args</span> = <span class=\"ruby-identifier\">link</span>.<span class=\"ruby-identifier\">args</span> <span class=\"ruby-keyword kw\">or</span> <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletChainError</span>, <span class=\"ruby-value str\">"Null argument list"</span>\n\ 159: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Array</span> )\n\ 160: <span class=\"ruby-identifier\">emsg</span> = <span class=\"ruby-value str\">"Argument list is a %s: expected an Array"</span> <span class=\"ruby-operator\">%</span>\n\ 161: <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>\n\ 162: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletChainError</span>, <span class=\"ruby-identifier\">emsg</span>\n\ 163: <span class=\"ruby-keyword kw\">end</span> \n\ 164: \n\ 165: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">applet</span>, <span class=\"ruby-identifier\">path</span>, <span class=\"ruby-identifier\">args</span>\n\ 166: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Check the specified <tt>link</tt> of an applet chain for sanity and return its constituent bits for assignment. This is necessary to provide sensible errors if a delegating app screws up a chain somehow. </p> params: ( link ) category: Instance type: Protected
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 437 $" - name: SVNId desc: |+ SVN Id value: "%q$Id: broker.rb 437 2008-03-28 00:49:20Z deveiant $" - name: FILE_SEPARATOR desc: |+ A regular expression that matches the file separator on this system value: Regexp.new( Regexp.compile(File::SEPARATOR) )
Generated with the Darkfish Rdoc Generator.