An abstract base class for Arrow applets. Provides execution logic, argument-parsing/untainting/validation, and templating through an injected factory.
Set the appicon for the applet to imgfile.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 268 268: def self::appicon( imgfile ) 269: self.signature.appicon = imgfile 270: end
Set the description of the applet to desc.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 237 237: def self::applet_description( desc ) 238: self.signature.description = desc 239: end
Set the contact information for the maintainer of the applet to info.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 243 243: def self::applet_maintainer( info ) 244: self.signature.maintainer = info 245: end
Set the name of the applet to name.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 231 231: def self::applet_name( name ) 232: self.signature.name = name 233: end
Set the contact information for the maintainer of the applet to info.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 249 249: def self::applet_version( ver ) 250: self.signature.version = ver 251: end
Define an action for the applet. Transactions which include the specified name as the first directory of the uri after the one the applet is assigned to will be passed to the given block. The return value from this method is an Arrow::Applet::SigProxy which can be used to set associated values in the applet‘s Signature; see the Synopsis in lib/arrow/applet.rb for examples of how to use this.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 409 409: def self::def_action( name, &block ) 410: name = '_default' if name.to_s.empty? 411: 412: # Action must accept at least a transaction argument 413: unless block.arity.nonzero? 414: raise ScriptError, 415: "Malformed action #{name}: must accept at least one argument" 416: end 417: 418: methodName = "#{name}_action" 419: define_method( methodName, &block ) 420: SigProxy.new( name, self ) 421: end
Set the default action for the applet to action.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 255 255: def self::default_action( action ) 256: self.signature.default_action = action.to_s 257: end
Inheritance callback: register any derivative classes so they can be looked up later.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 275 275: def self::inherited( klass ) 276: @inherited_from = true 277: if defined?( @newly_loaded ) 278: @newly_loaded.push( klass ) 279: super 280: else 281: Arrow::Applet.inherited( klass ) 282: end 283: end
Have any subclasses of this class been created?
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 287 287: def self::inherited_from? 288: @inherited_from 289: end
Load any applet classes in the given file and return them. Ignores any class which has a subclass in the file unless include_base_classes is set false
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 305 305: def self::load( filename, include_base_classes=false ) 306: self.newly_loaded.clear 307: 308: # Load the applet file in an anonymous module. Any applet classes get 309: # collected via the ::inherited hook into @newly_loaded 310: Kernel.load( filename, true ) 311: 312: newderivatives = @newly_loaded.dup 313: @derivatives -= @newly_loaded 314: @derivatives.push( *@newly_loaded ) 315: 316: newderivatives.each do |applet| 317: applet.filename = filename 318: end 319: 320: unless include_base_classes 321: newderivatives.delete_if do |applet| 322: applet.inherited_from? 323: end 324: end 325: 326: return newderivatives 327: end
Signature lookup: look for either a constant or an instance variable of the class that contains the raw signature hash, and convert it to an Arrow::Applet::SignatureStruct object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 353 353: def self::make_signature 354: rawsig = nil 355: if self.instance_variables.include?( "@signature" ) 356: rawsig = self.instance_variable_get( :@signature ) 357: elsif self.constants.include?( "Signature" ) 358: rawsig = self.const_get( :Signature ) 359: elsif self.constants.include?( "SIGNATURE" ) 360: rawsig = self.const_get( :SIGNATURE ) 361: else 362: rawsig = {} 363: end 364: 365: # Backward-compatibility: Rewrite the 'vargs' member as 366: # 'validator_profiles' if 'vargs' exists and 'validator_profiles' 367: # doesn't. 'vargs' member will be deleted regardless. 368: rawsig[ :validator_profiles ] ||= rawsig.delete( :vargs ) if 369: rawsig.key?( :vargs ) 370: 371: # If the superclass has a signature, inherit values from it for 372: # pairs that are missing. 373: if self.superclass < Arrow::Applet && self.superclass.signature? 374: self.superclass.signature.each_pair do |member,value| 375: next if [:name, :description, :version].include?( member ) 376: if rawsig[member].nil? 377: rawsig[ member ] = value.dup rescue value 378: end 379: end 380: end 381: 382: # Apply sensible defaults for members that aren't defined 383: SignatureStructDefaults.each do |key,val| 384: next if rawsig[ key ] 385: case val 386: when Proc, Method 387: rawsig[ key ] = val.call( rawsig, self ) 388: when Numeric, NilClass, FalseClass, TrueClass 389: rawsig[ key ] = val 390: else 391: rawsig[ key ] = val.dup 392: end 393: end 394: 395: # Signature = Struct.new( :name, :description, :maintainer, 396: # :version, :config, :default_action, :templates, :validatorArgs, 397: # :monitors ) 398: members = SignatureStruct.members.collect {|m| m.intern} 399: return SignatureStruct.new( *rawsig.values_at(*members) ) 400: end
Method definition callback: Check newly-defined action methods for appropriate arity.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 294 294: def self::method_added( sym ) 295: if /^(\w+)_action$/.match( sym.to_s ) && 296: self.instance_method( sym ).arity.zero? 297: raise ScriptError, "Inappropriate arity for #{sym}", caller(1) 298: end 299: end
Create a new Arrow::Applet object with the specified config (an Arrow::Config object), template_factory (an Arrow::TemplateFactory object), and the uri the applet will live under in the appserver (a String).
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 436 436: def initialize( config, template_factory, uri ) 437: @config = config 438: @template_factory = template_factory 439: @uri = uri 440: 441: @signature = self.class.signature.dup 442: @run_count = 0 443: @total_utime = 0 444: @total_stime = 0 445: 446: # Make a regexp out of all public <something>_action methods 447: @actions = self.public_methods( true ). 448: select {|meth| /^(\w+)_action$/ =~ meth }. 449: collect {|meth| meth.gsub(/_action/, '') } 450: @actions_regexp = Regexp.new( "^(" + actions.join( '|' ) + ")$" ) 451: end
Return the name of the applet class after stripping off any namespace-safe prefixes.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 332 332: def self::normalized_name 333: self.name.sub( /#<Module:0x\w+>::/, '' ) 334: end
Get the applet‘s signature (an Arrow::Applet::SignatureStruct object).
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 339 339: def self::signature 340: @signature ||= make_signature() 341: end
Returns true if the applet class has a signature.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 345 345: def self::signature? 346: !self.signature.nil? 347: end
Set the path for the template specified by sym to path.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 212 212: def self::template( sym, path=nil ) 213: case sym 214: when Symbol, String 215: self.signature.templates[ sym ] = path 216: 217: when Hash 218: self.signature.templates.merge!( sym ) 219: 220: else 221: raise ArgumentError, "cannot convert %s to Symbol" % [ sym ] 222: end 223: end
Set the validator rules for the specified action.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 262 262: def self::validator( action, rules={} ) 263: self.signature.validator_profiles[ action ] = rules 264: end
The action invoked if the specified action is not explicitly defined. The default implementation will look for a template with the same key as the action, and if found, will load that and return it.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 574 574: def action_missing_action( txn, raction, *args ) 575: self.log.debug "In action_missing_action with: raction = %p, args = %p" % 576: [ raction, args ] 577: 578: if raction && @signature.templates.key?( raction.to_s.intern ) 579: self.log.debug "Using template sender default action for %s" % raction 580: txn.vargs = self.make_validator( raction, txn ) 581: tmpl = self.load_template( raction.intern ) 582: tmpl.txn = txn 583: return tmpl 584: else 585: raise Arrow::AppletError, "No such action '%s' in %s" % 586: [ raction, self.signature.name ] 587: end 588: end
Returns the average number of seconds (user + system) per run.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 604 604: def average_usage 605: return 0.0 if @run_count.zero? 606: (@total_utime + @total_stime) / @run_count.to_f 607: end
Returns true if the receiver has a #delegate method that is inherited from somewhere other than the base Arrow::Applet class.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 565 565: def delegable? 566: return self.method(:delegate).to_s !~ /\(Arrow::Applet\)/ 567: end
Wrapper method for a delegation (chained) request.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 558 558: def delegate( txn, chain, *args ) 559: yield( chain ) 560: end
Return a human-readable String representing the applet.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 592 592: def inspect 593: "<%s:0x%08x: %s [%s/%s]>" % [ 594: self.class.name, 595: self.object_id * 2, 596: @signature.name, 597: @signature.version, 598: @signature.maintainer 599: ] 600: end
Given an action name (or nil for the default action), return a Method for the action method which should be invoked on the specified txn.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 537 537: def lookup_action_method( txn, action, *args ) 538: self.log.debug "Mapping %s( %p ) to an action" % [ action, args ] 539: 540: # Look up the Method object that needs to be called 541: if (( match = @actions_regexp.match(action.to_s) )) 542: action = match.captures[0] 543: action.untaint 544: self.log.debug "Matched action = #{action}" 545: else 546: self.log.info "Couldn't find specified action %p. "\ 547: "Defaulting to the 'action_missing' action." % action 548: args.unshift( action ) 549: action = "action_missing" 550: end 551: 552: return self.method( "#{action}_action" ), *args 553: end
Run the specified action for the given txn and the specified args.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 485 485: def run( txn, action=nil, *args ) 486: starttimes = Process.times 487: self.log.debug "Running %s" % [ self.signature.name ] 488: 489: action = nil if action.to_s.empty? 490: action ||= @signature.default_action or 491: raise Arrow::AppletError, "Missing default handler '#{default}'" 492: 493: # Do any initial preparation of the transaction that can be factored out 494: # of all the actions. 495: self.prep_transaction( txn ) 496: meth, *args = self.lookup_action_method( txn, action, *args ) 497: self.log.debug "Action method is: %p" % [meth] 498: txn.vargs = self.make_validator( action, txn ) 499: 500: # Now either pass control to the block, if given, or invoke the 501: # action 502: if block_given? 503: self.log.debug "Yielding to passed block" 504: rval = yield( meth, txn, *args ) 505: else 506: self.log.debug "Applet action arity: %d; args = %p" % 507: [ meth.arity, args ] 508: 509: # Invoke the action with the right number of arguments. 510: if meth.arity < 0 511: rval = meth.call( txn, *args ) 512: elsif meth.arity >= 1 513: args.unshift( txn ) 514: until args.length >= meth.arity do args << nil end 515: rval = meth.call( *(args[0, meth.arity]) ) 516: else 517: raise Arrow::AppletError, 518: "Malformed action: Must accept at least a transaction argument" 519: end 520: end 521: 522: # Calculate CPU times 523: runtimes = Process.times 524: @run_count += 1 525: @total_utime += utime = (runtimes.utime - starttimes.utime) 526: @total_stime += stime = (runtimes.stime - starttimes.stime) 527: self.log.info \ 528: "[PID %d] Runcount: %d, User: %0.2f/%0.2f, System: %0.2f/%0.2f" % 529: [ Process.pid, @run_count, utime, @total_utime, stime, @total_stime ] 530: 531: return rval 532: end
Return the validator profile that corresponds to the action which will be executed by the specified txn. Returns the default profile if no more-specific one is available.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 661 661: def get_validator_profile_for_action( action, txn ) 662: if action.to_s =~ /^(\w+)$/ 663: action = $1 664: action.untaint 665: else 666: self.log.warning "Invalid action '#{action.inspect}'" 667: action = :__default__ 668: end 669: 670: # Look up the profile for the applet or the default one 671: profile = @signature.validator_profiles[ action.to_sym ] || 672: @signature.validator_profiles[ :__default__ ] 673: 674: if profile.nil? 675: self.log.warning "No validator for #{action}, and no __default__. "\ 676: "Returning nil validator." 677: return nil 678: end 679: 680: return profile 681: end
Load and return the template associated with the given key according to the applet‘s signature. Returns nil if no such template exists.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 644 644: def load_template( key ) 645: 646: tname = @signature.templates[key] or 647: raise Arrow::AppletError, 648: "No such template %p defined in the signature for %s (%s)" % 649: [ key, self.signature.name, self.class.filename ] 650: 651: tname.untaint 652: 653: return @template_factory.get_template( tname ) 654: end
Create a FormValidator object for the specified action which has been given the arguments from the given txn.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 686 686: def make_validator( action, txn ) 687: profile = self.get_validator_profile_for_action( action, txn ) or 688: return nil 689: 690: # Create a new validator object, map the request args into a regular 691: # hash, and then send them to the validaator with the applicable profile 692: self.log.debug "Creating form validator for profile: %p" % profile 693: 694: params = {} 695: 696: # Only try to parse form parameters if there's a form 697: if txn.form_request? 698: txn.request.paramtable.each do |key,val| 699: # Multi-valued vs. single params 700: params[key] = val.to_a.length > 1 ? val.to_a : val.to_s 701: end 702: end 703: validator = Arrow::FormValidator.new( profile, params ) 704: 705: self.log.debug "Validator: %p" % validator 706: return validator 707: end
Prepares the transaction (txn) for applet execution. By default, this method sets the content type of the response to ‘text/html’ and turns off buffering for the header.
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 636 636: def prep_transaction( txn ) 637: txn.request.content_type = "text/html" 638: txn.request.sync_header = true 639: end
Run an action with a duped transaction (e.g., from another action)
# File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 615 615: def subrun( action, txn, *args ) 616: action, txn = txn, action if action.is_a?( Arrow::Transaction ) 617: self.log.debug "Running subordinate action '%s' from '%s'" % 618: [ action, caller[0] ] 619: 620: # Make sure the transaction has stuff loaded. This is necessary when 621: # #subrun is called without going through #run first (e.g., via 622: # #delegate) 623: if txn.vargs.nil? 624: self.prep_transaction( txn ) 625: txn.vargs = self.make_validator( action, txn ) 626: end 627: 628: meth, *args = self.lookup_action_method( txn, action, *args ) 629: return meth.call( txn, *args ) 630: end
--- SEC00016
--- ""
--- | Class <a href="Applet/SigProxy.html" class="link">Arrow::Applet::SigProxy</a><br />
--- - name: actions rw: R a_desc: |+ The list of all valid actions on the applet - name: config rw: RW a_desc: |+ The <a href="Config.html">Arrow::Config</a> object which contains the system‘s configuration. - name: derivatives rw: R a_desc: |+ The Array of loaded applet classes (derivatives) - name: filename rw: RW a_desc: |+ The file containing the applet‘s class definition - name: newly_loaded rw: R a_desc: |+ The Array of applet classes that were loaded by the most recent call to .<a href="Applet.html#M000563">load</a>. - name: run_count rw: R a_desc: |+ The number of times this particular applet object has been <a href="Applet.html#M000570">run</a> - name: signature rw: R a_desc: |+ The Struct that contains the configuration values for this applet - name: template_factory rw: R a_desc: |+ The <a href="TemplateFactory.html">Arrow::TemplateFactory</a> object used to <a href="Applet.html#M000563">load</a> templates for the applet. - name: total_stime rw: R a_desc: |+ The number of system seconds spent in this applet‘s <a href="Applet.html#M000570">#run</a> method. - name: total_utime rw: R a_desc: |+ The number of user seconds spent in this applet‘s <a href="Applet.html#M000570">#run</a> method. - name: uri rw: R a_desc: |+ The URI the applet answers to
--- - methods: - visibility: public aref: M000559 name: appicon sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 268</span>\n\ 268: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">appicon</span>( <span class=\"ruby-identifier\">imgfile</span> )\n\ 269: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">appicon</span> = <span class=\"ruby-identifier\">imgfile</span>\n\ 270: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the <a href="Applet.html#M000559">appicon</a> for the applet to <tt>imgfile</tt>. </p> params: ( imgfile ) - visibility: public aref: M000554 name: applet_description sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 237</span>\n\ 237: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_description</span>( <span class=\"ruby-identifier\">desc</span> )\n\ 238: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">description</span> = <span class=\"ruby-identifier\">desc</span> \n\ 239: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the description of the applet to <tt>desc</tt>. </p> params: ( desc ) - visibility: public aref: M000555 name: applet_maintainer sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 243</span>\n\ 243: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_maintainer</span>( <span class=\"ruby-identifier\">info</span> )\n\ 244: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">maintainer</span> = <span class=\"ruby-identifier\">info</span>\n\ 245: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the contact information for the maintainer of the applet to <tt>info</tt>. </p> params: ( info ) - visibility: public aref: M000553 name: applet_name sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 231</span>\n\ 231: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_name</span>( <span class=\"ruby-identifier\">name</span> )\n\ 232: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> = <span class=\"ruby-identifier\">name</span>\n\ 233: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the name of the applet to <tt>name</tt>. </p> params: ( name ) - visibility: public aref: M000556 name: applet_version sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 249</span>\n\ 249: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_version</span>( <span class=\"ruby-identifier\">ver</span> )\n\ 250: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">version</span> = <span class=\"ruby-identifier\">ver</span>\n\ 251: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the contact information for the maintainer of the applet to <tt>info</tt>. </p> params: ( ver ) - visibility: public aref: M000568 name: def_action sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 409</span>\n\ 409: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">def_action</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">block</span> )\n\ 410: <span class=\"ruby-identifier\">name</span> = <span class=\"ruby-value str\">'_default'</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 411: \n\ 412: <span class=\"ruby-comment cmt\"># Action must accept at least a transaction argument</span>\n\ 413: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">block</span>.<span class=\"ruby-identifier\">arity</span>.<span class=\"ruby-identifier\">nonzero?</span>\n\ 414: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ScriptError</span>,\n\ 415: <span class=\"ruby-node\">"Malformed action #{name}: must accept at least one argument"</span>\n\ 416: <span class=\"ruby-keyword kw\">end</span>\n\ 417: \n\ 418: <span class=\"ruby-identifier\">methodName</span> = <span class=\"ruby-node\">"#{name}_action"</span>\n\ 419: <span class=\"ruby-identifier\">define_method</span>( <span class=\"ruby-identifier\">methodName</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">block</span> )\n\ 420: <span class=\"ruby-constant\">SigProxy</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-keyword kw\">self</span> )\n\ 421: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Define an action for the applet. Transactions which include the specified <tt>name</tt> as the first directory of the uri after the one the applet is assigned to will be passed to the given <tt>block</tt>. The return value from this method is an <a href="Applet/SigProxy.html">Arrow::Applet::SigProxy</a> which can be used to set associated values in the applet‘s Signature; see the Synopsis in lib/arrow/applet.rb for examples of how to use this. </p> params: ( name, &block ) - visibility: public aref: M000557 name: default_action sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 255</span>\n\ 255: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">default_action</span>( <span class=\"ruby-identifier\">action</span> )\n\ 256: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">default_action</span> = <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 257: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the default action for the applet to <tt>action</tt>. </p> params: ( action ) - visibility: public aref: M000560 name: inherited sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 275</span>\n\ 275: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">inherited</span>( <span class=\"ruby-identifier\">klass</span> )\n\ 276: <span class=\"ruby-ivar\">@inherited_from</span> = <span class=\"ruby-keyword kw\">true</span>\n\ 277: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">defined?</span>( <span class=\"ruby-ivar\">@newly_loaded</span> )\n\ 278: <span class=\"ruby-ivar\">@newly_loaded</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">klass</span> )\n\ 279: <span class=\"ruby-keyword kw\">super</span>\n\ 280: <span class=\"ruby-keyword kw\">else</span>\n\ 281: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Applet</span>.<span class=\"ruby-identifier\">inherited</span>( <span class=\"ruby-identifier\">klass</span> )\n\ 282: <span class=\"ruby-keyword kw\">end</span>\n\ 283: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Inheritance callback: register any derivative classes so they can be looked up later. </p> params: ( klass ) - visibility: public aref: M000561 name: inherited_from? sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 287</span>\n\ 287: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">inherited_from?</span>\n\ 288: <span class=\"ruby-ivar\">@inherited_from</span>\n\ 289: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Have any subclasses of this class been created? </p> params: () - visibility: public aref: M000563 name: load sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 305</span>\n\ 305: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">filename</span>, <span class=\"ruby-identifier\">include_base_classes</span>=<span class=\"ruby-keyword kw\">false</span> )\n\ 306: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">newly_loaded</span>.<span class=\"ruby-identifier\">clear</span>\n\ 307: \n\ 308: <span class=\"ruby-comment cmt\"># Load the applet file in an anonymous module. Any applet classes get</span>\n\ 309: <span class=\"ruby-comment cmt\"># collected via the ::inherited hook into @newly_loaded</span>\n\ 310: <span class=\"ruby-constant\">Kernel</span>.<span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">filename</span>, <span class=\"ruby-keyword kw\">true</span> )\n\ 311: \n\ 312: <span class=\"ruby-identifier\">newderivatives</span> = <span class=\"ruby-ivar\">@newly_loaded</span>.<span class=\"ruby-identifier\">dup</span>\n\ 313: <span class=\"ruby-ivar\">@derivatives</span> <span class=\"ruby-operator\">-=</span> <span class=\"ruby-ivar\">@newly_loaded</span>\n\ 314: <span class=\"ruby-ivar\">@derivatives</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-ivar\">@newly_loaded</span> )\n\ 315: \n\ 316: <span class=\"ruby-identifier\">newderivatives</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">applet</span><span class=\"ruby-operator\">|</span>\n\ 317: <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">filename</span> = <span class=\"ruby-identifier\">filename</span>\n\ 318: <span class=\"ruby-keyword kw\">end</span>\n\ 319: \n\ 320: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">include_base_classes</span>\n\ 321: <span class=\"ruby-identifier\">newderivatives</span>.<span class=\"ruby-identifier\">delete_if</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">applet</span><span class=\"ruby-operator\">|</span>\n\ 322: <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">inherited_from?</span>\n\ 323: <span class=\"ruby-keyword kw\">end</span>\n\ 324: <span class=\"ruby-keyword kw\">end</span>\n\ 325: \n\ 326: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">newderivatives</span>\n\ 327: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Load any applet classes in the given file and return them. Ignores any class which has a subclass in the file unless <tt>include_base_classes</tt> is set false </p> params: ( filename, include_base_classes=false ) - visibility: public aref: M000567 name: make_signature sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 353</span>\n\ 353: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">make_signature</span>\n\ 354: <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 355: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_variables</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">"@signature"</span> )\n\ 356: <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_variable_get</span>( <span class=\"ruby-identifier\">:@signature</span> )\n\ 357: <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">constants</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">"Signature"</span> )\n\ 358: <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">const_get</span>( <span class=\"ruby-identifier\">:Signature</span> )\n\ 359: <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">constants</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">"SIGNATURE"</span> )\n\ 360: <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">const_get</span>( <span class=\"ruby-identifier\">:SIGNATURE</span> )\n\ 361: <span class=\"ruby-keyword kw\">else</span>\n\ 362: <span class=\"ruby-identifier\">rawsig</span> = {}\n\ 363: <span class=\"ruby-keyword kw\">end</span>\n\ 364: \n\ 365: <span class=\"ruby-comment cmt\"># Backward-compatibility: Rewrite the 'vargs' member as</span>\n\ 366: <span class=\"ruby-comment cmt\"># 'validator_profiles' if 'vargs' exists and 'validator_profiles'</span>\n\ 367: <span class=\"ruby-comment cmt\"># doesn't. 'vargs' member will be deleted regardless.</span>\n\ 368: <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">:validator_profiles</span> ] <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">:vargs</span> ) <span class=\"ruby-keyword kw\">if</span>\n\ 369: <span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">:vargs</span> )\n\ 370: \n\ 371: <span class=\"ruby-comment cmt\"># If the superclass has a signature, inherit values from it for</span>\n\ 372: <span class=\"ruby-comment cmt\"># pairs that are missing.</span>\n\ 373: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span> <span class=\"ruby-operator\"><</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Applet</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span>.<span class=\"ruby-identifier\">signature?</span>\n\ 374: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">each_pair</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">member</span>,<span class=\"ruby-identifier\">value</span><span class=\"ruby-operator\">|</span>\n\ 375: <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">if</span> [<span class=\"ruby-identifier\">:name</span>, <span class=\"ruby-identifier\">:description</span>, <span class=\"ruby-identifier\">:version</span>].<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-identifier\">member</span> )\n\ 376: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">rawsig</span>[<span class=\"ruby-identifier\">member</span>].<span class=\"ruby-identifier\">nil?</span>\n\ 377: <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">member</span> ] = <span class=\"ruby-identifier\">value</span>.<span class=\"ruby-identifier\">dup</span> <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-identifier\">value</span>\n\ 378: <span class=\"ruby-keyword kw\">end</span>\n\ 379: <span class=\"ruby-keyword kw\">end</span>\n\ 380: <span class=\"ruby-keyword kw\">end</span>\n\ 381: \n\ 382: <span class=\"ruby-comment cmt\"># Apply sensible defaults for members that aren't defined</span>\n\ 383: <span class=\"ruby-constant\">SignatureStructDefaults</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>,<span class=\"ruby-identifier\">val</span><span class=\"ruby-operator\">|</span>\n\ 384: <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ]\n\ 385: <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">val</span>\n\ 386: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Proc</span>, <span class=\"ruby-constant\">Method</span>\n\ 387: <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">rawsig</span>, <span class=\"ruby-keyword kw\">self</span> )\n\ 388: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Numeric</span>, <span class=\"ruby-constant\">NilClass</span>, <span class=\"ruby-constant\">FalseClass</span>, <span class=\"ruby-constant\">TrueClass</span>\n\ 389: <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>\n\ 390: <span class=\"ruby-keyword kw\">else</span>\n\ 391: <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">dup</span>\n\ 392: <span class=\"ruby-keyword kw\">end</span>\n\ 393: <span class=\"ruby-keyword kw\">end</span>\n\ 394: \n\ 395: <span class=\"ruby-comment cmt\"># Signature = Struct.new( :name, :description, :maintainer,</span>\n\ 396: <span class=\"ruby-comment cmt\"># :version, :config, :default_action, :templates, :validatorArgs,</span>\n\ 397: <span class=\"ruby-comment cmt\"># :monitors )</span>\n\ 398: <span class=\"ruby-identifier\">members</span> = <span class=\"ruby-constant\">SignatureStruct</span>.<span class=\"ruby-identifier\">members</span>.<span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">m</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">m</span>.<span class=\"ruby-identifier\">intern</span>}\n\ 399: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">SignatureStruct</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">values_at</span>(<span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">members</span>) )\n\ 400: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Signature lookup: look for either a constant or an instance variable of the class that contains the raw <a href="Applet.html#M000565">signature</a> hash, and convert it to an Arrow::Applet::SignatureStruct object. </p> params: () - visibility: public aref: M000562 name: method_added sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 294</span>\n\ 294: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">method_added</span>( <span class=\"ruby-identifier\">sym</span> )\n\ 295: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-regexp re\">/^(\\w+)_action$/</span>.<span class=\"ruby-identifier\">match</span>( <span class=\"ruby-identifier\">sym</span>.<span class=\"ruby-identifier\">to_s</span> ) <span class=\"ruby-operator\">&&</span>\n\ 296: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_method</span>( <span class=\"ruby-identifier\">sym</span> ).<span class=\"ruby-identifier\">arity</span>.<span class=\"ruby-identifier\">zero?</span>\n\ 297: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ScriptError</span>, <span class=\"ruby-node\">"Inappropriate arity for #{sym}"</span>, <span class=\"ruby-identifier\">caller</span>(<span class=\"ruby-value\">1</span>)\n\ 298: <span class=\"ruby-keyword kw\">end</span>\n\ 299: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Method definition callback: Check newly-defined action methods for appropriate arity. </p> params: ( sym ) - visibility: public aref: M000569 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 436</span>\n\ 436: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span>, <span class=\"ruby-identifier\">template_factory</span>, <span class=\"ruby-identifier\">uri</span> )\n\ 437: <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\ 438: <span class=\"ruby-ivar\">@template_factory</span> = <span class=\"ruby-identifier\">template_factory</span>\n\ 439: <span class=\"ruby-ivar\">@uri</span> = <span class=\"ruby-identifier\">uri</span>\n\ 440: \n\ 441: <span class=\"ruby-ivar\">@signature</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">dup</span>\n\ 442: <span class=\"ruby-ivar\">@run_count</span> = <span class=\"ruby-value\">0</span>\n\ 443: <span class=\"ruby-ivar\">@total_utime</span> = <span class=\"ruby-value\">0</span>\n\ 444: <span class=\"ruby-ivar\">@total_stime</span> = <span class=\"ruby-value\">0</span>\n\ 445: \n\ 446: <span class=\"ruby-comment cmt\"># Make a regexp out of all public <something>_action methods</span>\n\ 447: <span class=\"ruby-ivar\">@actions</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">public_methods</span>( <span class=\"ruby-keyword kw\">true</span> ).\n\ 448: <span class=\"ruby-identifier\">select</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">meth</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-regexp re\">/^(\\w+)_action$/</span> <span class=\"ruby-operator\">=~</span> <span class=\"ruby-identifier\">meth</span> }.\n\ 449: <span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">meth</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">gsub</span>(<span class=\"ruby-regexp re\">/_action/</span>, <span class=\"ruby-value str\">''</span>) }\n\ 450: <span class=\"ruby-ivar\">@actions_regexp</span> = <span class=\"ruby-constant\">Regexp</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-value str\">"^("</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">actions</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-value str\">'|'</span> ) <span class=\"ruby-operator\">+</span> <span class=\"ruby-value str\">")$"</span> )\n\ 451: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="Applet.html#M000569">new</a> <a href="Applet.html">Arrow::Applet</a> object with the specified <tt>config</tt> (an <a href="Config.html">Arrow::Config</a> object), <tt>template_factory</tt> (an <a href="TemplateFactory.html">Arrow::TemplateFactory</a> object), and the <tt>uri</tt> the applet will live under in the appserver (a String). </p> params: ( config, template_factory, uri ) - visibility: public aref: M000564 name: normalized_name sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 332</span>\n\ 332: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">normalized_name</span>\n\ 333: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">/#<Module:0x\\w+>::/</span>, <span class=\"ruby-value str\">''</span> )\n\ 334: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the name of the applet class after stripping off any namespace-safe prefixes. </p> params: () - visibility: public aref: M000565 name: signature sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 339</span>\n\ 339: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">signature</span>\n\ 340: <span class=\"ruby-ivar\">@signature</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">make_signature</span>()\n\ 341: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Get the applet‘s <a href="Applet.html#M000565">signature</a> (an Arrow::Applet::SignatureStruct object). </p> params: () - visibility: public aref: M000566 name: signature? sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 345</span>\n\ 345: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">signature?</span>\n\ 346: <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 347: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Returns <tt>true</tt> if the applet class has a <a href="Applet.html#M000565">signature</a>. </p> params: () - visibility: public aref: M000552 name: template sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 212</span>\n\ 212: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">template</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-identifier\">path</span>=<span class=\"ruby-keyword kw\">nil</span> )\n\ 213: <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">sym</span>\n\ 214: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Symbol</span>, <span class=\"ruby-constant\">String</span>\n\ 215: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">templates</span>[ <span class=\"ruby-identifier\">sym</span> ] = <span class=\"ruby-identifier\">path</span>\n\ 216: \n\ 217: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Hash</span>\n\ 218: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">merge!</span>( <span class=\"ruby-identifier\">sym</span> )\n\ 219: \n\ 220: <span class=\"ruby-keyword kw\">else</span>\n\ 221: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ArgumentError</span>, <span class=\"ruby-value str\">"cannot convert %s to Symbol"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">sym</span> ]\n\ 222: <span class=\"ruby-keyword kw\">end</span>\n\ 223: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the path for the <a href="Applet.html#M000552">template</a> specified by <tt>sym</tt> to <tt>path</tt>. </p> params: ( sym, path=nil ) - visibility: public aref: M000558 name: validator sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 262</span>\n\ 262: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">rules</span>={} )\n\ 263: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">action</span> ] = <span class=\"ruby-identifier\">rules</span>\n\ 264: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set the <a href="Applet.html#M000558">validator</a> <tt>rules</tt> for the specified <tt>action</tt>. </p> params: ( action, rules={} ) category: Class type: Public - methods: - visibility: public aref: M000575 name: action_missing_action sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 574</span>\n\ 574: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">action_missing_action</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 575: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"In action_missing_action with: raction = %p, args = %p"</span> <span class=\"ruby-operator\">%</span>\n\ 576: [ <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-identifier\">args</span> ]\n\ 577: \n\ 578: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">raction</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">raction</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">intern</span> )\n\ 579: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Using template sender default action for %s"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">raction</span>\n\ 580: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-identifier\">txn</span> )\n\ 581: <span class=\"ruby-identifier\">tmpl</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_template</span>( <span class=\"ruby-identifier\">raction</span>.<span class=\"ruby-identifier\">intern</span> )\n\ 582: <span class=\"ruby-identifier\">tmpl</span>.<span class=\"ruby-identifier\">txn</span> = <span class=\"ruby-identifier\">txn</span>\n\ 583: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">tmpl</span>\n\ 584: <span class=\"ruby-keyword kw\">else</span>\n\ 585: <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\">"No such action '%s' in %s"</span> <span class=\"ruby-operator\">%</span>\n\ 586: [ <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> ]\n\ 587: <span class=\"ruby-keyword kw\">end</span>\n\ 588: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> The action invoked if the specified action is not explicitly defined. The default implementation will look for a <a href="Applet.html#M000552">template</a> with the same key as the action, and if found, will <a href="Applet.html#M000563">load</a> that and return it. </p> params: ( txn, raction, *args ) - visibility: public aref: M000577 name: average_usage sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 604</span>\n\ 604: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">average_usage</span>\n\ 605: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-value\">0</span><span class=\"ruby-value\">.0</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@run_count</span>.<span class=\"ruby-identifier\">zero?</span>\n\ 606: (<span class=\"ruby-ivar\">@total_utime</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-ivar\">@total_stime</span>) <span class=\"ruby-operator\">/</span> <span class=\"ruby-ivar\">@run_count</span>.<span class=\"ruby-identifier\">to_f</span>\n\ 607: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Returns the average number of seconds (user + system) per <a href="Applet.html#M000570">run</a>. </p> params: () - visibility: public aref: M000574 name: chainable? m_desc: |- <p> Alias for #delegable? </p> params: () - visibility: public aref: M000573 name: delegable? sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 565</span>\n\ 565: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">delegable?</span>\n\ 566: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">method</span>(<span class=\"ruby-identifier\">:delegate</span>).<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-operator\">!~</span> <span class=\"ruby-regexp re\">/\\(Arrow::Applet\\)/</span>\n\ 567: <span class=\"ruby-keyword kw\">end</span>" aka: - aref: Applet.html#M000574 name: chainable? m_desc: |- <p> Returns <tt>true</tt> if the receiver has a <a href="Applet.html#M000572">#delegate</a> method that is <a href="Applet.html#M000560">inherited</a> from somewhere other than the base <a href="Applet.html">Arrow::Applet</a> class. </p> params: () - visibility: public aref: M000572 name: delegate sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 558</span>\n\ 558: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">delegate</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">chain</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 559: <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-identifier\">chain</span> )\n\ 560: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Wrapper method for a delegation (chained) request. </p> params: ( txn, chain, *args ) {|chain| ...} - visibility: public aref: M000576 name: inspect sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 592</span>\n\ 592: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">inspect</span>\n\ 593: <span class=\"ruby-value str\">"<%s:0x%08x: %s [%s/%s]>"</span> <span class=\"ruby-operator\">%</span> [\n\ 594: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>,\n\ 595: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">object_id</span> <span class=\"ruby-operator\">*</span> <span class=\"ruby-value\">2</span>,\n\ 596: <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">name</span>,\n\ 597: <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">version</span>,\n\ 598: <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">maintainer</span>\n\ 599: ]\n\ 600: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a human-readable String representing the applet. </p> params: () - visibility: public aref: M000571 name: lookup_action_method sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 537</span>\n\ 537: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 538: <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 %s( %p ) to an action"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">args</span> ]\n\ 539: \n\ 540: <span class=\"ruby-comment cmt\"># Look up the Method object that needs to be called</span>\n\ 541: <span class=\"ruby-keyword kw\">if</span> (( <span class=\"ruby-identifier\">match</span> = <span class=\"ruby-ivar\">@actions_regexp</span>.<span class=\"ruby-identifier\">match</span>(<span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>) ))\n\ 542: <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">match</span>.<span class=\"ruby-identifier\">captures</span>[<span class=\"ruby-value\">0</span>]\n\ 543: <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">untaint</span>\n\ 544: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-node\">"Matched action = #{action}"</span>\n\ 545: <span class=\"ruby-keyword kw\">else</span>\n\ 546: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"Couldn't find specified action %p. "</span>\\\n\ 547: <span class=\"ruby-value str\">"Defaulting to the 'action_missing' action."</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">action</span>\n\ 548: <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">unshift</span>( <span class=\"ruby-identifier\">action</span> )\n\ 549: <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-value str\">"action_missing"</span>\n\ 550: <span class=\"ruby-keyword kw\">end</span>\n\ 551: \n\ 552: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">method</span>( <span class=\"ruby-node\">"#{action}_action"</span> ), <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span>\n\ 553: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Given an <tt>action</tt> name (or <tt>nil</tt> for the default action), return a Method for the action method which should be invoked on the specified <tt>txn</tt>. </p> params: ( txn, action, *args ) - visibility: public aref: M000570 name: run sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 485</span>\n\ 485: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>=<span class=\"ruby-keyword kw\">nil</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 486: <span class=\"ruby-identifier\">starttimes</span> = <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">times</span>\n\ 487: <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"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> ]\n\ 488: \n\ 489: <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">empty?</span>\n\ 490: <span class=\"ruby-identifier\">action</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">default_action</span> <span class=\"ruby-keyword kw\">or</span>\n\ 491: <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-node\">"Missing default handler '#{default}'"</span>\n\ 492: \n\ 493: <span class=\"ruby-comment cmt\"># Do any initial preparation of the transaction that can be factored out</span>\n\ 494: <span class=\"ruby-comment cmt\"># of all the actions.</span>\n\ 495: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\ 496: <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 497: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Action method is: %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">meth</span>]\n\ 498: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\ 499: \n\ 500: <span class=\"ruby-comment cmt\"># Now either pass control to the block, if given, or invoke the</span>\n\ 501: <span class=\"ruby-comment cmt\"># action</span>\n\ 502: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">block_given?</span>\n\ 503: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Yielding to passed block"</span>\n\ 504: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 505: <span class=\"ruby-keyword kw\">else</span>\n\ 506: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Applet action arity: %d; args = %p"</span> <span class=\"ruby-operator\">%</span>\n\ 507: [ <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span>, <span class=\"ruby-identifier\">args</span> ]\n\ 508: \n\ 509: <span class=\"ruby-comment cmt\"># Invoke the action with the right number of arguments.</span>\n\ 510: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-operator\"><</span> <span class=\"ruby-value\">0</span>\n\ 511: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 512: <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-operator\">>=</span> <span class=\"ruby-value\">1</span>\n\ 513: <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">unshift</span>( <span class=\"ruby-identifier\">txn</span> )\n\ 514: <span class=\"ruby-keyword kw\">until</span> <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">>=</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-identifier\">args</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-keyword kw\">end</span>\n\ 515: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-operator\">*</span>(<span class=\"ruby-identifier\">args</span>[<span class=\"ruby-value\">0</span>, <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span>]) )\n\ 516: <span class=\"ruby-keyword kw\">else</span>\n\ 517: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>,\n\ 518: <span class=\"ruby-value str\">"Malformed action: Must accept at least a transaction argument"</span>\n\ 519: <span class=\"ruby-keyword kw\">end</span>\n\ 520: <span class=\"ruby-keyword kw\">end</span>\n\ 521: \n\ 522: <span class=\"ruby-comment cmt\"># Calculate CPU times</span>\n\ 523: <span class=\"ruby-identifier\">runtimes</span> = <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">times</span>\n\ 524: <span class=\"ruby-ivar\">@run_count</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-value\">1</span>\n\ 525: <span class=\"ruby-ivar\">@total_utime</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">utime</span> = (<span class=\"ruby-identifier\">runtimes</span>.<span class=\"ruby-identifier\">utime</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">starttimes</span>.<span class=\"ruby-identifier\">utime</span>)\n\ 526: <span class=\"ruby-ivar\">@total_stime</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">stime</span> = (<span class=\"ruby-identifier\">runtimes</span>.<span class=\"ruby-identifier\">stime</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">starttimes</span>.<span class=\"ruby-identifier\">stime</span>)\n\ 527: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> \\\n\ 528: <span class=\"ruby-value str\">"[PID %d] Runcount: %d, User: %0.2f/%0.2f, System: %0.2f/%0.2f"</span> <span class=\"ruby-operator\">%</span>\n\ 529: [ <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">pid</span>, <span class=\"ruby-ivar\">@run_count</span>, <span class=\"ruby-identifier\">utime</span>, <span class=\"ruby-ivar\">@total_utime</span>, <span class=\"ruby-identifier\">stime</span>, <span class=\"ruby-ivar\">@total_stime</span> ]\n\ 530: \n\ 531: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span>\n\ 532: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Run the specified <tt>action</tt> for the given <tt>txn</tt> and the specified <tt>args</tt>. </p> params: ( txn, action=nil, *args ) {|meth, txn, *args| ...} category: Instance type: Public - methods: - visibility: protected aref: M000582 name: get_validator_profile_for_action sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 661</span>\n\ 661: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">get_validator_profile_for_action</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\ 662: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-operator\">=~</span> <span class=\"ruby-regexp re\">/^(\\w+)$/</span>\n\ 663: <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">$1</span>\n\ 664: <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">untaint</span>\n\ 665: <span class=\"ruby-keyword kw\">else</span>\n\ 666: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-node\">"Invalid action '#{action.inspect}'"</span>\n\ 667: <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">:__default__</span>\n\ 668: <span class=\"ruby-keyword kw\">end</span>\n\ 669: \n\ 670: <span class=\"ruby-comment cmt\"># Look up the profile for the applet or the default one</span>\n\ 671: <span class=\"ruby-identifier\">profile</span> = <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_sym</span> ] <span class=\"ruby-operator\">||</span>\n\ 672: <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">:__default__</span> ]\n\ 673: \n\ 674: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">profile</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 675: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-node\">"No validator for #{action}, and no __default__. "</span>\\\n\ 676: <span class=\"ruby-value str\">"Returning nil validator."</span>\n\ 677: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\ 678: <span class=\"ruby-keyword kw\">end</span>\n\ 679: \n\ 680: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">profile</span>\n\ 681: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return the <a href="Applet.html#M000558">validator</a> profile that corresponds to the <tt>action</tt> which will be executed by the specified <tt>txn</tt>. Returns the <em>default</em> profile if no more-specific one is available. </p> params: ( action, txn ) - visibility: protected aref: M000580 name: load_template sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 644</span>\n\ 644: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_template</span>( <span class=\"ruby-identifier\">key</span> )\n\ 645: \n\ 646: <span class=\"ruby-identifier\">tname</span> = <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">templates</span>[<span class=\"ruby-identifier\">key</span>] <span class=\"ruby-keyword kw\">or</span>\n\ 647: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>, \n\ 648: <span class=\"ruby-value str\">"No such template %p defined in the signature for %s (%s)"</span> <span class=\"ruby-operator\">%</span>\n\ 649: [ <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">filename</span> ]\n\ 650: \n\ 651: <span class=\"ruby-identifier\">tname</span>.<span class=\"ruby-identifier\">untaint</span>\n\ 652: \n\ 653: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@template_factory</span>.<span class=\"ruby-identifier\">get_template</span>( <span class=\"ruby-identifier\">tname</span> )\n\ 654: <span class=\"ruby-keyword kw\">end</span>" aka: - aref: Applet.html#M000581 name: template m_desc: |- <p> Load and return the <a href="Applet.html#M000552">template</a> associated with the given <tt>key</tt> according to the applet‘s <a href="Applet.html#M000565">signature</a>. Returns <tt>nil</tt> if no such <a href="Applet.html#M000552">template</a> exists. </p> params: ( key ) - visibility: protected aref: M000583 name: make_validator sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 686</span>\n\ 686: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\ 687: <span class=\"ruby-identifier\">profile</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">get_validator_profile_for_action</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> ) <span class=\"ruby-keyword kw\">or</span>\n\ 688: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\ 689: \n\ 690: <span class=\"ruby-comment cmt\"># Create a new validator object, map the request args into a regular</span>\n\ 691: <span class=\"ruby-comment cmt\"># hash, and then send them to the validaator with the applicable profile</span>\n\ 692: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Creating form validator for profile: %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">profile</span>\n\ 693: \n\ 694: <span class=\"ruby-identifier\">params</span> = {}\n\ 695: \n\ 696: <span class=\"ruby-comment cmt\"># Only try to parse form parameters if there's a form</span>\n\ 697: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">form_request?</span>\n\ 698: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">paramtable</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>,<span class=\"ruby-identifier\">val</span><span class=\"ruby-operator\">|</span>\n\ 699: <span class=\"ruby-comment cmt\"># Multi-valued vs. single params</span>\n\ 700: <span class=\"ruby-identifier\">params</span>[<span class=\"ruby-identifier\">key</span>] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_a</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">></span> <span class=\"ruby-value\">1</span> <span class=\"ruby-operator\">?</span> <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_a</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 701: <span class=\"ruby-keyword kw\">end</span>\n\ 702: <span class=\"ruby-keyword kw\">end</span>\n\ 703: <span class=\"ruby-identifier\">validator</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">FormValidator</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">profile</span>, <span class=\"ruby-identifier\">params</span> )\n\ 704: \n\ 705: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Validator: %p"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">validator</span>\n\ 706: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">validator</span>\n\ 707: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="FormValidator.html">FormValidator</a> object for the specified <tt>action</tt> which has been given the arguments from the given <tt>txn</tt>. </p> params: ( action, txn ) - visibility: protected aref: M000579 name: prep_transaction sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 636</span>\n\ 636: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\ 637: <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/html"</span>\n\ 638: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">sync_header</span> = <span class=\"ruby-keyword kw\">true</span>\n\ 639: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Prepares the transaction (<tt>txn</tt>) for applet execution. By default, this method sets the content type of the response to ‘text/html’ and turns off buffering for the header. </p> params: ( txn ) - visibility: protected aref: M000578 name: subrun sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 615</span>\n\ 615: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">subrun</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 616: <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> = <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Transaction</span> )\n\ 617: <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 subordinate action '%s' from '%s'"</span> <span class=\"ruby-operator\">%</span>\n\ 618: [ <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">caller</span>[<span class=\"ruby-value\">0</span>] ]\n\ 619: \n\ 620: <span class=\"ruby-comment cmt\"># Make sure the transaction has stuff loaded. This is necessary when</span>\n\ 621: <span class=\"ruby-comment cmt\"># #subrun is called without going through #run first (e.g., via </span>\n\ 622: <span class=\"ruby-comment cmt\"># #delegate)</span>\n\ 623: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 624: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\ 625: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\ 626: <span class=\"ruby-keyword kw\">end</span>\n\ 627: \n\ 628: <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 629: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 630: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Run an action with a duped transaction (e.g., from another action) </p> params: ( action, txn, *args ) - visibility: protected aref: M000581 name: template m_desc: |- <p> Alias for <a href="Applet.html#M000580">#load_template</a> </p> params: ( key ) category: Instance type: Protected
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 439 $" - name: SVNId desc: |+ SVN Id value: "%q$Id: applet.rb 439 2008-04-10 23:27:34Z deveiant $" - name: SignatureStruct desc: | <a href="Applet.html">Applet</a> <a href="Applet.html#M000565">signature</a> struct. The fields are as follows: <dl> <dt><b>name</b></dt><dd>The name of the applet; used for introspection and reports. </dd> <dt><b>description</b></dt><dd>The description of the applet; used for introspection. </dd> <dt><b>maintainer</b></dt><dd>The name of the maintainer for reports and introspection. </dd> <dt><b>version</b></dt><dd>The version or revision number of the applet, which can be any object that has a #to_s method. </dd> <dt><b><a href="Applet.html#M000557">default_action</a></b></dt><dd>The action that will be <a href="Applet.html#M000570">run</a> if no action is specified. </dd> <dt><b>templates</b></dt><dd>A hash of templates used by the applet. The keys are Symbol identifiers which will be used for lookup, and the values are the paths to <a href="Applet.html#M000552">template</a> files. </dd> <dt><b>validator_profiles</b></dt><dd>A hash containing profiles for the built in form <a href="Applet.html#M000558">validator</a>, one per action. See the documentation for <a href="FormValidator.html">FormValidator</a> for the format of each profile hash. </dd> </dl> value: Struct.new( :name, :description, :maintainer, :version, :config, :default_action, :templates, :validator_profiles, :appicon ) - name: SignatureStructDefaults desc: |+ Default-generators for Signatures which are missing one or more of the optional pairs. value: "{ :name => proc {|rawsig, klass| klass.name}, :description => "(none)", :maintainer => "", # Workaround for RDoc :version => nil, # Workaround for RDoc :default_action => '_default', :config => {}, :templates => {}, :validator_profiles => { :__default__ => { :optional => [:action], :constraints => { :action => /^\\w+$/, }, }, }, :appicon => 'application-x-executable.png', }"
--- - old_name: template desc: |+ Allow either ‘<a href="Applet.html#M000552">template</a>’ or ‘templates‘ new_name: templates
Generated with the Darkfish Rdoc Generator.