Changeset 1810
- Timestamp:
- 05/25/07 17:57:07 (2 years ago)
- Files:
-
- trunk/lib/soap/mapping/literalregistry.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/mapping.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/schemadefinition.rb (modified) (1 diff)
- trunk/lib/soap/mapping/wsdlliteralregistry.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb (modified) (4 diffs)
- trunk/test/wsdl/rpc/test-rpc-lit.wsdl (modified) (2 diffs)
- trunk/test/wsdl/rpc/test_rpc_lit.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/literalregistry.rb
r1805 r1810 129 129 end 130 130 131 def stubobj2soap_elements(obj, ele, definition, add_if_nil = true)131 def stubobj2soap_elements(obj, ele, definition, is_choice = false) 132 132 added = false 133 133 case definition 134 134 when SchemaSequenceDefinition, SchemaEmptyDefinition 135 135 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) 137 137 added = true if ele_added 138 138 end 139 139 when SchemaChoiceDefinition 140 140 definition.each do |eledef| 141 added = stubobj2soap_elements(obj, ele, eledef, false)141 added = stubobj2soap_elements(obj, ele, eledef, true) 142 142 break if added 143 143 end … … 155 155 else 156 156 child = Mapping.get_attribute(obj, definition.varname) 157 if child.nil? and !add_if_nil157 if child.nil? and (is_choice or definition.minoccurs == 0) 158 158 added = false 159 159 else trunk/lib/soap/mapping/mapping.rb
r1805 r1810 473 473 parse_schema_definition(schema_element, default_ns) 474 474 else 475 varname, info = schema_element475 varname, info, occurrence = schema_element 476 476 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 477 483 as_any = as_array = false 478 484 if /\[\]$/ =~ mapped_class_str … … 495 501 end 496 502 SchemaElementDefinition.new( 497 varname, mapped_class, elename, as_any, as_array)503 varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array) 498 504 end 499 505 end trunk/lib/soap/mapping/schemadefinition.rb
r1805 r1810 15 15 16 16 class SchemaElementDefinition 17 attr_reader :varname, :mapped_class, :elename 17 attr_reader :varname, :mapped_class, :elename, :minoccurs, :maxoccurs 18 18 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) 20 21 @varname = varname 21 22 @mapped_class = mapped_class 22 23 @elename = elename 24 @minoccurs = minoccurs 25 @maxoccurs = maxoccurs 23 26 @as_any = as_any 24 27 @as_array = as_array trunk/lib/soap/mapping/wsdlliteralregistry.rb
r1809 r1810 78 78 ele = nil 79 79 qualified = (eledef.elementform == 'qualified') 80 if eledef.type 80 if obj.is_a?(SOAPNil) 81 ele = obj 82 elsif eledef.type 81 83 if type = @definedtypes[eledef.type] 82 84 ele = obj2typesoap(obj, type) … … 113 115 def simpleobj2soap(obj, type) 114 116 type.check_lexical_format(obj) 115 return SOAPNil.new if obj.nil? # TODO: check nillable.117 return SOAPNil.new if obj.nil? 116 118 if type.base 117 119 ele = base2soap(obj, TypeMap[type.base]) trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb
r1805 r1810 168 168 type = nil 169 169 end 170 occurrence = [0, nil] 170 171 if child_element and child_element.name 171 172 if child_element.map_as_array? 172 173 type << '[]' if type 174 occurrence = [child_element.minoccurs, child_element.maxoccurs] 173 175 end 174 176 child_element_name = child_element.name … … 177 179 end 178 180 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] 180 182 var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 181 183 dump_entry(@varname, var) trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb
r1805 r1810 29 29 dump_schema_element(definition, indent + 2) + "\n" + sp + "]" 30 30 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(', ') + ']' 40 37 end 41 38 end … … 47 44 dump_schema_element_definition(definition, indent) 48 45 }.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 49 62 end 50 63 … … 61 74 eleqname = XSD::AnyTypeName 62 75 type = nil 63 schema_element << [varname, eleqname, type] 76 occurrence = nil 77 schema_element << [varname, eleqname, type, occurrence] 64 78 when XMLSchema::Element 65 79 if element.type == XSD::AnyTypeName … … 96 110 eleqname = nil 97 111 end 98 schema_element << [varname, eleqname, type] 112 occurrence = [element.minoccurs, element.maxoccurs] 113 schema_element << [varname, eleqname, type, occurrence] 99 114 when WSDL::XMLSchema::Sequence 100 115 child_schema_element = parse_elements(element.elements, base_namespace) trunk/test/wsdl/rpc/test-rpc-lit.wsdl
r1809 r1810 35 35 <all> 36 36 <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" /> 39 39 </all> 40 40 </complexType> … … 56 56 <all> 57 57 <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" /> 60 60 <element ref="types:structItem" /> 61 61 </all> trunk/test/wsdl/rpc/test_rpc_lit.rb
r1803 r1810 298 298 end 299 299 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 300 350 def test_stub_echoNestedStruct 301 351 drv = SoapTestPortTypeRpcLit.new("http://localhost:#{Port}/") … … 314 364 end 315 365 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 316 379 ECHO_STRUCT_ARRAY_REQUEST = 317 380 %q[<?xml version="1.0" encoding="utf-8" ?>