Parent

Included Modules

Files

Class Index [+]

Quicksearch

SOAP::WSDLDriver::Servant__

Attributes

options[R]
port[R]
soapaction[RW]
default_encodingstyle[RW]
allow_unqualified_element[RW]
generate_explicit_type[RW]
mapping_registry[RW]
wsdl_mapping_registry[RW]

Public Class Methods

new(host, wsdl, port, logdev) click to toggle source
     # 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

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
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
endpoint_url() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 325
325:     def endpoint_url
326:       @proxy.endpoint_url
327:     end
endpoint_url=(endpoint_url) click to toggle source
     # File lib/soap/wsdlDriver.rb, line 329
329:     def endpoint_url=(endpoint_url)
330:       @proxy.endpoint_url = endpoint_url
331:     end
headerhandler() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 333
333:     def headerhandler
334:       @proxy.headerhandler
335:     end
inspect() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 321
321:     def inspect
322:       "#<#{self.class}:#{@proxy.inspect}>"
323:     end
reset_stream() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 345
345:     def reset_stream
346:       @proxy.reset_stream
347:     end
rpc_call(name, *values) click to toggle source
     # 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
streamhandler() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 337
337:     def streamhandler
338:       @proxy.streamhandler
339:     end
test_loopback_response() click to toggle source
     # File lib/soap/wsdlDriver.rb, line 341
341:     def test_loopback_response
342:       @proxy.test_loopback_response
343:     end

Private Instance Methods

add_document_method_interface(name, parts_names) click to toggle source
     # 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
add_method_interface(op_info) click to toggle source
     # 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
add_rpc_method_interface(name, parts_names) click to toggle source
     # 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
body_from_obj(obj, op_info) click to toggle source
     # 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
bodyitem_from_obj(obj, name) click to toggle source
     # 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
create_method_obj(names, params) click to toggle source
     # 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
create_method_struct(op_info, *params) click to toggle source
     # 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
create_options(hash = nil) click to toggle source
     # 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
create_request_body(op_info, *values) click to toggle source
     # 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
create_request_header() click to toggle source
     # 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
header_from_obj(obj, op_info) click to toggle source
     # 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
headeritem_from_obj(obj, name) click to toggle source
     # 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
receive_headers(header) click to toggle source
     # File lib/soap/wsdlDriver.rb, line 428
428:     def receive_headers(header)
429:       @proxy.headerhandler.on_inbound(header) if header
430:     end
set_wiredump_file_base(name) click to toggle source
     # 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
setup_options() click to toggle source
     # 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.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.