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

Changeset 1937

Show
Ignore:
Timestamp:
09/06/07 12:00:32 (1 year ago)
Author:
nahi
Message:
  • WSDLDriverFactory did not handle nested sequence/choice correctlyl. closes #409.
Files:

Legend:

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

    r1921 r1937  
    130130  def complexobj2soap(obj, type) 
    131131    ele = SOAPElement.new(type.name) 
    132     if type.choice? 
    133       complexobj2choicesoap(obj, ele, type) 
    134     else 
    135       complexobj2sequencesoap(obj, ele, type) 
    136     end 
    137   end 
    138  
    139   def complexobj2sequencesoap(obj, ele, type) 
     132    complexobj2sequencesoap(obj, ele, type, type.choice?, type.choice?) 
     133    ele 
     134  end 
     135 
     136  def complexobj2sequencesoap(obj, soap, type, nillable, is_choice) 
     137    added = false 
    140138    type.elements.each do |child_ele| 
    141139      case child_ele 
     
    143141        any = Mapping.get_attributes_for_any(obj) 
    144142        SOAPElement.from_objs(any).each do |child| 
    145           ele.add(child) 
     143          soap.add(child) 
    146144        end 
     145        ele_added = true 
    147146      when WSDL::XMLSchema::Element 
    148         complexobj2soapchildren(obj, ele, child_ele) 
     147        ele_added = complexobj2soapchildren(obj, soap, child_ele, nillable) 
    149148      when WSDL::XMLSchema::Sequence 
    150         complexobj2sequencesoap(obj, child_ele, type) 
     149        ele_added = complexobj2sequencesoap(obj, soap, child_ele, nillable, false) 
    151150      when WSDL::XMLSchema::Choice 
    152         complexobj2choicesoap(obj, child_ele, type) 
     151        ele_added = complexobj2sequencesoap(obj, soap, child_ele, true, true) 
    153152      else 
    154153        raise MappingError.new("unknown type: #{child_ele}") 
    155154      end 
    156     end 
    157     ele 
    158   end 
    159  
    160   def complexobj2choicesoap(obj, ele, type) 
    161     type.elements.each do |child_ele| 
    162       break if complexobj2soapchildren(obj, ele, child_ele, true) 
    163     end 
    164     ele 
    165   end 
    166  
    167   def complexobj2soapchildren(obj, ele, child_ele, allow_nil_value = false) 
     155      added = true if ele_added 
     156      break if is_choice and ele_added 
     157    end 
     158    added 
     159  end 
     160 
     161  def complexobj2soapchildren(obj, soap, child_ele, nillable = false) 
    168162    if child_ele.map_as_array? 
    169       complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value) 
    170     else 
    171       complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value) 
    172     end 
    173   end 
    174  
    175   def complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value) 
     163      complexobj2soapchildren_array(obj, soap, child_ele, nillable) 
     164    else 
     165      complexobj2soapchildren_single(obj, soap, child_ele, nillable) 
     166    end 
     167  end 
     168 
     169  def complexobj2soapchildren_array(obj, soap, child_ele, nillable) 
    176170    child = Mapping.get_attribute(obj, child_ele.name.name) 
    177171    if child.nil? and obj.is_a?(::Array) 
     
    179173    end 
    180174    if child.nil? 
    181       return false if allow_nil_valu
     175      return false if nillabl
    182176      if child_soap = nil2soap(child_ele) 
    183         ele.add(child_soap) 
     177        soap.add(child_soap) 
    184178        return true 
    185179      else 
     
    192186    child.each do |item| 
    193187      if item.is_a?(SOAPElement) 
    194         ele.add(item) 
     188        soap.add(item) 
    195189      else 
    196190        child_soap = obj2elesoap(item, child_ele) 
    197         ele.add(child_soap) 
     191        soap.add(child_soap) 
    198192      end 
    199193    end 
     
    201195  end 
    202196 
    203   def complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value) 
     197  def complexobj2soapchildren_single(obj, soap, child_ele, nillable) 
    204198    child = Mapping.get_attribute(obj, child_ele.name.name) 
    205199    case child 
    206200    when NilClass 
    207       return false if allow_nil_valu
     201      return false if nillabl
    208202      if child_soap = nil2soap(child_ele) 
    209         ele.add(child_soap) 
     203        soap.add(child_soap) 
    210204        true 
    211205      else 
     
    213207      end 
    214208    when SOAPElement 
    215       ele.add(child) 
     209      soap.add(child) 
    216210      true 
    217211    else 
    218212      child_soap = obj2elesoap(child, child_ele) 
    219       ele.add(child_soap) 
     213      soap.add(child_soap) 
    220214      true 
    221215    end 
  • trunk/test/soap/test_extraattr.rb

    r1765 r1937  
    3737    env = SOAP::SOAPEnvelope.new(header, body) 
    3838    env.extraattr["Id"] = "extraattr" 
    39     g = SOAP::SOAPGenerator.new() 
     39    g = SOAP::Generator.new() 
    4040    xml = g.generate(env) 
    4141    assert_equal(HEADER_XML, xml) 
  • trunk/test/wsdl/choice/test_choice.rb

    r1924 r1937  
    141141  end 
    142142 
    143   def test_naive_complex 
     143  def test_wsdl_with_map_complex 
     144    wsdl = File.join(DIR, 'choice.wsdl') 
     145    @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver 
     146    @client.endpoint_url = "http://localhost:#{Port}/" 
     147    @client.wiredump_dev = STDOUT if $DEBUG 
     148    do_test_with_map_complex(@client) 
     149  end 
     150 
     151  def test_wsdl_with_stub_complex 
     152    wsdl = File.join(DIR, 'choice.wsdl') 
     153    @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver 
     154    @client.endpoint_url = "http://localhost:#{Port}/" 
     155    @client.wiredump_dev = STDOUT if $DEBUG 
     156    @client.literal_mapping_registry = ChoiceMappingRegistry::LiteralRegistry 
     157    do_test_with_stub_complex(@client) 
     158  end 
     159 
     160  def test_naive_with_map_complex 
    144161    @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/") 
    145162    @client.add_document_method('echo_complex', 'urn:choice:echo_complex', 
     
    147164      XSD::QName.new('urn:choice', 'echo_complex_response')) 
    148165    @client.wiredump_dev = STDOUT if $DEBUG 
     166    do_test_with_map_complex(@client) 
     167  end 
     168 
     169  def test_naive_with_stub_complex 
     170    @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/") 
     171    @client.add_document_method('echo_complex', 'urn:choice:echo_complex', 
     172      XSD::QName.new('urn:choice', 'echoele_complex'), 
     173      XSD::QName.new('urn:choice', 'echo_complex_response')) 
     174    @client.wiredump_dev = STDOUT if $DEBUG 
    149175    @client.literal_mapping_registry = ChoiceMappingRegistry::LiteralRegistry 
    150     # 
    151     ret = @client.echo_complex(Echoele_complex.new(Andor.new("A", "B1", nil, nil, nil, nil, "C1", "C2"))) 
     176    do_test_with_stub_complex(@client) 
     177  end 
     178 
     179  def do_test_with_map_complex(client) 
     180    req = { 
     181      :data => { 
     182        :A => "A", 
     183        :B1 => "B1", 
     184        :C1 => "C1", 
     185        :C2 => "C2" 
     186      } 
     187    } 
     188    ret = client.echo_complex(req) 
     189    assert_equal("A", ret.data["A"]) 
     190    assert_equal("B1", ret.data["B1"]) 
     191    assert_equal(nil, ret.data["B2a"]) 
     192    assert_equal(nil, ret.data["B2b"]) 
     193    assert_equal(nil, ret.data["B3a"]) 
     194    assert_equal(nil, ret.data["B3b"]) 
     195    assert_equal("C1", ret.data["C1"]) 
     196    assert_equal("C2", ret.data["C2"]) 
     197    # 
     198    req = { 
     199      :data => { 
     200        :A => "A", 
     201        :B2a => "B2a", 
     202        :B2b => "B2b", 
     203        :C1 => "C1", 
     204        :C2 => "C2" 
     205      } 
     206    } 
     207    ret = client.echo_complex(req) 
     208    assert_equal("A", ret.data["A"]) 
     209    assert_equal(nil, ret.data["B1"]) 
     210    assert_equal("B2a", ret.data["B2a"]) 
     211    assert_equal("B2b", ret.data["B2b"]) 
     212    assert_equal(nil, ret.data["B3a"]) 
     213    assert_equal(nil, ret.data["B3b"]) 
     214    assert_equal("C1", ret.data["C1"]) 
     215    assert_equal("C2", ret.data["C2"]) 
     216    # 
     217    req = { 
     218      :data => { 
     219        :A => "A", 
     220        :B3a => "B3a", 
     221        :C1 => "C1", 
     222        :C2 => "C2" 
     223      } 
     224    } 
     225    ret = client.echo_complex(req) 
     226    assert_equal("A", ret.data["A"]) 
     227    assert_equal(nil, ret.data["B1"]) 
     228    assert_equal(nil, ret.data["B2a"]) 
     229    assert_equal(nil, ret.data["B2b"]) 
     230    assert_equal("B3a", ret.data["B3a"]) 
     231    assert_equal(nil, ret.data["B3b"]) 
     232    assert_equal("C1", ret.data["C1"]) 
     233    assert_equal("C2", ret.data["C2"]) 
     234    # 
     235    req = { 
     236      :data => { 
     237        :A => "A", 
     238        :B3b => "B3b", 
     239        :C1 => "C1", 
     240        :C2 => "C2" 
     241      } 
     242    } 
     243    ret = client.echo_complex(req) 
     244    assert_equal("A", ret.data["A"]) 
     245    assert_equal(nil, ret.data["B1"]) 
     246    assert_equal(nil, ret.data["B2a"]) 
     247    assert_equal(nil, ret.data["B2b"]) 
     248    assert_equal(nil, ret.data["B3a"]) 
     249    assert_equal("B3b", ret.data["B3b"]) 
     250    assert_equal("C1", ret.data["C1"]) 
     251    assert_equal("C2", ret.data["C2"]) 
     252  end 
     253 
     254  def do_test_with_stub_complex(client) 
     255    ret = client.echo_complex(Echoele_complex.new(Andor.new("A", "B1", nil, nil, nil, nil, "C1", "C2"))) 
    152256    assert_equal("A", ret.data.a) 
    153257    assert_equal("B1", ret.data.b1) 
     
    159263    assert_equal("C2", ret.data.c2) 
    160264    # 
    161     ret = @client.echo_complex(Echoele_complex.new(Andor.new("A", nil, "B2a", "B2b", nil, nil, "C1", "C2"))) 
     265    ret = client.echo_complex(Echoele_complex.new(Andor.new("A", nil, "B2a", "B2b", nil, nil, "C1", "C2"))) 
    162266    assert_equal("A", ret.data.a) 
    163267    assert_equal(nil, ret.data.b1) 
     
    169273    assert_equal("C2", ret.data.c2) 
    170274    # 
    171     ret = @client.echo_complex(Echoele_complex.new(Andor.new("A", nil, nil, nil, "B3a", nil, "C1", "C2"))) 
     275    ret = client.echo_complex(Echoele_complex.new(Andor.new("A", nil, nil, nil, "B3a", nil, "C1", "C2"))) 
    172276    assert_equal("A", ret.data.a) 
    173277    assert_equal(nil, ret.data.b1) 
     
    179283    assert_equal("C2", ret.data.c2) 
    180284    # 
    181     ret = @client.echo_complex(Echoele_complex.new(Andor.new("A", nil, nil, nil, nil, "B3b", "C1", "C2"))) 
     285    ret = client.echo_complex(Echoele_complex.new(Andor.new("A", nil, nil, nil, nil, "B3b", "C1", "C2"))) 
    182286    assert_equal("A", ret.data.a) 
    183287    assert_equal(nil, ret.data.b1)