class SOAP::WSDLDriver::Servant__
Attributes
allow_unqualified_element[RW]
default_encodingstyle[RW]
generate_explicit_type[RW]
mapping_registry[RW]
options[R]
port[R]
soapaction[RW]
wsdl_mapping_registry[RW]
Public Class Methods
new(host, wsdl, port, logdev)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 287 def initialize(host, wsdl, port, logdev) @host = host @wsdl = wsdl @port = port @logdev = logdev @soapaction = nil @options = setup_options @default_encodingstyle = nil @allow_unqualified_element = nil @generate_explicit_type = false @mapping_registry = nil # for rpc unmarshal @wsdl_mapping_registry = nil # for rpc marshal @wiredump_file_base = nil @mandatorycharset = nil @wsdl_elements = @wsdl.collect_elements @wsdl_types = @wsdl.collect_complextypes + @wsdl.collect_simpletypes @rpc_decode_typemap = @wsdl_types + @wsdl.soap_rpc_complextypes(port.find_binding) @wsdl_mapping_registry = Mapping::WSDLEncodedRegistry.new( @rpc_decode_typemap) @doc_mapper = Mapping::WSDLLiteralRegistry.new( @wsdl_types, @wsdl_elements) endpoint_url = @port.soap_address.location # Convert a map which key is QName, to a Hash which key is String. @operation = {} @port.inputoperation_map.each do |op_name, op_info| orgname = op_name.name name = XSD::CodeGen::GenSupport.safemethodname(orgname) @operation[name] = @operation[orgname] = op_info add_method_interface(op_info) end @proxy = ::SOAP::RPC::Proxy.new(endpoint_url, @soapaction, @options) end
Public Instance Methods
document_send(name, header_obj, body_obj)
click to toggle source
req_header: [[element, mustunderstand, encodingstyle(QName/String)], …] req_body: SOAPBasetype/SOAPCompoundtype
# File lib/soap/wsdlDriver.rb, line 382 def document_send(name, header_obj, body_obj) set_wiredump_file_base(name) unless op_info = @operation[name] raise RuntimeError, "method: #{name} not defined" end req_header = header_obj ? header_from_obj(header_obj, op_info) : nil req_body = body_from_obj(body_obj, op_info) opt = create_options({ :soapaction => op_info.soapaction || @soapaction, :decode_typemap => @wsdl_types}) env = @proxy.invoke(req_header, req_body, opt) raise EmptyResponseError unless env if env.body.fault raise ::SOAP::FaultError.new(env.body.fault) end res_body_obj = env.body.response ? Mapping.soap2obj(env.body.response, @mapping_registry) : nil return env.header, res_body_obj end
endpoint_url()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 325 def endpoint_url @proxy.endpoint_url end
endpoint_url=(endpoint_url)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 329 def endpoint_url=(endpoint_url) @proxy.endpoint_url = endpoint_url end
headerhandler()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 333 def headerhandler @proxy.headerhandler end
inspect()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 321 def inspect "#<#{self.class}:#{@proxy.inspect}>" end
reset_stream()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 345 def reset_stream @proxy.reset_stream end
rpc_call(name, *values)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 349 def rpc_call(name, *values) set_wiredump_file_base(name) unless op_info = @operation[name] raise RuntimeError, "method: #{name} not defined" end req_header = create_request_header req_body = create_request_body(op_info, *values) reqopt = create_options({ :soapaction => op_info.soapaction || @soapaction}) resopt = create_options({ :decode_typemap => @rpc_decode_typemap}) env = @proxy.route(req_header, req_body, reqopt, resopt) raise EmptyResponseError unless env receive_headers(env.header) begin @proxy.check_fault(env.body) rescue ::SOAP::FaultError => e Mapping.fault2exception(e) end ret = env.body.response ? Mapping.soap2obj(env.body.response, @mapping_registry) : nil if env.body.outparams outparams = env.body.outparams.collect { |outparam| Mapping.soap2obj(outparam) } return [ret].concat(outparams) else return ret end end
streamhandler()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 337 def streamhandler @proxy.streamhandler end
test_loopback_response()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 341 def test_loopback_response @proxy.test_loopback_response end
Private Instance Methods
add_document_method_interface(name, parts_names)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 568 def add_document_method_interface(name, parts_names) @host.instance_eval <<-EOS def #{name}(h, b) @servant.document_send(#{name.dump}, h, b) end EOS @host.method(name) end
add_method_interface(op_info)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 534 def add_method_interface(op_info) name = XSD::CodeGen::GenSupport.safemethodname(op_info.op_name.name) orgname = op_info.op_name.name parts_names = op_info.bodyparts.collect { |part| part.name } case op_info.style when :document if orgname != name and orgname.capitalize == name.capitalize add_document_method_interface(orgname, parts_names) end add_document_method_interface(name, parts_names) when :rpc if orgname != name and orgname.capitalize == name.capitalize add_rpc_method_interface(orgname, parts_names) end add_rpc_method_interface(name, parts_names) else raise RuntimeError.new("unknown style: #{op_info.style}") end end
add_rpc_method_interface(name, parts_names)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 554 def add_rpc_method_interface(name, parts_names) param_count = parts_names.size @host.instance_eval <<-EOS def #{name}(*arg) unless arg.size == #{param_count} raise ArgumentError.new( "wrong number of arguments (\#{arg.size} for #{param_count})") end @servant.rpc_call(#{name.dump}, *arg) end EOS @host.method(name) end
body_from_obj(obj, op_info)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 500 def body_from_obj(obj, op_info) if obj.is_a?(SOAPBody) obj elsif op_info.bodyparts.empty? if obj.nil? nil else raise RuntimeError.new("no body found in schema") end elsif op_info.bodyparts.size == 1 part = op_info.bodyparts[0] ele = bodyitem_from_obj(obj, part.element || part.type) SOAPBody.new(ele) else body = SOAPBody.new op_info.bodyparts.each do |part| child = Mapping.get_attribute(obj, part.name) ele = bodyitem_from_obj(child, part.element || part.type) body.add(ele.elename.name, ele) end body end end
bodyitem_from_obj(obj, name)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 524 def bodyitem_from_obj(obj, name) if obj.nil? SOAPElement.new(name) elsif obj.is_a?(SOAPElement) obj else Mapping.obj2soap(obj, @doc_mapper, name) end end
create_method_obj(names, params)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 455 def create_method_obj(names, params) o = Object.new idx = 0 while idx < params.length o.instance_variable_set('@' + names[idx], params[idx]) idx += 1 end o end
create_method_struct(op_info, *params)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 437 def create_method_struct(op_info, *params) parts_names = op_info.bodyparts.collect { |part| part.name } obj = create_method_obj(parts_names, params) method = Mapping.obj2soap(obj, @wsdl_mapping_registry, op_info.op_name) if method.members.size != parts_names.size new_method = SOAPStruct.new method.each do |key, value| if parts_names.include?(key) new_method.add(key, value) end end method = new_method end method.elename = op_info.op_name method.type = XSD::QName.new # Request should not be typed. method end
create_options(hash = nil)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 404 def create_options(hash = nil) opt = {} opt[:default_encodingstyle] = @default_encodingstyle opt[:allow_unqualified_element] = @allow_unqualified_element opt[:generate_explicit_type] = @generate_explicit_type opt.update(hash) if hash opt end
create_request_body(op_info, *values)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 432 def create_request_body(op_info, *values) method = create_method_struct(op_info, *values) SOAPBody.new(method) end
create_request_header()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 419 def create_request_header header = SOAPHeader.new items = @proxy.headerhandler.on_outbound(header) items.each do |item| header.add(item.elename.name, item) end header end
header_from_obj(obj, op_info)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 465 def header_from_obj(obj, op_info) if obj.is_a?(SOAPHeader) obj elsif op_info.headerparts.empty? if obj.nil? nil else raise RuntimeError.new("no header definition in schema: #{obj}") end elsif op_info.headerparts.size == 1 part = op_info.headerparts[0] header = SOAPHeader.new() header.add(headeritem_from_obj(obj, part.element || part.eletype)) header else header = SOAPHeader.new() op_info.headerparts.each do |part| child = Mapping.get_attribute(obj, part.name) ele = headeritem_from_obj(child, part.element || part.eletype) header.add(part.name, ele) end header end end
headeritem_from_obj(obj, name)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 490 def headeritem_from_obj(obj, name) if obj.nil? SOAPElement.new(name) elsif obj.is_a?(SOAPHeaderItem) obj else Mapping.obj2soap(obj, @doc_mapper, name) end end
receive_headers(header)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 428 def receive_headers(header) @proxy.headerhandler.on_inbound(header) if header end
set_wiredump_file_base(name)
click to toggle source
# File lib/soap/wsdlDriver.rb, line 413 def set_wiredump_file_base(name) if @wiredump_file_base @proxy.set_wiredump_file_base(@wiredump_file_base + "_#{name}") end end
setup_options()
click to toggle source
# File lib/soap/wsdlDriver.rb, line 577 def setup_options if opt = Property.loadproperty(::SOAP::PropertyName) opt = opt["client"] end opt ||= Property.new opt.add_hook("protocol.mandatorycharset") do |key, value| @mandatorycharset = value end opt.add_hook("protocol.wiredump_file_base") do |key, value| @wiredump_file_base = value end opt["protocol.http.charset"] ||= XSD::Charset.xml_encoding_label opt["protocol.http.proxy"] ||= Env::HTTP_PROXY opt["protocol.http.no_proxy"] ||= Env::NO_PROXY opt end