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

Changeset 1775

Show
Ignore:
Timestamp:
05/15/07 17:44:09 (2 years ago)
Author:
nahi
Message:
  • encode/decode basetype according to type definition in rpc/encoded service. closes #98, #328.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/mapping/encodedregistry.rb

    r1771 r1775  
    296296  alias set add 
    297297 
    298   # general Registry ignores type_qname 
    299298  def obj2soap(obj, type_qname = nil) 
    300     soap = _obj2soap(obj
     299    soap = _obj2soap(obj, type_qname
    301300    if @allow_original_mapping 
    302301      addextend2soap(soap, obj) 
     
    324323private 
    325324 
    326   def _obj2soap(obj
     325  def _obj2soap(obj, type_qname = nil
    327326    ret = nil 
    328327    if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray) 
     
    333332    elsif obj.is_a?(SOAPBasetype) 
    334333      return obj 
     334    elsif type_qname && type = TypeMap[type_qname] 
     335      return base2soap(obj, type) 
    335336    end 
    336337    begin  
     
    354355  # Might return nil as a mapping result. 
    355356  def _soap2obj(node, klass = nil) 
     357    definition = find_node_definition(node) 
    356358    if klass 
    357       definition = schema_definition_from_class(klass) 
    358     else 
    359       if definition = schema_definition_from_elename(node.elename) 
     359      klass_definition = schema_definition_from_class(klass) 
     360      if definition and definition.class_for.ancestors.include?(klass) 
    360361        klass = definition.class_for 
    361       elsif definition = schema_definition_from_type(node.type) 
    362         klass = definition.class_for 
    363       end 
     362      else 
     363        definition = klass_definition 
     364      end 
     365    else 
     366      klass = definition.class_for if definition 
    364367    end 
    365368    if definition and node.is_a?(::SOAP::SOAPStruct) 
     
    370373      return obj if conv 
    371374    end 
    372     conv, obj = @map.soap2obj(node, klass
     375    conv, obj = @map.soap2obj(node
    373376    return obj if conv 
    374377    conv, obj = @default_factory.soap2obj(nil, node, nil, self) 
     
    529532    obj 
    530533  end 
     534 
     535  def find_node_definition(node) 
     536    schema_definition_from_elename(node.elename) || schema_definition_from_type(node.type) 
     537  end 
    531538end 
    532539 
  • trunk/lib/soap/mapping/mapping.rb

    r1740 r1775  
    4343    end 
    4444    soap_obj 
     45  end 
     46 
     47  def self.objs2soap(objs, registry = nil, types = nil, opt = EMPTY_OPT) 
     48    registry ||= Mapping::DefaultRegistry 
     49    ary = [] 
     50    protect_mapping(opt) do 
     51      0.upto(objs.length - 1) do |idx| 
     52        type = types ? types[idx] : nil 
     53        soap = _obj2soap(objs[idx], registry, type) 
     54        ary << soap 
     55      end 
     56    end 
     57    ary 
    4558  end 
    4659 
  • trunk/lib/soap/rpc/element.rb

    r1739 r1775  
    113113  end 
    114114 
     115  def input_param_types 
     116    collect_param_types(IN, INOUT) 
     117  end 
     118 
     119  def output_param_types 
     120    collect_param_types(OUT, INOUT) 
     121  end 
     122 
    115123  def set_param(params) 
    116124    params.each do |param, data| 
     
    130138  def get_paramtypes(names) 
    131139    types = [] 
    132     @signature.each do |io_type, name, param_type| 
    133       if param_type && idx = names.index(name) 
    134         types[idx] = XSD::QName.new(param_type[1], param_type[2]) 
     140    @signature.each do |io_type, name, type_qname| 
     141      if type_qname && idx = names.index(name) 
     142        types[idx] = type_qname 
    135143      end 
    136144    end 
     
    190198private 
    191199 
     200  def collect_param_types(*type) 
     201    names = [] 
     202    @signature.each do |io_type, name, type_qname| 
     203      names << type_qname if type.include?(io_type) 
     204    end 
     205    names 
     206  end 
     207 
    192208  def collect_params(*type) 
    193209    names = [] 
    194     @signature.each do |io_type, name, param_type| 
     210    @signature.each do |io_type, name, type_qname| 
    195211      names << name if type.include?(io_type) 
    196212    end 
     
    200216  def init_param(param_def) 
    201217    param_def.each do |io_type, name, param_type| 
     218      mapped_class, nsdef, namedef = param_type 
     219      if mapped_class.is_a?(String) 
     220        mapped_class = Mapping.class_from_name(mapped_class) 
     221      end 
     222      if nsdef && namedef 
     223        type_qname = XSD::QName.new(nsdef, namedef) 
     224      elsif mapped_class 
     225        type_qname = TypeMap.index(mapped_class) 
     226      end 
    202227      case io_type 
    203228      when IN 
    204         @signature.push([IN, name, param_type]) 
     229        @signature.push([IN, name, type_qname]) 
    205230        @inparam_names.push(name) 
    206231      when OUT 
    207         @signature.push([OUT, name, param_type]) 
     232        @signature.push([OUT, name, type_qname]) 
    208233        @outparam_names.push(name) 
    209234      when INOUT 
    210         @signature.push([INOUT, name, param_type]) 
     235        @signature.push([INOUT, name, type_qname]) 
    211236        @inoutparam_names.push(name) 
    212237      when RETVAL 
     
    216241        @retval_name = name 
    217242        @retval_class_name = nil 
    218         if param_type 
    219           if param_type[0].is_a?(String) 
    220             @retval_class_name = Mapping.class_from_name(param_type[0]) 
    221           else 
    222             @retval_class_name = param_type[0] 
    223           end 
    224         end 
     243        @retval_class_name = mapped_class 
    225244      else 
    226245        raise MethodDefinitionError.new("unknown type: #{io_type}") 
  • trunk/lib/soap/rpc/proxy.rb

    r1731 r1775  
    456456      method = @rpc_method_factory.dup 
    457457      names = method.input_params 
    458       obj = create_request_obj(names, values) 
    459       soap = Mapping.obj2soap(obj, mapping_registry, @rpc_request_qname, opt) 
     458      types = method.input_param_types 
     459      ary = Mapping.objs2soap(values, mapping_registry, types, opt) 
     460      soap = {} 
     461      0.upto(ary.length - 1) do |idx| 
     462        soap[names[idx]] = ary[idx] 
     463      end 
    460464      method.set_param(soap) 
    461465      method 
     
    546550      } 
    547551    end 
    548  
    549     def create_request_obj(names, params) 
    550       o = Object.new 
    551       idx = 0 
    552       while idx < params.length 
    553         o.instance_variable_set('@' + names[idx], params[idx]) 
    554         idx += 1 
    555       end 
    556       o 
    557     end 
    558552  end 
    559553end 
  • trunk/lib/soap/wsdlDriver.rb

    r1731 r1775  
    135135    # "::SOAP::SOAPStruct".  turn this String to a class. 
    136136    param_def.collect { |io, name, typedef| 
    137       typedef[0] = Mapping.class_from_name(typedef[0]) 
     137      typedef[0] = Mapping.class_from_name(typedef[0]) if typedef[0] 
    138138      [io, name, typedef] 
    139139    } 
  • trunk/lib/wsdl/soap/methodDefCreator.rb

    r1766 r1775  
    154154      ['::' + mapped.name] 
    155155    elsif definedtype = @simpletypes[part.type] 
    156       if definedtype.base 
    157         ['::' + basetype_mapped_class(definedtype.base).name] 
    158       else 
    159         raise RuntimeError.new("unsupported simpleType: #{definedtype}") 
    160       end 
     156      [nil, definedtype.name.namespace, definedtype.name.name] 
    161157    elsif definedtype = @elements[part.element] 
    162       #['::SOAP::SOAPStruct', part.element.namespace, part.element.name] 
    163       ['nil', part.element.namespace, part.element.name] 
     158      [nil, part.element.namespace, part.element.name] 
    164159    elsif definedtype = @complextypes[part.type] 
    165160      case definedtype.compoundtype 
     
    243238  def type2str(type) 
    244239    if type.size == 1 
    245       "[#{dq(type[0])}]"  
    246     else 
    247       "[#{dq(type[0])}, #{ndq(type[1])}, #{dq(type[2])}]"  
     240      "[#{ndq(type[0])}]"  
     241    else 
     242      "[#{ndq(type[0])}, #{ndq(type[1])}, #{dq(type[2])}]"  
    248243    end 
    249244  end 
  • trunk/test/wsdl/rpc/rpc.wsdl

    r1698 r1775  
    1313          <xsd:element name="family-name" type="xsd:string" /> 
    1414          <xsd:element name="Given_name" type="xsd:string" /> 
    15           <xsd:element name="age" type="xsd:int" /> 
     15          <xsd:element name="age" type="xsd:long" /> 
    1616          <xsd:element name="gender" type="txd:gender" /> 
    1717          <xsd:element name="link" type="txd:person" /> 
     
    3737  </message> 
    3838 
     39  <message name="echo_basetype_in"> 
     40    <part name="date" type="xsd:date"/> 
     41    <part name="long" type="xsd:long"/> 
     42  </message> 
     43 
     44  <message name="echo_basetype_out"> 
     45    <part name="return" type="xsd:date"/> 
     46  </message> 
     47 
    3948  <portType name="echo_port_type"> 
    4049    <operation name="echo"> 
    4150      <input message="tns:echo_in"/> 
    4251      <output message="tns:echo_out"/> 
     52    </operation> 
     53 
     54    <operation name="echo_basetype"> 
     55      <input message="tns:echo_basetype_in"/> 
     56      <output message="tns:echo_basetype_out"/> 
    4357    </operation> 
    4458 
     
    5266    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/> 
    5367    <operation name="echo"> 
     68      <soap:operation soapAction=""/> 
     69      <input> 
     70        <soap:body use="encoded" namespace="urn:rpc" 
     71            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     72      </input> 
     73      <output> 
     74        <soap:body use="encoded" namespace="urn:rpc" 
     75            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     76      </output> 
     77    </operation> 
     78 
     79    <operation name="echo_basetype"> 
    5480      <soap:operation soapAction=""/> 
    5581      <input> 
  • trunk/test/wsdl/rpc/test_rpc.rb

    r1755 r1775  
    1313    def on_init 
    1414      add_rpc_method(self, 'echo', 'arg1', 'arg2') 
     15      add_rpc_method(self, 'echo_basetype', 'arg1', 'arg2') 
    1516      add_rpc_method(self, 'echo_err', 'arg1', 'arg2') 
    1617      self.mapping_registry = Prefix::EchoMappingRegistry::EncodedRegistry 
     
    3940      end 
    4041      ret 
     42    end 
     43 
     44    def echo_basetype(arg1, arg2) 
     45      raise unless arg1.is_a?(Date) 
     46      arg1 
    4147    end 
    4248   
     
    134140    assert_equal("Hi", ret.family_name) 
    135141    assert_equal("Na", ret.given_name) 
    136     # XXX WSDLEncodedRegistry should decode unteyped element using Schema 
     142    # XXX WSDLEncodedRegistry should decode untyped element using Schema 
    137143    assert_equal("21", ret.age) 
    138144 
     
    172178    assert_nil(ret.age) 
    173179  end 
     180 
     181  def test_basetype_stub 
     182    @client = Prefix::Echo_port_type.new("http://localhost:#{Port}/") 
     183    @client.mapping_registry = Prefix::EchoMappingRegistry::EncodedRegistry 
     184    @client.wiredump_dev = STDERR if $DEBUG 
     185 
     186    ret = @client.echo_basetype(Time.now, 12345) 
     187    assert_equal(Date, ret.class) 
     188  end 
    174189end 
    175190 
  • trunk/test/wsdl/simpletype/rpc/expectedDriver.rb

    r1755 r1775  
    1010      "urn:example.com:simpletype-rpc", 
    1111      "echo_version", 
    12       [ ["in", "version", ["::SOAP::SOAPString"]], 
     12      [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 
    1313        ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 
    1414      { :request_style =>  :rpc, :request_use =>  :encoded, 
     
    2020      "echo_version_r", 
    2121      [ ["in", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]], 
    22         ["retval", "version", ["::SOAP::SOAPString"]] ], 
     22        ["retval", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]] ], 
    2323      { :request_style =>  :rpc, :request_use =>  :encoded, 
    2424        :response_style => :rpc, :response_use => :encoded, 
  • trunk/test/wsdl/simpletype/rpc/expectedService.rb

    r1755 r1775  
    99      "urn:example.com:simpletype-rpc", 
    1010      "echo_version", 
    11       [ ["in", "version", ["::SOAP::SOAPString"]], 
     11      [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 
    1212        ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 
    1313      { :request_style =>  :rpc, :request_use =>  :encoded, 
     
    1919      "echo_version_r", 
    2020      [ ["in", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]], 
    21         ["retval", "version", ["::SOAP::SOAPString"]] ], 
     21        ["retval", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]] ], 
    2222      { :request_style =>  :rpc, :request_use =>  :encoded, 
    2323        :response_style => :rpc, :response_use => :encoded, 
  • trunk/test/wsdl/soap/wsdl2ruby/expectedDriver.rb

    r1755 r1775  
    1010      "urn:example.com:simpletype-rpc", 
    1111      "echo_version", 
    12       [ ["in", "version", ["::SOAP::SOAPString"]], 
     12      [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 
    1313        ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 
    1414      { :request_style =>  :rpc, :request_use =>  :encoded, 
     
    2020      "echo_version_r", 
    2121      [ ["in", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]], 
    22         ["retval", "version", ["::SOAP::SOAPString"]] ], 
     22        ["retval", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]] ], 
    2323      { :request_style =>  :rpc, :request_use =>  :encoded, 
    2424        :response_style => :rpc, :response_use => :encoded, 
  • trunk/test/wsdl/soap/wsdl2ruby/expectedService.cgi

    r1755 r1775  
    99      "urn:example.com:simpletype-rpc", 
    1010      "echo_version", 
    11       [ ["in", "version", ["::SOAP::SOAPString"]], 
     11      [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 
    1212        ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 
    1313      { :request_style =>  :rpc, :request_use =>  :encoded, 
     
    1919      "echo_version_r", 
    2020      [ ["in", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]], 
    21         ["retval", "version", ["::SOAP::SOAPString"]] ], 
     21        ["retval", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]] ], 
    2222      { :request_style =>  :rpc, :request_use =>  :encoded, 
    2323        :response_style => :rpc, :response_use => :encoded, 
  • trunk/test/wsdl/soap/wsdl2ruby/expectedService.rb

    r1755 r1775  
    99      "urn:example.com:simpletype-rpc", 
    1010      "echo_version", 
    11       [ ["in", "version", ["::SOAP::SOAPString"]], 
     11      [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 
    1212        ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 
    1313      { :request_style =>  :rpc, :request_use =>  :encoded, 
     
    1919      "echo_version_r", 
    2020      [ ["in", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]], 
    21         ["retval", "version", ["::SOAP::SOAPString"]] ], 
     21        ["retval", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]] ], 
    2222      { :request_style =>  :rpc, :request_use =>  :encoded, 
    2323        :response_style => :rpc, :response_use => :encoded,