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