module Pione module Command class PioneInteractive < BasicCommand # # libraries # require 'rexml/document' # debug mode only unless ENV["PIONE_JOB_ID"] require 'webrick' end # # informations # define(:toplevel, true) define(:name, "pione-interactive") define(:desc, "interactive action handler") # # arguments # argument(:xml) do |item| item.type = :location item.desc = "UI definition file" item.missing = "There are no definition file." end # # options # option(:ui) do |item| item.type = :symbol_downcase item.long = "--ui" item.arg = "NAME" item.desc = "User interface name" end option_post(:validate_ui) do |item| item.desc = "Validate UI name" item.process do test(model[:ui].nil?) raise Rootage::OptionError.new(cmd, "No UI name") end item.process do test(model[:ui] != :browser) raise Rootage::OptionError.new(cmd, "Unknown UI name: %s" % model[:ui]) end end # # command lifecycle: setup phase # phase(:setup) do |seq| seq << :ui_definition end setup(:ui_definition) do |item| item.desc = "Extract informations from UI definition" item.process do fm = REXML::Formatters::Default.new # create a document doc = REXML::Document.new(model[:xml].read) # get the prefix of root element(e.g. "pione") prefix = doc.root.prefix prefix = prefix ? prefix + ":" : "" # get embeded contents content = REXML::XPath.first(doc, "/#{prefix}interactive/#{prefix}content") model[:content] = "" content.elements.each {|e| fm.write(e, model[:content])} # get embeded script script = REXML::XPath.first(doc, "/#{prefix}interactive/#{prefix}script") model[:script] = script.text end end # # command lifecycle: execution phase # phase(:execution) do |seq| if ENV["PIONE_JOB_ID"] seq << :connect_webclient else # debug mode seq << :debug_mode seq << :print_result end end execution(:debug_mode) do |item| item.desc = "Launch a debug server" item.process do begin template = <