Changeset 1775
- Timestamp:
- 05/15/07 17:44:09 (2 years ago)
- Files:
-
- trunk/lib/soap/mapping/encodedregistry.rb (modified) (6 diffs)
- trunk/lib/soap/mapping/mapping.rb (modified) (1 diff)
- trunk/lib/soap/rpc/element.rb (modified) (5 diffs)
- trunk/lib/soap/rpc/proxy.rb (modified) (2 diffs)
- trunk/lib/soap/wsdlDriver.rb (modified) (1 diff)
- trunk/lib/wsdl/soap/methodDefCreator.rb (modified) (2 diffs)
- trunk/test/wsdl/rpc/rpc.wsdl (modified) (3 diffs)
- trunk/test/wsdl/rpc/test_rpc.rb (modified) (4 diffs)
- trunk/test/wsdl/simpletype/rpc/expectedDriver.rb (modified) (2 diffs)
- trunk/test/wsdl/simpletype/rpc/expectedService.rb (modified) (2 diffs)
- trunk/test/wsdl/soap/wsdl2ruby/expectedDriver.rb (modified) (2 diffs)
- trunk/test/wsdl/soap/wsdl2ruby/expectedService.cgi (modified) (2 diffs)
- trunk/test/wsdl/soap/wsdl2ruby/expectedService.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/encodedregistry.rb
r1771 r1775 296 296 alias set add 297 297 298 # general Registry ignores type_qname299 298 def obj2soap(obj, type_qname = nil) 300 soap = _obj2soap(obj )299 soap = _obj2soap(obj, type_qname) 301 300 if @allow_original_mapping 302 301 addextend2soap(soap, obj) … … 324 323 private 325 324 326 def _obj2soap(obj )325 def _obj2soap(obj, type_qname = nil) 327 326 ret = nil 328 327 if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray) … … 333 332 elsif obj.is_a?(SOAPBasetype) 334 333 return obj 334 elsif type_qname && type = TypeMap[type_qname] 335 return base2soap(obj, type) 335 336 end 336 337 begin … … 354 355 # Might return nil as a mapping result. 355 356 def _soap2obj(node, klass = nil) 357 definition = find_node_definition(node) 356 358 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) 360 361 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 364 367 end 365 368 if definition and node.is_a?(::SOAP::SOAPStruct) … … 370 373 return obj if conv 371 374 end 372 conv, obj = @map.soap2obj(node , klass)375 conv, obj = @map.soap2obj(node) 373 376 return obj if conv 374 377 conv, obj = @default_factory.soap2obj(nil, node, nil, self) … … 529 532 obj 530 533 end 534 535 def find_node_definition(node) 536 schema_definition_from_elename(node.elename) || schema_definition_from_type(node.type) 537 end 531 538 end 532 539 trunk/lib/soap/mapping/mapping.rb
r1740 r1775 43 43 end 44 44 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 45 58 end 46 59 trunk/lib/soap/rpc/element.rb
r1739 r1775 113 113 end 114 114 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 115 123 def set_param(params) 116 124 params.each do |param, data| … … 130 138 def get_paramtypes(names) 131 139 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 135 143 end 136 144 end … … 190 198 private 191 199 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 192 208 def collect_params(*type) 193 209 names = [] 194 @signature.each do |io_type, name, param_type|210 @signature.each do |io_type, name, type_qname| 195 211 names << name if type.include?(io_type) 196 212 end … … 200 216 def init_param(param_def) 201 217 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 202 227 case io_type 203 228 when IN 204 @signature.push([IN, name, param_type])229 @signature.push([IN, name, type_qname]) 205 230 @inparam_names.push(name) 206 231 when OUT 207 @signature.push([OUT, name, param_type])232 @signature.push([OUT, name, type_qname]) 208 233 @outparam_names.push(name) 209 234 when INOUT 210 @signature.push([INOUT, name, param_type])235 @signature.push([INOUT, name, type_qname]) 211 236 @inoutparam_names.push(name) 212 237 when RETVAL … … 216 241 @retval_name = name 217 242 @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 225 244 else 226 245 raise MethodDefinitionError.new("unknown type: #{io_type}") trunk/lib/soap/rpc/proxy.rb
r1731 r1775 456 456 method = @rpc_method_factory.dup 457 457 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 460 464 method.set_param(soap) 461 465 method … … 546 550 } 547 551 end 548 549 def create_request_obj(names, params)550 o = Object.new551 idx = 0552 while idx < params.length553 o.instance_variable_set('@' + names[idx], params[idx])554 idx += 1555 end556 o557 end558 552 end 559 553 end trunk/lib/soap/wsdlDriver.rb
r1731 r1775 135 135 # "::SOAP::SOAPStruct". turn this String to a class. 136 136 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] 138 138 [io, name, typedef] 139 139 } trunk/lib/wsdl/soap/methodDefCreator.rb
r1766 r1775 154 154 ['::' + mapped.name] 155 155 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] 161 157 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] 164 159 elsif definedtype = @complextypes[part.type] 165 160 case definedtype.compoundtype … … 243 238 def type2str(type) 244 239 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])}]" 248 243 end 249 244 end trunk/test/wsdl/rpc/rpc.wsdl
r1698 r1775 13 13 <xsd:element name="family-name" type="xsd:string" /> 14 14 <xsd:element name="Given_name" type="xsd:string" /> 15 <xsd:element name="age" type="xsd: int" />15 <xsd:element name="age" type="xsd:long" /> 16 16 <xsd:element name="gender" type="txd:gender" /> 17 17 <xsd:element name="link" type="txd:person" /> … … 37 37 </message> 38 38 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 39 48 <portType name="echo_port_type"> 40 49 <operation name="echo"> 41 50 <input message="tns:echo_in"/> 42 51 <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"/> 43 57 </operation> 44 58 … … 52 66 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/> 53 67 <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"> 54 80 <soap:operation soapAction=""/> 55 81 <input> trunk/test/wsdl/rpc/test_rpc.rb
r1755 r1775 13 13 def on_init 14 14 add_rpc_method(self, 'echo', 'arg1', 'arg2') 15 add_rpc_method(self, 'echo_basetype', 'arg1', 'arg2') 15 16 add_rpc_method(self, 'echo_err', 'arg1', 'arg2') 16 17 self.mapping_registry = Prefix::EchoMappingRegistry::EncodedRegistry … … 39 40 end 40 41 ret 42 end 43 44 def echo_basetype(arg1, arg2) 45 raise unless arg1.is_a?(Date) 46 arg1 41 47 end 42 48 … … 134 140 assert_equal("Hi", ret.family_name) 135 141 assert_equal("Na", ret.given_name) 136 # XXX WSDLEncodedRegistry should decode unt eyped element using Schema142 # XXX WSDLEncodedRegistry should decode untyped element using Schema 137 143 assert_equal("21", ret.age) 138 144 … … 172 178 assert_nil(ret.age) 173 179 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 174 189 end 175 190 trunk/test/wsdl/simpletype/rpc/expectedDriver.rb
r1755 r1775 10 10 "urn:example.com:simpletype-rpc", 11 11 "echo_version", 12 [ ["in", "version", [ "::SOAP::SOAPString"]],12 [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 13 13 ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 14 14 { :request_style => :rpc, :request_use => :encoded, … … 20 20 "echo_version_r", 21 21 [ ["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"]] ], 23 23 { :request_style => :rpc, :request_use => :encoded, 24 24 :response_style => :rpc, :response_use => :encoded, trunk/test/wsdl/simpletype/rpc/expectedService.rb
r1755 r1775 9 9 "urn:example.com:simpletype-rpc", 10 10 "echo_version", 11 [ ["in", "version", [ "::SOAP::SOAPString"]],11 [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 12 12 ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 13 13 { :request_style => :rpc, :request_use => :encoded, … … 19 19 "echo_version_r", 20 20 [ ["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"]] ], 22 22 { :request_style => :rpc, :request_use => :encoded, 23 23 :response_style => :rpc, :response_use => :encoded, trunk/test/wsdl/soap/wsdl2ruby/expectedDriver.rb
r1755 r1775 10 10 "urn:example.com:simpletype-rpc", 11 11 "echo_version", 12 [ ["in", "version", [ "::SOAP::SOAPString"]],12 [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 13 13 ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 14 14 { :request_style => :rpc, :request_use => :encoded, … … 20 20 "echo_version_r", 21 21 [ ["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"]] ], 23 23 { :request_style => :rpc, :request_use => :encoded, 24 24 :response_style => :rpc, :response_use => :encoded, trunk/test/wsdl/soap/wsdl2ruby/expectedService.cgi
r1755 r1775 9 9 "urn:example.com:simpletype-rpc", 10 10 "echo_version", 11 [ ["in", "version", [ "::SOAP::SOAPString"]],11 [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 12 12 ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 13 13 { :request_style => :rpc, :request_use => :encoded, … … 19 19 "echo_version_r", 20 20 [ ["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"]] ], 22 22 { :request_style => :rpc, :request_use => :encoded, 23 23 :response_style => :rpc, :response_use => :encoded, trunk/test/wsdl/soap/wsdl2ruby/expectedService.rb
r1755 r1775 9 9 "urn:example.com:simpletype-rpc", 10 10 "echo_version", 11 [ ["in", "version", [ "::SOAP::SOAPString"]],11 [ ["in", "version", [nil, "urn:example.com:simpletype-rpc-type", "version"]], 12 12 ["retval", "version_struct", ["Version_struct", "urn:example.com:simpletype-rpc-type", "version_struct"]] ], 13 13 { :request_style => :rpc, :request_use => :encoded, … … 19 19 "echo_version_r", 20 20 [ ["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"]] ], 22 22 { :request_style => :rpc, :request_use => :encoded, 23 23 :response_style => :rpc, :response_use => :encoded,