Changeset 1655
- Timestamp:
- 10/30/05 22:10:25 (3 years ago)
- Files:
-
- trunk/lib/soap/mapping/mapping.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/wsdlencodedregistry.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/wsdlliteralregistry.rb (modified) (7 diffs)
- trunk/lib/wsdl/soap/classDefCreator.rb (modified) (9 diffs)
- trunk/test/wsdl/any/expectedEcho.rb (modified) (1 diff)
- trunk/test/wsdl/marshal/person_org.rb (modified) (1 diff)
- trunk/test/wsdl/ref/expectedProduct.rb (modified) (3 diffs)
- trunk/test/wsdl/simpletype/rpc/expectedEchoVersion.rb (modified) (1 diff)
- trunk/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb (modified) (1 diff)
- trunk/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/mapping.rb
r1650 r1655 348 348 return nil unless schema_element 349 349 schema_ns = schema_ns_definition(klass) 350 elements = [] 351 as_array = [] 352 have_any = false 353 schema_element.each do |varname, definition| 354 class_name, name = definition 355 if /\[\]$/ =~ class_name 356 class_name = class_name.sub(/\[\]$/, '') 357 as_array << (name ? name.name : varname) 358 end 359 if name == XSD::AnyTypeName 360 have_any = true 361 end 362 elements << 363 [name || XSD::QName.new(schema_ns, varname), class_name] 364 end 365 [elements, as_array, have_any] 350 parse_schema_element_definition(schema_ns, schema_element) 351 end 352 353 class SchemaElementDefinition 354 attr_reader :elename, :type 355 356 def initialize(elename, type, as_array) 357 @elename = elename 358 @type = type 359 @as_array = as_array 360 end 361 362 def as_array? 363 @as_array 364 end 365 end 366 367 class SchemaDefinition 368 attr_reader :elements 369 370 def initialize(*arg) 371 super 372 @elements = [] 373 @choice = false 374 @any = false 375 end 376 377 def choice? 378 @choice 379 end 380 381 def have_any? 382 @any 383 end 384 385 def set_choice 386 @choice = true 387 end 388 389 def set_any 390 @any = true 391 end 366 392 end 367 393 … … 372 398 class << Mapping 373 399 private 400 401 def parse_schema_element_definition(schema_ns, schema_element) 402 definition = SchemaDefinition.new 403 if schema_element[0] == :choice 404 schema_element.shift 405 definition.set_choice 406 end 407 schema_element.each do |element| 408 varname, info = element 409 class_name, name = info 410 as_array = false 411 if /\[\]$/ =~ class_name 412 class_name = class_name.sub(/\[\]$/, '') 413 as_array = true 414 end 415 if name == XSD::AnyTypeName 416 definition.set_any 417 end 418 definition.elements << SchemaElementDefinition.new( 419 name || XSD::QName.new(schema_ns, varname), class_name, as_array) 420 end 421 definition 422 end 374 423 375 424 def class_schema_variable(sym, klass) trunk/lib/soap/mapping/wsdlencodedregistry.rb
r1652 r1655 233 233 234 234 def add_elements2stubobj(node, obj) 235 elements, as_array= schema_element_definition(obj.class)235 definition = schema_element_definition(obj.class) 236 236 vars = {} 237 237 node.each do |name, value| 238 item = elements.find { |k, v| k.name == name }238 item = definition.elements.find { |k, v| k.elename.name == name } 239 239 if item 240 elename, class_name = item 241 if klass = Mapping.class_from_name(class_name) 240 if klass = Mapping.class_from_name(item.type) 242 241 # klass must be a SOAPBasetype or a class 243 242 if klass.ancestors.include?(::SOAP::SOAPBasetype) … … 250 249 child = Mapping._soap2obj(value, self, klass) 251 250 end 252 elsif klass = Mapping.module_from_name( class_name)251 elsif klass = Mapping.module_from_name(item.type) 253 252 # simpletype 254 253 if value.respond_to?(:data) 255 254 child = value.data 256 255 else 257 raise MappingError.new( 258 "cannot map to a module value: #{class_name}") 256 raise MappingError.new("cannot map to a module value: #{item.type}") 259 257 end 260 258 else 261 raise MappingError.new("unknown class: #{ class_name}")259 raise MappingError.new("unknown class: #{item.type}") 262 260 end 263 261 else # untyped element is treated as anyType. trunk/lib/soap/mapping/wsdlliteralregistry.rb
r1653 r1655 162 162 end 163 163 elements.each do |child_ele| 164 break if complexobj2soapchildren(obj, ele, child_ele )164 break if complexobj2soapchildren(obj, ele, child_ele, true) 165 165 end 166 166 ele 167 167 end 168 168 169 def complexobj2soapchildren(obj, ele, child_ele )169 def complexobj2soapchildren(obj, ele, child_ele, allow_nil_value = false) 170 170 if child_ele.map_as_array? 171 171 child = Mapping.get_attribute(obj, child_ele.name.name) … … 174 174 end 175 175 if child.nil? 176 return false if allow_nil_value 176 177 if child_soap = nil2soap(child_ele) 177 178 ele.add(child_soap) … … 188 189 child = Mapping.get_attribute(obj, child_ele.name.name) 189 190 if child.nil? 191 return false if allow_nil_value 190 192 if child_soap = nil2soap(child_ele) 191 193 ele.add(child_soap) … … 290 292 291 293 def add_elements2soap(obj, ele) 292 elements, as_array, have_any= schema_element_definition(obj.class)294 definition = schema_element_definition(obj.class) 293 295 any = nil 294 if have_any 295 any = scan_any(obj, elements) 296 end 297 if elements 298 elements.each do |elename, type| 299 if elename == XSD::AnyTypeName 300 if any 301 SOAPElement.from_objs(any).each do |child| 302 ele.add(child) 303 end 304 end 305 elsif child = Mapping.get_attribute(obj, elename.name) 306 if as_array.include?(elename.name) 307 child.each do |item| 308 ele.add(obj2soap(item, elename)) 309 end 310 else 311 ele.add(obj2soap(child, elename)) 312 end 313 elsif obj.is_a?(::Array) and as_array.include?(elename.name) 314 obj.each do |item| 315 ele.add(obj2soap(item, elename)) 316 end 296 if definition.have_any? 297 any = scan_any(obj, definition.elements) 298 end 299 definition.elements.each do |eledef| 300 if eledef.elename == XSD::AnyTypeName 301 if any 302 SOAPElement.from_objs(any).each do |child| 303 ele.add(child) 304 end 305 end 306 elsif child = Mapping.get_attribute(obj, eledef.elename.name) 307 if eledef.as_array? 308 child.each do |item| 309 ele.add(obj2soap(item, eledef.elename)) 310 end 311 else 312 ele.add(obj2soap(child, eledef.elename)) 313 end 314 elsif obj.is_a?(::Array) and eledef.as_array? 315 obj.each do |item| 316 ele.add(obj2soap(item, eledef.elename)) 317 317 end 318 318 end … … 384 384 385 385 def add_elesoap2stubobj(node, obj) 386 elements, as_array= schema_element_definition(obj.class)386 definition = schema_element_definition(obj.class) 387 387 vars = {} 388 388 node.each do |name, value| 389 item = elements.find { |k, v| k.name == name }389 item = definition.elements.find { |k, v| k.elename.name == name } 390 390 if item 391 elename, class_name = item 392 if klass = Mapping.class_from_name(class_name) 391 if klass = Mapping.class_from_name(item.type) 393 392 # klass must be a SOAPBasetype or a class 394 393 if klass.ancestors.include?(::SOAP::SOAPBasetype) … … 401 400 child = any2obj(value, klass) 402 401 end 403 elsif klass = Mapping.module_from_name( class_name)402 elsif klass = Mapping.module_from_name(item.type) 404 403 # simpletype 405 404 if value.respond_to?(:data) 406 405 child = value.data 407 406 else 408 raise MappingError.new( 409 "cannot map to a module value: #{class_name}") 407 raise MappingError.new("cannot map to a module value: #{item.type}") 410 408 end 411 409 else 412 raise MappingError.new("unknown class/module: #{ class_name}")410 raise MappingError.new("unknown class/module: #{item.type}") 413 411 end 414 412 else # untyped element is treated as anyType. 415 413 child = any2obj(value) 416 414 end 417 if item and as_array.include?(elename.name)415 if item and item.as_array? 418 416 (vars[name] ||= []) << child 419 417 else … … 508 506 # changed while a lifetime of a WSDLLiteralRegistry. 509 507 def schema_element_definition(klass) 510 @schema_element_cache[klass] ||= 511 Mapping.schema_element_definition(klass) 508 @schema_element_cache[klass] ||= Mapping.schema_element_definition(klass) 512 509 end 513 510 trunk/lib/wsdl/soap/classDefCreator.rb
r1653 r1655 1 1 # WSDL4R - Creating class definition from WSDL 2 # Copyright (C) 2002, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.2 # Copyright (C) 2002, 2003, 2004, 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 3 3 4 4 # This program is copyrighted free software by NAKAMURA, Hiroshi. You can … … 135 135 schema_element, init_lines, init_params = 136 136 parse_elements(c, typedef.elements, qname.namespace) 137 if typedef.choice? 138 schema_element.unshift(:choice) 139 end 137 140 unless typedef.attributes.empty? 138 141 define_attribute(c, typedef.attributes) … … 140 143 end 141 144 c.def_classvar('schema_element', 142 "[\n " + 143 schema_element.collect { |definition| 144 dump_schema_element_definition(definition) 145 }.join(", \n ") + 146 "\n]" 145 dump_schema_element_definition(schema_element, 2) 147 146 ) 148 147 c.def_method('initialize', *init_params) do … … 152 151 end 153 152 154 def dump_schema_element(schema_element) 155 schema_element.collect { |definition| 156 dump_schema_element_definition(definition) 157 }.join(', ') 158 end 159 160 def dump_schema_element_definition(definition) 161 if definition[0] == :sequence 153 def dump_schema_element_definition(definition, indent = 0) 154 return '[]' if definition.empty? 155 if definition[0] == :choice 162 156 definition.shift 163 '[ :sequence, ' + dump_schema_element(definition) + ']' 164 elsif definition[0] == :choice 165 definition.shift 166 '[ :choice, ' + dump_schema_element(definition) + ']' 157 "[ :choice,\n" + ' ' * indent + 158 dump_schema_element(definition, indent) + ']' 159 elsif definition[0].is_a?(::Array) 160 "[\n" + ' ' * indent + 161 dump_schema_element(definition, indent) + ']' 167 162 else 168 163 varname, name, type = definition … … 177 172 ']' 178 173 end 174 end 175 176 def dump_schema_element(schema_element, indent = 0) 177 delimiter = ",\n" + " " * indent 178 schema_element.collect { |definition| 179 dump_schema_element_definition(definition, indent + 2) 180 }.join(delimiter) 179 181 end 180 182 … … 207 209 elsif element.type 208 210 type = create_class_name(element.type) 211 elsif element.ref 212 type = create_class_name(element.ref) 209 213 else 210 214 type = nil # means anyType. … … 229 233 end 230 234 # nil means @@schema_ns + varname 231 if element.name && varname == name &&232 element.name.namespace == base_namespace235 eleqname = element.name || element.ref.name 236 if eleqname && varname == name && eleqname.namespace == base_namespace 233 237 eleqname = nil 234 else235 eleqname = element.name236 238 end 237 239 schema_element << [varname, eleqname, type] … … 239 241 child_schema_element, child_init_lines, child_init_params = 240 242 parse_elements(c, element.elements, base_namespace) 241 schema_element << [:sequence].concat(child_schema_element)243 schema_element << child_schema_element 242 244 init_lines.concat(child_init_lines) 243 245 init_params.concat(child_init_params) … … 245 247 child_schema_element, child_init_lines, child_init_params = 246 248 parse_elements(c, element.elements, base_namespace) 247 schema_element << [:choice].concat(child_schema_element) 249 child_schema_element.unshift(:choice) 250 schema_element << child_schema_element 248 251 init_lines.concat(child_init_lines) 249 252 init_params.concat(child_init_params) trunk/test/wsdl/any/expectedEcho.rb
r1653 r1655 6 6 @@schema_ns = "urn:example.com:echo-type" 7 7 @@schema_element = [ 8 ["before", ["SOAP::SOAPString", XSD::QName.new(nil, "before")]], 9 ["any", [nil, XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType")]], 10 ["after", ["SOAP::SOAPString", XSD::QName.new(nil, "after")]] 11 ] 8 ["before", ["SOAP::SOAPString", XSD::QName.new(nil, "before")]], 9 ["any", [nil, XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType")]], 10 ["after", ["SOAP::SOAPString", XSD::QName.new(nil, "after")]]] 12 11 13 12 attr_accessor :before trunk/test/wsdl/marshal/person_org.rb
r1653 r1655 6 6 @@schema_ns = "http://www.jin.gr.jp/~nahi/xmlns/sample/Person" 7 7 @@schema_element = [ 8 ["familyname", ["SOAP::SOAPString", XSD::QName.new(nil, "familyname")]], 9 ["givenname", ["SOAP::SOAPString", XSD::QName.new(nil, "givenname")]], 10 ["var1", ["SOAP::SOAPInt", XSD::QName.new(nil, "var1")]], 11 ["var2", ["SOAP::SOAPDouble", XSD::QName.new(nil, "var2")]], 12 ["var3", ["SOAP::SOAPString", XSD::QName.new(nil, "var3")]] 13 ] 8 ["familyname", ["SOAP::SOAPString", XSD::QName.new(nil, "familyname")]], 9 ["givenname", ["SOAP::SOAPString", XSD::QName.new(nil, "givenname")]], 10 ["var1", ["SOAP::SOAPInt", XSD::QName.new(nil, "var1")]], 11 ["var2", ["SOAP::SOAPDouble", XSD::QName.new(nil, "var2")]], 12 ["var3", ["SOAP::SOAPString", XSD::QName.new(nil, "var3")]]] 14 13 15 14 attr_accessor :familyname trunk/test/wsdl/ref/expectedProduct.rb
r1653 r1655 14 14 @@schema_attribute = {XSD::QName.new("urn:product", "version") => "SOAP::SOAPString", XSD::QName.new("urn:product", "yesno") => "SOAP::SOAPString"} 15 15 @@schema_element = [ 16 ["bag", ["Product[]", XSD::QName.new(nil, "bag")]], 17 ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")]], 18 ["product_Bag", [nil, XSD::QName.new("urn:product", "Product-Bag")]], 19 ["comment_1", [nil, XSD::QName.new(nil, "comment_1")]], 20 ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]] 21 ] 16 ["bag", ["Product[]", XSD::QName.new(nil, "bag")]], 17 ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")]], 18 ["product_Bag", ["ProductBag", XSD::QName.new("urn:product", "Product-Bag")]], 19 ["comment_1", [nil, XSD::QName.new(nil, "comment_1")]], 20 ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]]] 22 21 23 22 attr_accessor :bag … … 64 63 @@schema_type = "Creator" 65 64 @@schema_ns = "urn:product" 66 @@schema_element = [ 67 68 ] 65 @@schema_element = [] 69 66 70 67 def initialize … … 77 74 @@schema_ns = "urn:product" 78 75 @@schema_element = [ 79 ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 80 ["rating", ["SOAP::SOAPString", XSD::QName.new("urn:product", "Rating")]] 81 ] 76 ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 77 ["rating", ["SOAP::SOAPString", XSD::QName.new("urn:product", "Rating")]]] 82 78 83 79 attr_accessor :name trunk/test/wsdl/simpletype/rpc/expectedEchoVersion.rb
r1653 r1655 6 6 @@schema_ns = "urn:example.com:simpletype-rpc-type" 7 7 @@schema_element = [ 8 ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 9 ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]] 10 ] 8 ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 9 ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]]] 11 10 12 11 attr_accessor :version trunk/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb
r1653 r1655 6 6 @@schema_ns = "urn:example.com:simpletype-rpc-type" 7 7 @@schema_element = [ 8 ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 9 ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]] 10 ] 8 ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 9 ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]]] 11 10 12 11 attr_accessor :version trunk/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb
r1653 r1655 6 6 @@schema_ns = "urn:mysample" 7 7 @@schema_element = [ 8 ["something", ["SOAP::SOAPString", XSD::QName.new(nil, "something")]] 9 ] 8 ["something", ["SOAP::SOAPString", XSD::QName.new(nil, "something")]]] 10 9 11 10 attr_accessor :something … … 21 20 @@schema_ns = "urn:mysample" 22 21 @@schema_element = [ 23 ["sectionID", ["SOAP::SOAPInt", XSD::QName.new(nil, "sectionID")]], 24 ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 25 ["description", ["SOAP::SOAPString", XSD::QName.new(nil, "description")]], 26 ["index", ["SOAP::SOAPInt", XSD::QName.new(nil, "index")]], 27 ["firstQuestion", ["Question", XSD::QName.new(nil, "firstQuestion")]] 28 ] 22 ["sectionID", ["SOAP::SOAPInt", XSD::QName.new(nil, "sectionID")]], 23 ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 24 ["description", ["SOAP::SOAPString", XSD::QName.new(nil, "description")]], 25 ["index", ["SOAP::SOAPInt", XSD::QName.new(nil, "index")]], 26 ["firstQuestion", ["Question", XSD::QName.new(nil, "firstQuestion")]]] 29 27 30 28 attr_accessor :sectionID