Changeset 1739
- Timestamp:
- 10/21/06 00:51:38 (2 years ago)
- Files:
-
- trunk/lib/soap/encodingstyle/aspDotNetHandler.rb (modified) (1 diff)
- trunk/lib/soap/mapping/encodedregistry.rb (modified) (3 diffs)
- trunk/lib/soap/mapping/literalregistry.rb (modified) (6 diffs)
- trunk/lib/soap/mapping/mapping.rb (modified) (4 diffs)
- trunk/lib/soap/mapping/registry.rb (modified) (3 diffs)
- trunk/lib/soap/mapping/wsdlencodedregistry.rb (modified) (1 diff)
- trunk/lib/soap/rpc/element.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/definitions.rb (modified) (1 diff)
- trunk/lib/xsd/qname.rb (modified) (1 diff)
- trunk/test/wsdl/document/array/test_array.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/encodingstyle/aspDotNetHandler.rb
r1735 r1739 34 34 # should be qualified. propagate parent's namespace to children. 35 35 if data.elename.namespace.nil? 36 data.elename.namespace = parent.elename.namespace 36 data.elename = 37 XSD::QName.new(parent.elename.namespace, data.elename.name) 37 38 end 38 39 name = generator.encode_name(ns, data, attrs) trunk/lib/soap/mapping/encodedregistry.rb
r1731 r1739 363 363 end 364 364 end 365 if definition 366 conv, obj = soap2stubobj(node, klass, definition) 367 end 368 return obj if conv 365 if definition and node.is_a?(::SOAP::SOAPStruct) 366 return elesoap2stubobj(node, klass, definition) 367 end 369 368 if node.extraattr.key?(RubyTypeName) 370 369 conv, obj = @rubytype_factory.soap2obj(nil, node, nil, self) … … 450 449 return SOAPNil.new if obj.nil? 451 450 if definition.elements.size == 0 452 qname = XSD::QName.new(definition.ns, definition.name)453 451 ele = Mapping.obj2soap(obj) 454 ele.elename = qname452 ele.elename = definition.elename if definition.elename 455 453 return ele 456 454 else 457 typename = XSD::QName.new(definition.ns, definition.type) 458 ele = SOAPStruct.new(typename) 455 ele = SOAPStruct.new(definition.type) 459 456 mark_marshalled_obj(obj, ele) 460 457 end … … 478 475 end 479 476 480 def soap2stubobj(node, obj_class, definition) 481 return false unless node.is_a?(::SOAP::SOAPStruct) 477 def elesoap2stubobj(node, obj_class, definition) 482 478 obj = Mapping.create_empty_object(obj_class) 479 add_elesoap2stubobj(node, obj, definition) 480 obj 481 end 482 483 # XXX consider to merge with the method in LiteralRegistry 484 def add_elesoap2stubobj(node, obj, definition) 483 485 vars = {} 484 486 node.each do |name, value| 485 item = definition.elements.find { |k, v| k.elename.name == name } 487 item = definition.elements.find { |k, v| 488 k.elename == value.elename 489 } 486 490 if item 487 child = soap2typedobj(value, item. type)491 child = soap2typedobj(value, item.mapped_class) 488 492 else 493 # unknown element is treated as anyType. 489 494 child = Mapping._soap2obj(value, self) 490 495 end 491 496 if item and item.as_array? 492 497 (vars[name] ||= []) << child 498 elsif vars.key?(name) 499 vars[name] = [vars[name], child].flatten 493 500 else 494 501 vars[name] = child 495 502 end 496 503 end 497 if obj.is_a?(::Array) 498 obj.replace(vars.values .flatten)504 if obj.is_a?(::Array) and vars.keys.size == 1 505 obj.replace(vars.values[0]) 499 506 else 500 507 Mapping.set_attributes(obj, vars) 501 508 end 502 return true, obj 503 end 504 505 def soap2typedobj(value, typename) 506 if klass = Mapping.class_from_name(typename) 507 if klass.ancestors.include?(::SOAP::SOAPBasetype) 508 if value.respond_to?(:data) 509 obj = klass.new(value.data).data 510 else 511 obj = klass.new(nil).data 512 end 513 else 514 obj = Mapping._soap2obj(value, self, klass) 515 end 516 elsif klass = Mapping.module_from_name(eledef.type) 517 # simpletype 518 if value.respond_to?(:data) 519 obj = value.data 520 else 521 raise MappingError.new("cannot map to a module value: #{eledef.type}") 522 end 509 end 510 511 def soap2typedobj(value, klass) 512 unless klass 513 raise MappingError.new("unknown class: #{klass}") 514 end 515 if klass.ancestors.include?(::SOAP::SOAPBasetype) 516 obj = base2obj(value, klass) 523 517 else 524 raise MappingError.new("unknown class/module: #{eledef.type}")518 obj = Mapping._soap2obj(value, self, klass) 525 519 end 526 520 obj trunk/lib/soap/mapping/literalregistry.rb
r1735 r1739 106 106 ele.qualified = definition.qualified 107 107 if definition.type 108 ele.extraattr[XSD::AttrTypeName] = 109 XSD::QName.new(definition.ns, definition.type) 108 ele.extraattr[XSD::AttrTypeName] = definition.type 110 109 end 111 110 any = nil … … 167 166 end 168 167 end 169 if node.is_a?( SOAPElement) or node.is_a?(SOAPStruct)168 if node.is_a?(::SOAP::SOAPElement) or node.is_a?(::SOAP::SOAPStruct) 170 169 if definition 171 170 return elesoap2stubobj(node, obj_class, definition) … … 206 205 vars = {} 207 206 node.each do |name, value| 208 item = definition.elements.find { |k, v| k.elename.name == name } 207 item = definition.elements.find { |k, v| 208 k.elename == value.elename 209 } 209 210 if item 210 child = elesoapchild2obj(value, definition.ns,item)211 child = elesoapchild2obj(value, item) 211 212 else 212 213 # unknown element is treated as anyType. … … 215 216 if item and item.as_array? 216 217 (vars[name] ||= []) << child 218 elsif vars.key?(name) 219 vars[name] = [vars[name], child].flatten 217 220 else 218 221 vars[name] = child 219 222 end 220 223 end 221 if obj.is_a?(::Array) 222 obj.replace(vars.values .flatten)224 if obj.is_a?(::Array) and vars.keys.size == 1 225 obj.replace(vars.values[0]) 223 226 else 224 227 Mapping.set_attributes(obj, vars) … … 226 229 end 227 230 228 def elesoapchild2obj(value, ns,eledef)231 def elesoapchild2obj(value, eledef) 229 232 child_definition = schema_definition_from_elename(eledef.elename) 230 233 if child_definition 231 234 any2obj(value, child_definition.class_for) 232 elsif eledef.type 233 child_definition = 234 schema_definition_from_type(XSD::QName.new(ns, eledef.type)) 235 elsif eledef.mapped_class 236 child_definition = schema_definition_from_class(eledef.mapped_class) 235 237 if child_definition 236 238 any2obj(value, child_definition.class_for) 237 elsif klass = Mapping.class_from_name(eledef.type) 238 # klass must be a SOAPBasetype or a class 239 if klass.ancestors.include?(::SOAP::SOAPBasetype) 240 if value.respond_to?(:data) 241 klass.new(value.data).data 242 else 243 klass.new(nil).data 244 end 239 else 240 if eledef.mapped_class.ancestors.include?(::SOAP::SOAPBasetype) 241 base2obj(value, eledef.mapped_class) 245 242 else 246 any2obj(value, klass) 247 end 248 elsif klass = Mapping.module_from_name(eledef.type) 249 # simpletype 250 if value.respond_to?(:data) 251 value.data 252 else 253 raise MappingError.new("cannot map to a module value: #{eledef.type}") 254 end 255 else 256 raise MappingError.new("unknown class/module: #{eledef.type}") 243 any2obj(value, eledef.mapped_class) 244 end 257 245 end 258 246 else … … 269 257 attr = node.extraattr[qname] 270 258 next if attr.nil? or attr.empty? 271 klass = Mapping.class_from_name(class_name) 272 if klass.ancestors.include?(::SOAP::SOAPBasetype) 273 child = klass.new(attr).data 274 else 275 child = attr 259 child = attr 260 if class_name 261 klass = Mapping.class_from_name(class_name) 262 if klass.ancestors.include?(::SOAP::SOAPBasetype) 263 child = klass.new(attr).data 264 end 276 265 end 277 266 obj.__xmlattr[qname] = child trunk/lib/soap/mapping/mapping.rb
r1724 r1739 229 229 230 230 def self.class2element(klass) 231 type = Mapping.class2qname(klass)232 type.name ||=Mapping.name2elename(klass.name)233 type.namespace ||=RubyCustomTypeNamespace234 type231 name = schema_type_definition(klass) || 232 Mapping.name2elename(klass.name) 233 namespace = schema_ns_definition(klass) || RubyCustomTypeNamespace 234 XSD::QName.new(namespace, name) 235 235 end 236 236 … … 404 404 schema_element = definition[:schema_element] 405 405 schema_attributes = definition[:schema_attribute] 406 definition = SchemaDefinition.new(klass, schema_ns, schema_name, 407 schema_type, schema_qualified) 406 elename = schema_name ? XSD::QName.new(schema_ns, schema_name) : nil 407 type = schema_type ? XSD::QName.new(schema_ns, schema_type) : nil 408 definition = SchemaDefinition.new(klass, elename, type, schema_qualified) 408 409 definition.attributes = schema_attributes 409 410 if schema_element 410 if schema_element[0] == :choice 411 schema_element.shift 412 definition.set_choice 413 end 414 schema_element.each do |element| 415 varname, info = element 416 class_name, name = info 417 as_array = klass.ancestors.include?(::Array) 418 if /\[\]$/ =~ class_name 419 class_name = class_name.sub(/\[\]$/, '') 420 if class_name.empty? 421 class_name = nil 422 end 423 as_array = true 424 end 425 if name == XSD::AnyTypeName 426 definition.set_any 427 end 428 definition.elements << 429 SchemaElementDefinition.new( 430 varname, 431 name || XSD::QName.new(schema_ns, varname), 432 class_name, 433 as_array 434 ) 411 if schema_element.respond_to?(:is_concrete_definition) and 412 schema_element.is_concrete_definition 413 definition.elements.replace(schema_element) 414 else 415 parse_schema_element_definition(klass, definition, schema_element) 435 416 end 436 417 end … … 438 419 end 439 420 421 # for backward compatibility 422 def self.parse_schema_element_definition(klass, definition, schema_element) 423 if schema_element[0] == :choice 424 schema_element.shift 425 definition.set_choice 426 end 427 schema_element.each do |element| 428 varname, info = element 429 mapped_class, elename = info 430 as_array = klass.ancestors.include?(::Array) 431 if /\[\]$/ =~ mapped_class 432 mapped_class = mapped_class.sub(/\[\]$/, '') 433 if mapped_class.empty? 434 mapped_class = nil 435 end 436 as_array = true 437 end 438 if mapped_class 439 mapped_class = Mapping.class_from_name(mapped_class) 440 end 441 if elename == XSD::AnyTypeName 442 definition.set_any 443 elsif elename.nil? 444 ns ||= definition.elename.namespace if definition.elename 445 ns ||= definition.type.namespace if definition.type 446 elename = XSD::QName.new(ns, varname) 447 end 448 definition.elements << 449 SchemaElementDefinition.new(varname, mapped_class, elename, as_array) 450 end 451 end 452 440 453 class SchemaElementDefinition 441 attr_reader :varname, : elename, :type442 443 def initialize(varname, elename, type, as_array)454 attr_reader :varname, :mapped_class, :elename 455 456 def initialize(varname, mapped_class, elename, as_array) 444 457 @varname = varname 458 @mapped_class = mapped_class 445 459 @elename = elename 446 @type = type447 460 @as_array = as_array 448 461 end … … 451 464 @as_array 452 465 end 466 467 def is_concrete_definition 468 true 469 end 470 end 471 472 class SchemaElementChoiceDefinition < ::Array 473 def is_concrete_definition 474 true 475 end 453 476 end 454 477 455 478 class SchemaDefinition 456 attr_reader :class_for, :ns, :name, :type, :qualified, :elements 479 attr_reader :class_for 480 attr_reader :elename, :type 481 attr_reader :qualified, :elements 457 482 attr_accessor :attributes 458 483 459 def initialize(class_for, ns,name, type, qualified)484 def initialize(class_for, elename, type, qualified) 460 485 @class_for = class_for 461 @ns = ns 462 @name = name 486 @elename = elename 463 487 @type = type 464 488 @qualified = qualified trunk/lib/soap/mapping/registry.rb
r1731 r1739 187 187 definition = Mapping.create_schema_definition(obj_class, definition) 188 188 @class_schema_definition[obj_class] = definition 189 if definition.name 190 qname = XSD::QName.new(definition.ns, definition.name) 191 @elename_schema_definition[qname] = definition 189 if definition.elename 190 @elename_schema_definition[definition.elename] = definition 192 191 end 193 192 if definition.type 194 qname = XSD::QName.new(definition.ns, definition.type) 195 @type_schema_definition[qname] = definition 193 @type_schema_definition[definition.type] = definition 196 194 end 197 195 end … … 237 235 if type <= XSD::XSDString 238 236 str = XSD::Charset.encoding_conv(obj.to_s, 239 Thread.current[:SOAPMapping][:ExternalCES], XSD::Charset.encoding) 237 Thread.current[:SOAPMapping][:ExternalCES], 238 XSD::Charset.encoding) 240 239 soap_obj = type.new(str) 241 240 else … … 245 244 soap_obj 246 245 end 247 end 248 249 250 end 251 end 246 247 def base2obj(value, klass) 248 if value.respond_to?(:data) 249 klass.new(value.data).data 250 else 251 klass.new(nil).data 252 end 253 end 254 end 255 256 257 end 258 end trunk/lib/soap/mapping/wsdlencodedregistry.rb
r1731 r1739 224 224 vars = {} 225 225 node.each do |name, value| 226 item = definition.elements.find { |k, v| k.elename.name == name } 227 if item and item.type 228 if klass = Mapping.class_from_name(item.type) 229 # klass must be a SOAPBasetype or a class 230 if klass.ancestors.include?(::SOAP::SOAPBasetype) 231 if value.respond_to?(:data) 232 child = klass.new(value.data).data 233 else 234 child = klass.new(nil).data 235 end 226 item = definition.elements.find { |k, v| k.elename == value.elename } 227 if item and item.mapped_class 228 # klass must be a SOAPBasetype or a class 229 if item.mapped_class.ancestors.include?(::SOAP::SOAPBasetype) 230 if value.respond_to?(:data) 231 child = item.mapped_class.new(value.data).data 236 232 else 237 child = Mapping._soap2obj(value, self, klass) 238 end 239 elsif klass = Mapping.module_from_name(item.type) 240 # simpletype 241 if value.respond_to?(:data) 242 child = value.data 243 else 244 raise MappingError.new("cannot map to a module value: #{item.type}") 233 child = item.mapped_class.new(nil).data 245 234 end 246 235 else 247 raise MappingError.new("unknown class: #{item.type}")236 child = Mapping._soap2obj(value, self, item.mapped_class) 248 237 end 249 238 else # untyped element is treated as anyType. trunk/lib/soap/rpc/element.rb
r1731 r1739 116 116 params.each do |param, data| 117 117 @inparam[param] = data 118 data.elename .name = param118 data.elename = XSD::QName.new(data.elename.namespace, param) 119 119 data.parent = self 120 120 end … … 124 124 params.each do |param, data| 125 125 @outparam[param] = data 126 data.elename .name = param126 data.elename = XSD::QName.new(data.elename.namespace, param) 127 127 end 128 128 end trunk/lib/wsdl/soap/definitions.rb
r1643 r1739 31 31 attr = XMLSchema::Attribute.new 32 32 attr.ref = ::SOAP::AttrArrayTypeName 33 anytype = XSD::AnyTypeName.dup 34 anytype.name += '[]' 35 attr.arytype = anytype 33 anyarray = XSD::QName.new( 34 XSD::AnyTypeName.namespace, 35 XSD::AnyTypeName.name + '[]') 36 attr.arytype = anyarray 36 37 type.complexcontent.restriction.attributes << attr 37 38 type trunk/lib/xsd/qname.rb
r1604 r1739 11 11 12 12 class QName 13 attr_ accessor :namespace14 attr_ accessor :name13 attr_reader :namespace 14 attr_reader :name 15 15 attr_accessor :source 16 16 trunk/test/wsdl/document/array/test_array.rb
r1731 r1739 104 104 @client.literal_mapping_registry = DoubleMappingRegistry::LiteralRegistry 105 105 @client.wiredump_dev = STDOUT if $DEBUG 106 arg = {:ary => {:double => [0.1, 0.2, 0.3]}} 107 assert_equal(arg[:ary][:double], @client.echo(arg).ary) 106 double = [0.1, 0.2, 0.3] 107 arg = { 108 :ary => { 109 XSD::QName.new("http://tempuri.org/", "double") => double 110 } 111 } 112 assert_equal(double, @client.echo(arg).ary) 108 113 end 109 114 end