Class | SOAP::RPC::Router::Operation |
In: |
lib/soap/rpc/router.rb
|
Parent: | Object |
name | [R] | |
request_style | [R] | |
request_use | [R] | |
response_style | [R] | |
response_use | [R] | |
soapaction | [R] |
# File lib/soap/rpc/router.rb, line 342 342: def initialize(soapaction, name, param_def, opt) 343: @soapaction = soapaction 344: @name = name 345: @request_style = opt[:request_style] 346: @response_style = opt[:response_style] 347: @request_use = opt[:request_use] 348: @response_use = opt[:response_use] 349: check_style(@request_style) 350: check_style(@response_style) 351: check_use(@request_use) 352: check_use(@response_use) 353: if @response_style == :rpc 354: request_qname = opt[:request_qname] or raise 355: @rpc_method_factory = 356: RPC::SOAPMethodRequest.new(request_qname, param_def, @soapaction) 357: @rpc_response_qname = opt[:response_qname] 358: else 359: @doc_request_qnames = [] 360: @doc_request_qualified = [] 361: @doc_response_qnames = [] 362: @doc_response_qualified = [] 363: param_def.each do |inout, paramname, typeinfo, eleinfo| 364: klass, nsdef, namedef = typeinfo 365: qualified = eleinfo 366: case inout 367: when SOAPMethod::IN 368: @doc_request_qnames << XSD::QName.new(nsdef, namedef) 369: @doc_request_qualified << qualified 370: when SOAPMethod::OUT 371: @doc_response_qnames << XSD::QName.new(nsdef, namedef) 372: @doc_response_qualified << qualified 373: else 374: raise ArgumentError.new( 375: "illegal inout definition for document style: #{inout}") 376: end 377: end 378: end 379: end
# File lib/soap/rpc/router.rb, line 389 389: def call(body, mapping_registry, literal_mapping_registry, opt) 390: if @request_style == :rpc 391: values = request_rpc(body, mapping_registry, literal_mapping_registry, 392: opt) 393: else 394: values = request_document(body, mapping_registry, 395: literal_mapping_registry, opt) 396: end 397: result = receiver.method(@name.intern).call(*values) 398: return result if result.is_a?(SOAPFault) 399: if @response_style == :rpc 400: response_rpc(result, mapping_registry, literal_mapping_registry, opt) 401: else 402: response_doc(result, mapping_registry, literal_mapping_registry, opt) 403: end 404: end
# File lib/soap/rpc/router.rb, line 381 381: def request_default_encodingstyle 382: (@request_use == :encoded) ? EncodingNamespace : LiteralNamespace 383: end
# File lib/soap/rpc/router.rb, line 385 385: def response_default_encodingstyle 386: (@response_use == :encoded) ? EncodingNamespace : LiteralNamespace 387: end
# File lib/soap/rpc/router.rb, line 549 549: def check_style(style) 550: unless [:rpc, :document].include?(style) 551: raise ArgumentError.new("unknown style: #{style}") 552: end 553: end
# File lib/soap/rpc/router.rb, line 555 555: def check_use(use) 556: unless [:encoded, :literal].include?(use) 557: raise ArgumentError.new("unknown use: #{use}") 558: end 559: end
# File lib/soap/rpc/router.rb, line 408 408: def receiver 409: raise NotImplementedError.new('must be defined in derived class') 410: end
# File lib/soap/rpc/router.rb, line 446 446: def request_doc_enc(body, mapping_registry, opt) 447: body.collect { |key, value| 448: Mapping.soap2obj(value, mapping_registry, nil, opt) 449: } 450: end
# File lib/soap/rpc/router.rb, line 452 452: def request_doc_lit(body, mapping_registry, opt) 453: body.collect { |key, value| 454: Mapping.soap2obj(value, mapping_registry, nil, opt) 455: } 456: end
# File lib/soap/rpc/router.rb, line 424 424: def request_document(body, mapping_registry, literal_mapping_registry, opt) 425: # ToDo: compare names with @doc_request_qnames 426: if @request_use == :encoded 427: request_doc_enc(body, mapping_registry, opt) 428: else 429: request_doc_lit(body, literal_mapping_registry, opt) 430: end 431: end
# File lib/soap/rpc/router.rb, line 412 412: def request_rpc(body, mapping_registry, literal_mapping_registry, opt) 413: request = body.request 414: unless request.is_a?(SOAPStruct) 415: raise RPCRoutingError.new("not an RPC style") 416: end 417: if @request_use == :encoded 418: request_rpc_enc(request, mapping_registry, opt) 419: else 420: request_rpc_lit(request, literal_mapping_registry, opt) 421: end 422: end
# File lib/soap/rpc/router.rb, line 433 433: def request_rpc_enc(request, mapping_registry, opt) 434: param = Mapping.soap2obj(request, mapping_registry, nil, opt) 435: request.collect { |key, value| 436: param[key] 437: } 438: end
# File lib/soap/rpc/router.rb, line 440 440: def request_rpc_lit(request, mapping_registry, opt) 441: request.collect { |key, value| 442: Mapping.soap2obj(value, mapping_registry, nil, opt) 443: } 444: end
# File lib/soap/rpc/router.rb, line 466 466: def response_doc(result, mapping_registry, literal_mapping_registry, opt) 467: if @doc_response_qnames.size == 1 and !result.is_a?(Array) 468: result = [result] 469: end 470: if result.size != @doc_response_qnames.size 471: raise "required #{@doc_response_qnames.size} responses " + 472: "but #{result.size} given" 473: end 474: if @response_use == :encoded 475: response_doc_enc(result, mapping_registry, opt) 476: else 477: response_doc_lit(result, literal_mapping_registry, opt) 478: end 479: end
# File lib/soap/rpc/router.rb, line 529 529: def response_doc_enc(result, mapping_registry, opt) 530: (0...result.size).collect { |idx| 531: ele = Mapping.obj2soap(result[idx], mapping_registry, nil, opt) 532: ele.elename = @doc_response_qnames[idx] 533: ele 534: } 535: end
# File lib/soap/rpc/router.rb, line 537 537: def response_doc_lit(result, mapping_registry, opt) 538: (0...result.size).collect { |idx| 539: ele = Mapping.obj2soap(result[idx], mapping_registry, 540: @doc_response_qnames[idx]) 541: ele.encodingstyle = LiteralNamespace 542: if ele.respond_to?(:qualified) 543: ele.qualified = @doc_response_qualified[idx] 544: end 545: ele 546: } 547: end
# File lib/soap/rpc/router.rb, line 458 458: def response_rpc(result, mapping_registry, literal_mapping_registry, opt) 459: if @response_use == :encoded 460: response_rpc_enc(result, mapping_registry, opt) 461: else 462: response_rpc_lit(result, literal_mapping_registry, opt) 463: end 464: end
# File lib/soap/rpc/router.rb, line 481 481: def response_rpc_enc(result, mapping_registry, opt) 482: soap_response = 483: @rpc_method_factory.create_method_response(@rpc_response_qname) 484: if soap_response.have_outparam? 485: unless result.is_a?(Array) 486: raise RPCRoutingError.new("out parameter was not returned") 487: end 488: outparams = {} 489: i = 1 490: soap_response.output_params.each do |outparam| 491: outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry, 492: nil, opt) 493: i += 1 494: end 495: soap_response.set_outparam(outparams) 496: soap_response.retval = Mapping.obj2soap(result[0], mapping_registry, 497: nil, opt) 498: else 499: soap_response.retval = Mapping.obj2soap(result, mapping_registry, nil, 500: opt) 501: end 502: soap_response 503: end
# File lib/soap/rpc/router.rb, line 505 505: def response_rpc_lit(result, mapping_registry, opt) 506: soap_response = 507: @rpc_method_factory.create_method_response(@rpc_response_qname) 508: if soap_response.have_outparam? 509: unless result.is_a?(Array) 510: raise RPCRoutingError.new("out parameter was not returned") 511: end 512: outparams = {} 513: i = 1 514: soap_response.output_params.each do |outparam| 515: outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry, 516: XSD::QName.new(nil, outparam), opt) 517: i += 1 518: end 519: soap_response.set_outparam(outparams) 520: soap_response.retval = Mapping.obj2soap(result[0], mapping_registry, 521: XSD::QName.new(nil, soap_response.elename), opt) 522: else 523: soap_response.retval = Mapping.obj2soap(result, mapping_registry, 524: XSD::QName.new(nil, soap_response.elename), opt) 525: end 526: soap_response 527: end