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.