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

Changeset 1810

Show
Ignore:
Timestamp:
05/25/07 17:57:07 (2 years ago)
Author:
nahi
Message:
  • for literal service, let LiteralRegistry? treat nil parameter as same as WSDLLiteralRegistry. omit element if minOccurs == '0' and otherwise add xsi:nil="true". closes #343.
Files:

Legend:

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

    r1805 r1810  
    129129  end 
    130130 
    131   def stubobj2soap_elements(obj, ele, definition, add_if_nil = true) 
     131  def stubobj2soap_elements(obj, ele, definition, is_choice = false) 
    132132    added = false 
    133133    case definition 
    134134    when SchemaSequenceDefinition, SchemaEmptyDefinition 
    135135      definition.each do |eledef| 
    136         ele_added = stubobj2soap_elements(obj, ele, eledef, add_if_nil
     136        ele_added = stubobj2soap_elements(obj, ele, eledef, is_choice
    137137        added = true if ele_added 
    138138      end 
    139139    when SchemaChoiceDefinition 
    140140      definition.each do |eledef| 
    141         added = stubobj2soap_elements(obj, ele, eledef, false) 
     141        added = stubobj2soap_elements(obj, ele, eledef, true) 
    142142        break if added 
    143143      end 
     
    155155      else 
    156156        child = Mapping.get_attribute(obj, definition.varname) 
    157         if child.nil? and !add_if_nil 
     157        if child.nil? and (is_choice or definition.minoccurs == 0) 
    158158          added = false 
    159159        else 
  • trunk/lib/soap/mapping/mapping.rb

    r1805 r1810  
    473473      parse_schema_definition(schema_element, default_ns) 
    474474    else 
    475       varname, info = schema_element 
     475      varname, info, occurrence = schema_element 
    476476      mapped_class_str, elename = info 
     477      if occurrence 
     478        minoccurs, maxoccurs = occurrence 
     479      else 
     480        # for backward compatibility 
     481        minoccurs, maxoccurs = 1, 1 
     482      end 
    477483      as_any = as_array = false 
    478484      if /\[\]$/ =~ mapped_class_str 
     
    495501      end 
    496502      SchemaElementDefinition.new( 
    497         varname, mapped_class, elename, as_any, as_array) 
     503        varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array) 
    498504    end 
    499505  end 
  • trunk/lib/soap/mapping/schemadefinition.rb

    r1805 r1810  
    1515 
    1616class SchemaElementDefinition 
    17   attr_reader :varname, :mapped_class, :elename 
     17  attr_reader :varname, :mapped_class, :elename, :minoccurs, :maxoccurs 
    1818 
    19   def initialize(varname, mapped_class, elename, as_any, as_array) 
     19  def initialize(varname, mapped_class, elename, minoccurs, maxoccurs, 
     20      as_any, as_array) 
    2021    @varname = varname 
    2122    @mapped_class = mapped_class 
    2223    @elename = elename 
     24    @minoccurs = minoccurs 
     25    @maxoccurs = maxoccurs 
    2326    @as_any = as_any 
    2427    @as_array = as_array 
  • trunk/lib/soap/mapping/wsdlliteralregistry.rb

    r1809 r1810  
    7878    ele = nil 
    7979    qualified = (eledef.elementform == 'qualified') 
    80     if eledef.type 
     80    if obj.is_a?(SOAPNil) 
     81      ele = obj 
     82    elsif eledef.type 
    8183      if type = @definedtypes[eledef.type] 
    8284        ele = obj2typesoap(obj, type) 
     
    113115  def simpleobj2soap(obj, type) 
    114116    type.check_lexical_format(obj) 
    115     return SOAPNil.new if obj.nil?      # TODO: check nillable. 
     117    return SOAPNil.new if obj.nil? 
    116118    if type.base 
    117119      ele = base2soap(obj, TypeMap[type.base]) 
  • trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb

    r1805 r1810  
    168168      type = nil 
    169169    end 
     170    occurrence = [0, nil] 
    170171    if child_element and child_element.name 
    171172      if child_element.map_as_array? 
    172173        type << '[]' if type 
     174        occurrence = [child_element.minoccurs, child_element.maxoccurs] 
    173175      end 
    174176      child_element_name = child_element.name 
     
    177179    end 
    178180    parsed_element = [] 
    179     parsed_element << [child_element_name.name, child_element_name, type
     181    parsed_element << [child_element_name.name, child_element_name, type, occurrence
    180182    var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 
    181183    dump_entry(@varname, var) 
  • trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb

    r1805 r1810  
    2929        dump_schema_element(definition, indent + 2) + "\n" + sp + "]" 
    3030    else 
    31       varname, name, type = definition 
    32       '[' + 
    33         ( 
    34           if name 
    35             varname.dump + ', [' + ndq(type) + ', ' + dqname(name) + ']' 
    36           else 
    37             varname.dump + ', ' + ndq(type) 
    38           end 
    39         ) + ']' 
     31      varname, name, type, occurrence = definition 
     32      '[' + [ 
     33        varname.dump, 
     34        dump_type(name, type), 
     35        dump_occurrence(occurrence) 
     36      ].compact.join(', ') + ']' 
    4037    end 
    4138  end 
     
    4744      dump_schema_element_definition(definition, indent) 
    4845    }.join(delimiter) 
     46  end 
     47 
     48  def dump_type(name, type) 
     49    if name 
     50      '[' + ndq(type) + ', ' + dqname(name) + ']' 
     51    else 
     52      ndq(type) 
     53    end 
     54  end 
     55 
     56  def dump_occurrence(occurrence) 
     57    if occurrence and occurrence != [1, 1] # default 
     58      minoccurs, maxoccurs = occurrence 
     59      maxoccurs ||= 'nil' 
     60      "[#{minoccurs}, #{maxoccurs}]" 
     61    end 
    4962  end 
    5063 
     
    6174        eleqname = XSD::AnyTypeName 
    6275        type = nil 
    63         schema_element << [varname, eleqname, type] 
     76        occurrence = nil 
     77        schema_element << [varname, eleqname, type, occurrence] 
    6478      when XMLSchema::Element 
    6579        if element.type == XSD::AnyTypeName 
     
    96110          eleqname = nil 
    97111        end 
    98         schema_element << [varname, eleqname, type] 
     112        occurrence = [element.minoccurs, element.maxoccurs] 
     113        schema_element << [varname, eleqname, type, occurrence] 
    99114      when WSDL::XMLSchema::Sequence 
    100115        child_schema_element = parse_elements(element.elements, base_namespace) 
  • trunk/test/wsdl/rpc/test-rpc-lit.wsdl

    r1809 r1810  
    3535        <all> 
    3636          <element name="varString" type="xsd:string"/> 
    37           <element name="varInt" type="xsd:int"/> 
    38           <element name="varFloat" type="xsd:float"/> 
     37          <element name="varInt" type="xsd:int" minOccurs="0" /> 
     38          <element name="varFloat" type="xsd:float" minOccurs="1" /> 
    3939        </all> 
    4040      </complexType> 
     
    5656        <all> 
    5757          <element name="varString" type="xsd:string"/> 
    58           <element name="varInt" type="xsd:int"/> 
    59           <element name="varFloat" type="xsd:float"/> 
     58          <element name="varInt" type="xsd:int" minOccurs="0" /> 
     59          <element name="varFloat" type="xsd:float" minOccurs="1" /> 
    6060          <element ref="types:structItem" /> 
    6161        </all> 
  • trunk/test/wsdl/rpc/test_rpc_lit.rb

    r1803 r1810  
    298298  end 
    299299 
     300  ECHO_NESTED_STRUCT_REQUEST_NIL = 
     301%q[<?xml version="1.0" encoding="utf-8" ?> 
     302<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
     303    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     304  <env:Body> 
     305    <n1:echoNestedStruct xmlns:n1="http://soapbuilders.org/rpc-lit-test"> 
     306      <n2:inputStruct xmlns:n2="http://soapbuilders.org/rpc-lit-test/types"> 
     307        <varString>str</varString> 
     308        <varFloat>+1</varFloat> 
     309        <n2:structItem> 
     310          <varString>str</varString> 
     311          <varInt xsi:nil="true"></varInt> 
     312          <varFloat>+1</varFloat> 
     313        </n2:structItem> 
     314      </n2:inputStruct> 
     315    </n1:echoNestedStruct> 
     316  </env:Body> 
     317</env:Envelope>] 
     318 
     319  ECHO_NESTED_STRUCT_RESPONSE_NIL = 
     320%q[<?xml version="1.0" encoding="utf-8" ?> 
     321<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
     322    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     323  <env:Body> 
     324    <n1:echoNestedStructResponse xmlns:n1="http://soapbuilders.org/rpc-lit-test"> 
     325      <n1:return xmlns:n2="http://soapbuilders.org/rpc-lit-test/types"> 
     326        <varString>str</varString> 
     327        <varFloat>+1</varFloat> 
     328        <n2:structItem> 
     329          <varString>str</varString> 
     330          <varFloat>+1</varFloat> 
     331        </n2:structItem> 
     332      </n1:return> 
     333    </n1:echoNestedStructResponse> 
     334  </env:Body> 
     335</env:Envelope>] 
     336  def test_wsdl_echoNestedStruct_nil 
     337    wsdl = pathname('test-rpc-lit.wsdl') 
     338    @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver 
     339    @client.endpoint_url = "http://localhost:#{Port}/" 
     340    @client.wiredump_dev = str = '' 
     341    @client.generate_explicit_type = false 
     342    result = @client.echoNestedStruct(SOAPStructStruct.new("str", nil, 1.0, SOAPStruct.new("str", ::SOAP::SOAPNil.new, 1.0)))[0] 
     343    assert(!result.respond_to?(:varInt)) 
     344    assert(result.respond_to?(:varString)) 
     345    assert_equal(ECHO_NESTED_STRUCT_REQUEST_NIL, parse_requestxml(str), 
     346      [ECHO_NESTED_STRUCT_REQUEST_NIL, parse_requestxml(str)].join("\n\n")) 
     347    assert_equal(ECHO_NESTED_STRUCT_RESPONSE_NIL, parse_responsexml(str)) 
     348  end 
     349 
    300350  def test_stub_echoNestedStruct 
    301351    drv = SoapTestPortTypeRpcLit.new("http://localhost:#{Port}/") 
     
    314364  end 
    315365 
     366  def test_stub_echoNestedStruct_nil 
     367    drv = SoapTestPortTypeRpcLit.new("http://localhost:#{Port}/") 
     368    drv.wiredump_dev = str = '' 
     369    drv.generate_explicit_type = false 
     370    # response contains only 1 part. 
     371    result = drv.echoNestedStruct(SOAPStructStruct.new("str", nil, 1.0, SOAPStruct.new("str", ::SOAP::SOAPNil.new, 1.0)))[0] 
     372    assert(!result.respond_to?(:varInt)) 
     373    assert(result.respond_to?(:varString)) 
     374    assert_equal(ECHO_NESTED_STRUCT_REQUEST_NIL, parse_requestxml(str), 
     375      [ECHO_NESTED_STRUCT_REQUEST_NIL, parse_requestxml(str)].join("\n\n")) 
     376    assert_equal(ECHO_NESTED_STRUCT_RESPONSE_NIL, parse_responsexml(str)) 
     377  end 
     378 
    316379  ECHO_STRUCT_ARRAY_REQUEST = 
    317380%q[<?xml version="1.0" encoding="utf-8" ?>