# File lib/soap/wsdlDriver.rb, line 287 287: def initialize(host, wsdl, port, logdev) 288: @host = host 289: @wsdl = wsdl 290: @port = port 291: @logdev = logdev 292: @soapaction = nil 293: @options = setup_options 294: @default_encodingstyle = nil 295: @allow_unqualified_element = nil 296: @generate_explicit_type = false 297: @mapping_registry = nil # for rpc unmarshal 298: @wsdl_mapping_registry = nil # for rpc marshal 299: @wiredump_file_base = nil 300: @mandatorycharset = nil 301: @wsdl_elements = @wsdl.collect_elements 302: @wsdl_types = @wsdl.collect_complextypes + @wsdl.collect_simpletypes 303: @rpc_decode_typemap = @wsdl_types + 304: @wsdl.soap_rpc_complextypes(port.find_binding) 305: @wsdl_mapping_registry = Mapping::WSDLEncodedRegistry.new( 306: @rpc_decode_typemap) 307: @doc_mapper = Mapping::WSDLLiteralRegistry.new( 308: @wsdl_types, @wsdl_elements) 309: endpoint_url = @port.soap_address.location 310: # Convert a map which key is QName, to a Hash which key is String. 311: @operation = {} 312: @port.inputoperation_map.each do |op_name, op_info| 313: orgname = op_name.name 314: name = XSD::CodeGen::GenSupport.safemethodname(orgname) 315: @operation[name] = @operation[orgname] = op_info 316: add_method_interface(op_info) 317: end 318: @proxy = ::SOAP::RPC::Proxy.new(endpoint_url, @soapaction, @options) 319: end
req_header: [[element, mustunderstand, encodingstyle(QName/String)], …] req_body: SOAPBasetype/SOAPCompoundtype
# File lib/soap/wsdlDriver.rb, line 382 382: def document_send(name, header_obj, body_obj) 383: set_wiredump_file_base(name) 384: unless op_info = @operation[name] 385: raise RuntimeError, "method: #{name} not defined" 386: end 387: req_header = header_obj ? header_from_obj(header_obj, op_info) : nil 388: req_body = body_from_obj(body_obj, op_info) 389: opt = create_options({ 390: :soapaction => op_info.soapaction || @soapaction, 391: :decode_typemap => @wsdl_types}) 392: env = @proxy.invoke(req_header, req_body, opt) 393: raise EmptyResponseError unless env 394: if env.body.fault 395: raise ::SOAP::FaultError.new(env.body.fault) 396: end 397: res_body_obj = env.body.response ? 398: Mapping.soap2obj(env.body.response, @mapping_registry) : nil 399: return env.header, res_body_obj 400: end
# File lib/soap/wsdlDriver.rb, line 325 325: def endpoint_url 326: @proxy.endpoint_url 327: end
# File lib/soap/wsdlDriver.rb, line 329 329: def endpoint_url=(endpoint_url) 330: @proxy.endpoint_url = endpoint_url 331: end
# File lib/soap/wsdlDriver.rb, line 333 333: def headerhandler 334: @proxy.headerhandler 335: end
# File lib/soap/wsdlDriver.rb, line 321 321: def inspect 322: "#<#{self.class}:#{@proxy.inspect}>" 323: end
# File lib/soap/wsdlDriver.rb, line 345 345: def reset_stream 346: @proxy.reset_stream 347: end
# File lib/soap/wsdlDriver.rb, line 349 349: def rpc_call(name, *values) 350: set_wiredump_file_base(name) 351: unless op_info = @operation[name] 352: raise RuntimeError, "method: #{name} not defined" 353: end 354: req_header = create_request_header 355: req_body = create_request_body(op_info, *values) 356: reqopt = create_options({ 357: :soapaction => op_info.soapaction || @soapaction}) 358: resopt = create_options({ 359: :decode_typemap => @rpc_decode_typemap}) 360: env = @proxy.route(req_header, req_body, reqopt, resopt) 361: raise EmptyResponseError unless env 362: receive_headers(env.header) 363: begin 364: @proxy.check_fault(env.body) 365: rescue ::SOAP::FaultError => e 366: Mapping.fault2exception(e) 367: end 368: ret = env.body.response ? 369: Mapping.soap2obj(env.body.response, @mapping_registry) : nil 370: if env.body.outparams 371: outparams = env.body.outparams.collect { |outparam| 372: Mapping.soap2obj(outparam) 373: } 374: return [ret].concat(outparams) 375: else 376: return ret 377: end 378: end
# File lib/soap/wsdlDriver.rb, line 568 568: def add_document_method_interface(name, parts_names) 569: @host.instance_eval def #{name}(h, b) @servant.document_send(#{name.dump}, h, b) end 570: @host.method(name) 571: end
# File lib/soap/wsdlDriver.rb, line 534 534: def add_method_interface(op_info) 535: name = XSD::CodeGen::GenSupport.safemethodname(op_info.op_name.name) 536: orgname = op_info.op_name.name 537: parts_names = op_info.bodyparts.collect { |part| part.name } 538: case op_info.style 539: when :document 540: if orgname != name and orgname.capitalize == name.capitalize 541: add_document_method_interface(orgname, parts_names) 542: end 543: add_document_method_interface(name, parts_names) 544: when :rpc 545: if orgname != name and orgname.capitalize == name.capitalize 546: add_rpc_method_interface(orgname, parts_names) 547: end 548: add_rpc_method_interface(name, parts_names) 549: else 550: raise RuntimeError.new("unknown style: #{op_info.style}") 551: end 552: end
# File lib/soap/wsdlDriver.rb, line 554 554: def add_rpc_method_interface(name, parts_names) 555: param_count = parts_names.size 556: @host.instance_eval 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 557: @host.method(name) 558: end
# File lib/soap/wsdlDriver.rb, line 500 500: def body_from_obj(obj, op_info) 501: if obj.is_a?(SOAPBody) 502: obj 503: elsif op_info.bodyparts.empty? 504: if obj.nil? 505: nil 506: else 507: raise RuntimeError.new("no body found in schema") 508: end 509: elsif op_info.bodyparts.size == 1 510: part = op_info.bodyparts[0] 511: ele = bodyitem_from_obj(obj, part.element || part.type) 512: SOAPBody.new(ele) 513: else 514: body = SOAPBody.new 515: op_info.bodyparts.each do |part| 516: child = Mapping.get_attribute(obj, part.name) 517: ele = bodyitem_from_obj(child, part.element || part.type) 518: body.add(ele.elename.name, ele) 519: end 520: body 521: end 522: end
# File lib/soap/wsdlDriver.rb, line 524 524: def bodyitem_from_obj(obj, name) 525: if obj.nil? 526: SOAPElement.new(name) 527: elsif obj.is_a?(SOAPElement) 528: obj 529: else 530: Mapping.obj2soap(obj, @doc_mapper, name) 531: end 532: end
# File lib/soap/wsdlDriver.rb, line 455 455: def create_method_obj(names, params) 456: o = Object.new 457: idx = 0 458: while idx < params.length 459: o.instance_variable_set('@' + names[idx], params[idx]) 460: idx += 1 461: end 462: o 463: end
# File lib/soap/wsdlDriver.rb, line 437 437: def create_method_struct(op_info, *params) 438: parts_names = op_info.bodyparts.collect { |part| part.name } 439: obj = create_method_obj(parts_names, params) 440: method = Mapping.obj2soap(obj, @wsdl_mapping_registry, op_info.op_name) 441: if method.members.size != parts_names.size 442: new_method = SOAPStruct.new 443: method.each do |key, value| 444: if parts_names.include?(key) 445: new_method.add(key, value) 446: end 447: end 448: method = new_method 449: end 450: method.elename = op_info.op_name 451: method.type = XSD::QName.new # Request should not be typed. 452: method 453: end
# File lib/soap/wsdlDriver.rb, line 404 404: def create_options(hash = nil) 405: opt = {} 406: opt[:default_encodingstyle] = @default_encodingstyle 407: opt[:allow_unqualified_element] = @allow_unqualified_element 408: opt[:generate_explicit_type] = @generate_explicit_type 409: opt.update(hash) if hash 410: opt 411: end
# File lib/soap/wsdlDriver.rb, line 432 432: def create_request_body(op_info, *values) 433: method = create_method_struct(op_info, *values) 434: SOAPBody.new(method) 435: end
# File lib/soap/wsdlDriver.rb, line 419 419: def create_request_header 420: header = SOAPHeader.new 421: items = @proxy.headerhandler.on_outbound(header) 422: items.each do |item| 423: header.add(item.elename.name, item) 424: end 425: header 426: end
# File lib/soap/wsdlDriver.rb, line 465 465: def header_from_obj(obj, op_info) 466: if obj.is_a?(SOAPHeader) 467: obj 468: elsif op_info.headerparts.empty? 469: if obj.nil? 470: nil 471: else 472: raise RuntimeError.new("no header definition in schema: #{obj}") 473: end 474: elsif op_info.headerparts.size == 1 475: part = op_info.headerparts[0] 476: header = SOAPHeader.new() 477: header.add(headeritem_from_obj(obj, part.element || part.eletype)) 478: header 479: else 480: header = SOAPHeader.new() 481: op_info.headerparts.each do |part| 482: child = Mapping.get_attribute(obj, part.name) 483: ele = headeritem_from_obj(child, part.element || part.eletype) 484: header.add(part.name, ele) 485: end 486: header 487: end 488: end
# File lib/soap/wsdlDriver.rb, line 490 490: def headeritem_from_obj(obj, name) 491: if obj.nil? 492: SOAPElement.new(name) 493: elsif obj.is_a?(SOAPHeaderItem) 494: obj 495: else 496: Mapping.obj2soap(obj, @doc_mapper, name) 497: end 498: end
# File lib/soap/wsdlDriver.rb, line 428 428: def receive_headers(header) 429: @proxy.headerhandler.on_inbound(header) if header 430: end
# File lib/soap/wsdlDriver.rb, line 413 413: def set_wiredump_file_base(name) 414: if @wiredump_file_base 415: @proxy.set_wiredump_file_base(@wiredump_file_base + "_#{name}") 416: end 417: end
# File lib/soap/wsdlDriver.rb, line 577 577: def setup_options 578: if opt = Property.loadproperty(::SOAP::PropertyName) 579: opt = opt["client"] 580: end 581: opt ||= Property.new 582: opt.add_hook("protocol.mandatorycharset") do |key, value| 583: @mandatorycharset = value 584: end 585: opt.add_hook("protocol.wiredump_file_base") do |key, value| 586: @wiredump_file_base = value 587: end 588: opt["protocol.http.charset"] ||= XSD::Charset.xml_encoding_label 589: opt["protocol.http.proxy"] ||= Env::HTTP_PROXY 590: opt["protocol.http.no_proxy"] ||= Env::NO_PROXY 591: opt 592: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.