Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1701

Show
Ignore:
Timestamp:
08/09/06 21:43:03 (2 years ago)
Author:
nahi
Message:

method overloading support for a Driver based on soapaction. fixed #233.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/rpc/proxy.rb

    r1670 r1701  
    11# SOAP4R - RPC Proxy library. 
    2 # Copyright (C) 2000, 2003-2005  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
     2# Copyright (C) 2000, 2003-2006  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
    33 
    44# This program is copyrighted free software by NAKAMURA, Hiroshi.  You can 
     
    4545    initialize_streamhandler(@protocol_option) 
    4646    @operation = {} 
     47    @operation_by_qname = {} 
     48    @operation_by_soapaction = {} 
    4749    @mandatorycharset = nil 
    4850    @allow_unqualified_element = true 
     
    8587    opt[:request_use] ||= :encoded 
    8688    opt[:response_use] ||= :encoded 
    87     @operation[name] = Operation.new(soapaction, param_def, opt) 
     89    op = Operation.new(soapaction, param_def, opt) 
     90    assign_operation(name, qname, soapaction, op) 
    8891  end 
    8992 
     
    101104      opt[:attributeformdefault] = true 
    102105    end 
    103     @operation[name] = Operation.new(soapaction, param_def, opt) 
     106    op = Operation.new(soapaction, param_def, opt) 
     107    assign_operation(name, nil, soapaction, op) 
    104108  end 
    105109 
     
    115119 
    116120  def call(name, *params) 
    117     unless op_info = @operation[name] 
    118       raise MethodDefinitionError, "method: #{name} not defined" 
    119     end 
     121    # name must be used only for lookup 
     122    op_info = lookup_operation(name) 
    120123    mapping_opt = create_mapping_opt 
    121124    req_header = create_request_header 
     
    285288  end 
    286289 
     290  def assign_operation(name, qname, soapaction, op) 
     291    assigned = false 
     292    if name and !name.empty? 
     293      @operation[name] = op 
     294      assigned = true 
     295    end 
     296    if qname 
     297      @operation_by_qname[qname] = op 
     298      assigned = true 
     299    end 
     300    if soapaction and !soapaction.empty? 
     301      @operation_by_soapaction[soapaction] = op 
     302      assigned = true 
     303    end 
     304    unless assigned 
     305      raise MethodDefinitionError.new("cannot assign operation") 
     306    end 
     307  end 
     308 
     309  def lookup_operation(name_or_qname_or_soapaction) 
     310    if op = @operation[name_or_qname_or_soapaction] 
     311      return op 
     312    end 
     313    if op = @operation_by_qname[name_or_qname_or_soapaction] 
     314      return op 
     315    end 
     316    if op = @operation_by_soapaction[name_or_qname_or_soapaction] 
     317      return op 
     318    end 
     319    raise MethodDefinitionError.new( 
     320      "operation: #{name_or_qname_or_soapaction} not supported") 
     321  end 
     322 
    287323  class Operation 
    288324    attr_reader :soapaction 
  • trunk/lib/wsdl/operationBinding.rb

    r1520 r1701  
    3838 
    3939  def find_operation 
    40     porttype.operations[@name] or raise RuntimeError.new("#{@name} not found") 
     40    porttype.operations.each do |op| 
     41      next if op.name != @name 
     42      next if op.input and @input and op.input.name != @input.name 
     43      next if op.output and @output and op.output.name != @output.name 
     44      return op 
     45    end 
     46    raise RuntimeError.new("#{@name} not found") 
    4147  end 
    4248