Changeset 1663
- Timestamp:
- 11/06/05 22:54:11 (3 years ago)
- Files:
-
- trunk/lib/soap/mapping/mapping.rb (modified) (1 diff)
- trunk/lib/soap/mapping/wsdlencodedregistry.rb (modified) (1 diff)
- trunk/lib/soap/mapping/wsdlliteralregistry.rb (modified) (13 diffs)
- trunk/lib/wsdl/operation.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/classDefCreator.rb (modified) (11 diffs)
- trunk/lib/wsdl/xmlSchema/complexType.rb (modified) (1 diff)
- trunk/lib/wsdl/xmlSchema/simpleContent.rb (modified) (1 diff)
- trunk/sample/wsdl/salesforce/client.rb (modified) (1 diff)
- trunk/test/wsdl/complexcontent/test_echo.rb (modified) (1 diff)
- trunk/test/wsdl/ref/expectedProduct.rb (modified) (4 diffs)
- trunk/test/wsdl/ref/product.wsdl (modified) (5 diffs)
- trunk/test/wsdl/ref/test_ref.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/mapping.rb
r1655 r1663 411 411 if /\[\]$/ =~ class_name 412 412 class_name = class_name.sub(/\[\]$/, '') 413 if class_name.empty? 414 class_name = nil 415 end 413 416 as_array = true 414 417 end trunk/lib/soap/mapping/wsdlencodedregistry.rb
r1660 r1663 242 242 node.each do |name, value| 243 243 item = definition.elements.find { |k, v| k.elename.name == name } 244 if item 244 if item and item.type 245 245 if klass = Mapping.class_from_name(item.type) 246 246 # klass must be a SOAPBasetype or a class trunk/lib/soap/mapping/wsdlliteralregistry.rb
r1660 r1663 36 36 def obj2soap(obj, qname) 37 37 soap_obj = nil 38 if ele = @definedelements[qname] 39 soap_obj = obj2elesoap(obj, ele) 38 if obj.is_a?(SOAPElement) 39 soap_obj = obj 40 elsif eledef = @definedelements[qname] 41 soap_obj = obj2elesoap(obj, eledef) 40 42 elsif type = @definedtypes[qname] 41 43 soap_obj = obj2typesoap(obj, type, true) … … 79 81 MAPPING_OPT = { :no_reference => true } 80 82 81 def obj2elesoap(obj, ele) 82 o = nil 83 qualified = (ele.elementform == 'qualified') 84 if ele.type 85 if type = @definedtypes[ele.type] 86 o = obj2typesoap(obj, type, qualified) 87 elsif type = TypeMap[ele.type] 88 o = base2soap(obj, type) 89 else 90 raise MappingError.new("cannot find type #{ele.type}") 91 end 92 elsif ele.local_complextype 93 o = obj2typesoap(obj, ele.local_complextype, qualified) 94 add_attributes2soap(obj, o) 95 elsif ele.local_simpletype 96 o = obj2typesoap(obj, ele.local_simpletype, qualified) 83 def obj2elesoap(obj, eledef) 84 ele = nil 85 qualified = (eledef.elementform == 'qualified') 86 if eledef.type 87 if type = @definedtypes[eledef.type] 88 ele = obj2typesoap(obj, type, qualified) 89 elsif type = TypeMap[eledef.type] 90 ele = base2soap(obj, type) 91 else 92 raise MappingError.new("cannot find type #{eledef.type}") 93 end 94 elsif eledef.local_complextype 95 ele = obj2typesoap(obj, eledef.local_complextype, qualified) 96 elsif eledef.local_simpletype 97 ele = obj2typesoap(obj, eledef.local_simpletype, qualified) 97 98 else 98 99 raise MappingError.new('illegal schema?') 99 100 end 100 o.elename = ele.name101 o101 ele.elename = eledef.name 102 ele 102 103 end 103 104 104 105 def obj2typesoap(obj, type, qualified) 106 ele = nil 105 107 if type.is_a?(::WSDL::XMLSchema::SimpleType) 106 simpleobj2soap(obj, type) 107 else 108 complexobj2soap(obj, type, qualified) 109 end 108 ele = simpleobj2soap(obj, type) 109 elsif type.simplecontent 110 ele = simpleobj2soap(obj, type.simplecontent) 111 else 112 ele = complexobj2soap(obj, type, qualified) 113 end 114 add_attributes2soap(obj, ele) 115 ele 110 116 end 111 117 … … 114 120 return SOAPNil.new if obj.nil? # TODO: check nillable. 115 121 if type.base 116 base2soap(obj, TypeMap[type.base])122 ele = base2soap(obj, TypeMap[type.base]) 117 123 elsif type.list 118 base2soap(obj.join(" "), SOAP::SOAPString)124 ele = base2soap(obj.join(" "), SOAP::SOAPString) 119 125 else 120 126 raise MappingError.new("unsupported simpleType: #{type}") 121 127 end 128 ele 122 129 end 123 130 … … 174 181 def complexobj2soapchildren(obj, ele, child_ele, allow_nil_value = false) 175 182 if child_ele.map_as_array? 176 child = Mapping.get_attribute(obj, child_ele.name.name) 177 if child.nil? and obj.is_a?(::Array) 178 child = obj 179 end 180 if child.nil? 181 return false if allow_nil_value 182 if child_soap = nil2soap(child_ele) 183 ele.add(child_soap) 184 else 185 return false 186 end 187 else 188 child.each do |item| 189 child_soap = obj2elesoap(item, child_ele) 190 ele.add(child_soap) 191 end 192 end 193 else 194 child = Mapping.get_attribute(obj, child_ele.name.name) 195 if child.nil? 196 return false if allow_nil_value 197 if child_soap = nil2soap(child_ele) 198 ele.add(child_soap) 199 else 200 return false 201 end 202 else 203 child_soap = obj2elesoap(child, child_ele) 183 complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value) 184 else 185 complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value) 186 end 187 end 188 189 def complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value) 190 child = Mapping.get_attribute(obj, child_ele.name.name) 191 if child.nil? and obj.respond_to?(:each) 192 child = obj 193 end 194 if child.nil? 195 return false if allow_nil_value 196 if child_soap = nil2soap(child_ele) 204 197 ele.add(child_soap) 198 return true 199 else 200 return false 201 end 202 end 203 unless child.respond_to?(:each) 204 return false 205 end 206 child.each do |item| 207 if item.is_a?(SOAPElement) 208 ele.add(item) 209 else 210 child_soap = obj2elesoap(item, child_ele) 211 ele.add(child_soap) 205 212 end 206 213 end 207 214 true 215 end 216 217 def complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value) 218 child = Mapping.get_attribute(obj, child_ele.name.name) 219 case child 220 when NilClass 221 return false if allow_nil_value 222 if child_soap = nil2soap(child_ele) 223 ele.add(child_soap) 224 true 225 else 226 false 227 end 228 when SOAPElement 229 ele.add(child) 230 true 231 else 232 child_soap = obj2elesoap(child, child_ele) 233 ele.add(child_soap) 234 true 235 end 208 236 end 209 237 … … 236 264 237 265 def any2soap(obj, qname) 238 if obj.is_a?(SOAPElement) 239 obj 240 elsif obj.class.class_variables.include?('@@schema_element') 241 stubobj2soap(obj, qname) 266 ele = nil 267 if obj.class.class_variables.include?('@@schema_element') 268 ele = stubobj2soap(obj, qname) 242 269 elsif obj.is_a?(SOAP::Mapping::Object) 243 mappingobj2soap(obj, qname)270 ele = mappingobj2soap(obj, qname) 244 271 elsif obj.is_a?(Hash) 245 272 ele = SOAPElement.from_obj(obj) 246 273 ele.elename = qname 247 ele248 274 elsif obj.is_a?(Array) 249 275 # treat as a list of simpletype 250 276 ele = SOAPElement.new(qname, obj.join(" ")) 251 ele252 277 elsif obj.is_a?(XSD::QName) 253 278 ele = SOAPElement.new(qname) 254 279 ele.text = obj 255 ele256 280 else 257 281 # expected to be a basetype or an anyType. … … 260 284 ele = Mapping.obj2soap(obj, nil, nil, MAPPING_OPT) 261 285 ele.elename = qname 262 ele263 286 rescue MappingError 264 287 ele = SOAPElement.new(qname, obj.to_s) 265 288 end 266 if obj.respond_to?(:__xmlattr) 267 obj.__xmlattr.each do |key, value| 268 ele.extraattr[key] = value 269 end 270 end 271 ele 272 end 289 end 290 add_attributes2soap(obj, ele) 291 ele 273 292 end 274 293 … … 279 298 obj.class.class_eval('@@schema_qualified')) 280 299 add_elements2soap(obj, ele) 281 add_attributes2soap(obj, ele)282 300 ele 283 301 end … … 294 312 end 295 313 end 296 obj.__xmlattr.each do |key, value|297 ele.extraattr[key] = value298 end299 314 ele 300 315 end … … 321 336 ele.add(obj2soap(child, eledef.elename)) 322 337 end 323 elsif obj. is_a?(::Array) and eledef.as_array?338 elsif obj.respond_to?(:each) and eledef.as_array? 324 339 obj.each do |item| 325 340 ele.add(obj2soap(item, eledef.elename)) … … 333 348 if attributes 334 349 attributes.each do |qname, param| 335 attr = obj.__send__( 'xmlattr_' +336 XSD::CodeGen::GenSupport.safe varname(qname.name))350 attr = obj.__send__( 351 XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name)) 337 352 ele.extraattr[qname] = attr 353 end 354 elsif obj.respond_to?(:__xmlattr) 355 obj.__xmlattr.each do |key, value| 356 ele.extraattr[key] = value 338 357 end 339 358 end … … 397 416 node.each do |name, value| 398 417 item = definition.elements.find { |k, v| k.elename.name == name } 399 if item 418 if item and item.type 400 419 if klass = Mapping.class_from_name(item.type) 401 420 # klass must be a SOAPBasetype or a class … … 472 491 if RUBY_VERSION > "1.7.0" 473 492 def define_xmlattr_accessor(obj, qname) 474 name = XSD::CodeGen::GenSupport.safemethodname( qname.name)475 Mapping.define_attr_accessor(obj, 'xmlattr_' +name,493 name = XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name) 494 Mapping.define_attr_accessor(obj, name, 476 495 proc { @__xmlattr[qname] }, 477 496 proc { |value| @__xmlattr[qname] = value }) … … 479 498 else 480 499 def define_xmlattr_accessor(obj, qname) 481 name = XSD::CodeGen::GenSupport.safemethodname( qname.name)500 name = XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name) 482 501 obj.instance_eval <<-EOS 483 502 def #{name} trunk/lib/wsdl/operation.rb
r1608 r1663 47 47 48 48 def input_info 49 typename = input.find_message.name 49 if message = input_message 50 typename = message.name 51 else 52 typename = nil 53 end 50 54 NameInfo.new(@name, typename, inputparts) 51 55 end 52 56 53 57 def output_info 54 typename = output.find_message.name 58 if message = output_message 59 typename = message.name 60 else 61 typename = nil 62 end 55 63 NameInfo.new(@name, typename, outputparts) 56 64 end 57 65 66 EMPTY = [].freeze 67 58 68 def inputparts 59 sort_parts(input.find_message.parts) 69 if message = input_message 70 sort_parts(message.parts) 71 else 72 EMPTY 73 end 60 74 end 61 75 62 76 def inputname 63 XSD::QName.new(targetnamespace, input.name ? input.name.name : @name.name) 77 if input 78 XSD::QName.new(targetnamespace, input.name ? input.name.name : @name.name) 79 else 80 nil 81 end 64 82 end 65 83 66 84 def outputparts 67 sort_parts(output.find_message.parts) 85 if message = output_message 86 sort_parts(message.parts) 87 else 88 EMPTY 89 end 68 90 end 69 91 70 92 def outputname 71 XSD::QName.new(targetnamespace, 72 output.name ? output.name.name : @name.name + 'Response') 93 if output 94 XSD::QName.new(targetnamespace, 95 output.name ? output.name.name : @name.name + 'Response') 96 else 97 nil 98 end 73 99 end 74 100 … … 110 136 private 111 137 138 def input_message 139 if input and message = input.find_message 140 message 141 else 142 nil 143 end 144 end 145 146 def output_message 147 if output and message = output.find_message 148 message 149 else 150 nil 151 end 152 end 153 112 154 def sort_parts(parts) 113 155 return parts.dup unless parameter_order trunk/lib/wsdl/soap/classDefCreator.rb
r1660 r1663 18 18 class ClassDefCreator 19 19 include ClassDefCreatorSupport 20 include XSD::CodeGen 20 21 21 22 def initialize(definitions) 22 23 @elements = definitions.collect_elements 23 24 @elements.uniq! 25 @attributes = definitions.collect_attributes 26 @attributes.uniq! 24 27 @simpletypes = definitions.collect_simpletypes 25 28 @simpletypes.uniq! … … 42 45 result << str 43 46 end 47 str = dump_attribute 48 unless str.empty? 49 result << "\n" unless result.empty? 50 result << str 51 end 44 52 str = dump_complextype 45 53 unless str.empty? … … 61 69 @elements.collect { |ele| 62 70 if ele.local_complextype 63 dump_classdef(ele.name, ele.local_complextype,64 ele.elementform == 'qualified')71 qualified = ele.elementform == 'qualified' 72 dump_complextypedef(ele.name, ele.local_complextype, qualified) 65 73 elsif ele.local_simpletype 66 74 dump_simpletypedef(ele.name, ele.local_simpletype) … … 71 79 end 72 80 81 def dump_attribute 82 @attributes.collect { |attr| 83 if attr.local_simpletype 84 dump_simpletypedef(attr.name, attr.local_simpletype) 85 end 86 }.compact.join("\n") 87 end 88 73 89 def dump_simpletype 74 90 @simpletypes.collect { |type| … … 79 95 def dump_complextype 80 96 @complextypes.collect { |type| 81 case type.compoundtype 82 when :TYPE_STRUCT, :TYPE_EMPTY 83 dump_classdef(type.name, type) 84 when :TYPE_ARRAY 85 dump_arraydef(type) 86 when :TYPE_SIMPLE 87 dump_simpleclassdef(type) 88 when :TYPE_MAP 89 # mapped as a general Hash 90 nil 91 else 92 raise RuntimeError.new( 93 "unknown kind of complexContent: #{type.compoundtype}") 94 end 97 dump_complextypedef(type.name, type) 95 98 }.compact.join("\n") 96 99 end … … 111 114 return nil 112 115 end 113 c = XSD::CodeGen::ModuleDef.new(create_class_name(qname))116 c = ModuleDef.new(create_class_name(qname)) 114 117 c.comment = "#{qname}" 115 118 define_enum_restriction(c, restriction.enumeration) … … 118 121 119 122 def dump_simpletypedef_list(qname, list) 120 c = XSD::CodeGen::ClassDef.new(create_class_name(qname), '::Array')123 c = ClassDef.new(create_class_name(qname), '::Array') 121 124 c.comment = "#{qname}" 122 125 if simpletype = list.local_simpletype … … 147 150 end 148 151 149 def dump_simpleclassdef(type_or_element) 150 qname = type_or_element.name 152 def dump_simpleclassdef(qname, type_or_element) 151 153 base = create_class_name(type_or_element.simplecontent.base) 152 c = XSD::CodeGen::ClassDef.new(create_class_name(qname), base)154 c = ClassDef.new(create_class_name(qname), base) 153 155 c.comment = "#{qname}" 156 unless type_or_element.attributes.empty? 157 define_attribute(c, type_or_element.attributes) 158 c.def_method('initialize', '*arg') do 159 "super\n" + "@__xmlattr = {}" 160 end 161 end 154 162 c.dump 163 end 164 165 def dump_complextypedef(qname, type, qualified = false) 166 case type.compoundtype 167 when :TYPE_STRUCT, :TYPE_EMPTY 168 dump_classdef(qname, type, qualified) 169 when :TYPE_ARRAY 170 dump_arraydef(qname, type) 171 when :TYPE_SIMPLE 172 dump_simpleclassdef(qname, type) 173 when :TYPE_MAP 174 # mapped as a general Hash 175 nil 176 else 177 raise RuntimeError.new( 178 "unknown kind of complexContent: #{type.compoundtype}") 179 end 155 180 end 156 181 157 182 def dump_classdef(qname, typedef, qualified = false) 158 183 if @faulttypes and @faulttypes.index(qname) 159 c = XSD::CodeGen::ClassDef.new(create_class_name(qname), 160 '::StandardError') 161 else 162 c = XSD::CodeGen::ClassDef.new(create_class_name(qname)) 184 c = ClassDef.new(create_class_name(qname), '::StandardError') 185 else 186 c = ClassDef.new(create_class_name(qname)) 163 187 end 164 188 c.comment = "#{qname}" … … 255 279 end 256 280 name = name_element(element).name 257 attrname = safemethodname?(name) ? name : safemethodname(name) 281 #attrname = safemethodname?(name) ? name : safemethodname(name) 282 attrname = safemethodname(name) 258 283 varname = safevarname(name) 259 284 c.def_attr(attrname, true, varname) … … 261 286 if element.map_as_array? 262 287 init_params << "#{varname} = []" 263 type << '[]' if type 288 if type 289 type << '[]' 290 else 291 type = '[]' 292 end 264 293 else 265 294 init_params << "#{varname} = nil" … … 363 392 DEFAULT_ITEM_NAME = XSD::QName.new(nil, 'item') 364 393 365 def dump_arraydef(complextype) 366 qname = complextype.name 367 c = XSD::CodeGen::ClassDef.new(create_class_name(qname), '::Array') 394 def dump_arraydef(qname, complextype) 395 c = ClassDef.new(create_class_name(qname), '::Array') 368 396 c.comment = "#{qname}" 369 397 child_type = complextype.child_type trunk/lib/wsdl/xmlSchema/complexType.rb
r1653 r1663 72 72 if @complexcontent 73 73 @complexcontent.attributes 74 elsif @simplecontent 75 @simplecontent.attributes 74 76 else 75 77 @attributes trunk/lib/wsdl/xmlSchema/simpleContent.rb
r1445 r1663 33 33 end 34 34 35 def attributes 36 content.attributes 37 end 38 35 39 def targetnamespace 36 40 parent.targetnamespace trunk/sample/wsdl/salesforce/client.rb
r1650 r1663 52 52 obj.headerhandler << calloptions_handler 53 53 obj.wiredump_dev = STDOUT 54 55 p obj.delete(Delete.new([1, 2, 3])) 56 p obj.describeSObject(:sObjectType => "hello world") 57 p obj.describeSObject(DescribeSObject.new("hello world")) 54 58 55 59 if false trunk/test/wsdl/complexcontent/test_echo.rb
r1643 r1663 84 84 @client.wiredump_dev = STDOUT if $DEBUG 85 85 d = Derived.new 86 d. Name = "NaHi"86 d.name = "NaHi" 87 87 assert_instance_of(Echo, @client.echo(Echo.new(d))) 88 88 end trunk/test/wsdl/ref/expectedProduct.rb
r1655 r1663 1 1 require 'xsd/qname' 2 2 3 # {urn: product}Rating3 # {urn:ref}Rating 4 4 module Rating 5 5 C_0 = "0" … … 8 8 end 9 9 10 # {urn: product}Product-Bag10 # {urn:ref}Product-Bag 11 11 class ProductBag 12 12 @@schema_type = "Product-Bag" 13 @@schema_ns = "urn: product"14 @@schema_attribute = {XSD::QName.new("urn: product", "version") => "SOAP::SOAPString", XSD::QName.new("urn:product", "yesno") => "SOAP::SOAPString"}13 @@schema_ns = "urn:ref" 14 @@schema_attribute = {XSD::QName.new("urn:ref", "version") => "SOAP::SOAPString", XSD::QName.new("urn:ref", "yesno") => "SOAP::SOAPString"} 15 15 @@schema_element = [ 16 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")]], 17 ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:ref", "Rating")]], 18 ["comment_1", ["[]", XSD::QName.new(nil, "comment_1")]], 20 19 ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]]] 21 20 22 21 attr_accessor :bag 23 attr_accessor : product_Bag22 attr_accessor :rating 24 23 attr_accessor :comment_1 25 24 attr_accessor :comment_2 26 25 27 def Rating28 @rating29 end30 31 def Rating=(value)32 @rating = value33 end34 35 26 def xmlattr_version 36 (@__xmlattr ||= {})[XSD::QName.new("urn: product", "version")]27 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "version")] 37 28 end 38 29 39 30 def xmlattr_version=(value) 40 (@__xmlattr ||= {})[XSD::QName.new("urn: product", "version")] = value31 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "version")] = value 41 32 end 42 33 43 34 def xmlattr_yesno 44 (@__xmlattr ||= {})[XSD::QName.new("urn: product", "yesno")]35 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "yesno")] 45 36 end 46 37 47 38 def xmlattr_yesno=(value) 48 (@__xmlattr ||= {})[XSD::QName.new("urn: product", "yesno")] = value39 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "yesno")] = value 49 40 end 50 41 51 def initialize(bag = [], rating = [], product_Bag = nil,comment_1 = [], comment_2 = [])42 def initialize(bag = [], rating = [], comment_1 = [], comment_2 = []) 52 43 @bag = bag 53 44 @rating = rating 54 @product_Bag = product_Bag55 45 @comment_1 = comment_1 56 46 @comment_2 = comment_2 … … 59 49 end 60 50 61 # {urn:product}Creator 62 class Creator 63 @@schema_type = "Creator" 64 @@schema_ns = "urn:product" 65 @@schema_element = [] 51 # {urn:ref}Creator 52 class Creator < String 53 @@schema_attribute = {XSD::QName.new(nil, "Role") => nil} 66 54 67 def initialize 55 def xmlattr_Role 56 (@__xmlattr ||= {})[XSD::QName.new(nil, "Role")] 57 end 58 59 def xmlattr_Role=(value) 60 (@__xmlattr ||= {})[XSD::QName.new(nil, "Role")] = value 61 end 62 63 def initialize(*arg) 64 super 65 @__xmlattr = {} 68 66 end 69 67 end 70 68 71 # {urn:product}Product 69 # {urn:ref}yesno 70 module Yesno 71 N = "N" 72 Y = "Y" 73 end 74 75 # {urn:ref}Product 72 76 class Product 73 77 @@schema_type = "Product" 74 @@schema_ns = "urn: product"78 @@schema_ns = "urn:ref" 75 79 @@schema_element = [ 76 80 ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 77 ["rating", ["SOAP::SOAPString", XSD::QName.new("urn: product", "Rating")]]]81 ["rating", ["SOAP::SOAPString", XSD::QName.new("urn:ref", "Rating")]]] 78 82 79 83 attr_accessor :name 80 81 def Rating 82 @rating 83 end 84 85 def Rating=(value) 86 @rating = value 87 end 84 attr_accessor :rating 88 85 89 86 def initialize(name = nil, rating = nil) … … 93 90 end 94 91 95 # {urn: product}Comment92 # {urn:ref}Comment 96 93 class Comment < String 94 @@schema_attribute = {XSD::QName.new(nil, "msgid") => "SOAP::SOAPString"} 95 96 def xmlattr_msgid 97 (@__xmlattr ||= {})[XSD::QName.new(nil, "msgid")] 98 end 99 100 def xmlattr_msgid=(value) 101 (@__xmlattr ||= {})[XSD::QName.new(nil, "msgid")] = value 102 end 103 104 def initialize(*arg) 105 super 106 @__xmlattr = {} 107 end 97 108 end trunk/test/wsdl/ref/product.wsdl
r1444 r1663 1 1 <?xml version="1.0"?> 2 2 <definitions name="product" 3 targetNamespace="urn: product"4 xmlns:tns="urn: product"3 targetNamespace="urn:ref" 4 xmlns:tns="urn:ref" 5 5 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 6 6 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" … … 8 8 <types> 9 9 <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" 10 targetNamespace="urn: product">10 targetNamespace="urn:ref"> 11 11 <simpleType name="non-empty-string"> 12 12 <restriction base="xsd:string"> … … 56 56 <element name="bag" type="tns:Product" minOccurs="0" maxOccurs="unbounded"/> 57 57 <element ref="tns:Rating" minOccurs="0" maxOccurs="unbounded"/> 58 <element ref="tns:Product-Bag"/>59 58 <element name="comment_1" minOccurs="0" maxOccurs="unbounded"> 60 59 <complexType> … … 73 72 </element> 74 73 75 <element name="Creator" minOccurs="0" maxOccurs="unbounded">74 <element name="Creator"> 76 75 <complexType> 77 76 <simpleContent> … … 84 83 </xsd:schema> 85 84 </types> 85 86 <message name="echo_in"> 87 <part name="parameters" element="tns:Product-Bag" /> 88 </message> 89 <message name="echo_out"> 90 <part name="parameters" element="tns:Creator" /> 91 </message> 92 93 <portType name="ref_porttype"> 94 <operation name="echo"> 95 <input message="tns:echo_in" /> 96 <output message="tns:echo_out" /> 97 </operation> 98 </portType> 99 100 <binding name="ref_binding" type="tns:ref_porttype"> 101 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> 102 <operation name="echo"> 103 <soap:operation soapAction="urn:ref:echo" style="document" /> 104 <input> 105 <soap:body use="literal" /> 106 </input> 107 <output> 108 <soap:body use="literal" /> 109 </output> 110 </operation> 111 </binding> 112 113 <service name="ref_service"> 114 <port name="ref_service_port" binding="tns:ref_binding"> 115 <soap:address location="http://localhost:17171/" /> 116 </port> 117 </service> 86 118 </definitions> trunk/test/wsdl/ref/test_ref.rb
r1653 r1663 10 10 11 11 class TestRef < Test::Unit::TestCase 12 Namespace = 'urn:ref' 13 14 class Server < ::SOAP::RPC::StandaloneServer 15 Namespace = TestRef::Namespace 16 17 def on_init 18 add_document_method( 19 self, 20 Namespace + ':echo', 21 'echo', 22 XSD::QName.new(Namespace, 'Product-Bag'), 23 XSD::QName.new(Namespace, 'Creator') 24 ) 25 end 26 27 def echo(arg) 28 content = [ 29 arg.bag[0].name, 30 arg.bag[0].rating, 31 arg.bag[1].name, 32 arg.bag[1].rating, 33 arg.rating[0], 34 arg.rating[1], 35 arg.rating[2], 36 arg.comment_1[0], 37 arg.comment_1[0].xmlattr_msgid, 38 arg.comment_1[1], 39 arg.comment_1[1].xmlattr_msgid, 40 arg.comment_2[0], 41 arg.comment_2[0].xmlattr_msgid, 42 arg.comment_2[1], 43 arg.comment_2[1].xmlattr_msgid 44 ] 45 rv = Creator.new(content.join(" ")) 46 rv.xmlattr_Role = "role" 47 rv 48 end 49 end 50 12 51 DIR = File.dirname(File.expand_path(__FILE__)) 52 13 53 Port = 17171 54 55 def setup 56 setup_server 57 setup_classdef 58 @client = nil 59 end 60 61 def teardown 62 teardown_server 63 File.unlink(pathname('product.rb')) unless $DEBUG 64 File.unlink(pathname('productDriver.rb')) unless $DEBUG 65 @client.reset_stream if @client 66 end 67 68 def setup_server 69 @server = Server.new('Test', Namespace, '0.0.0.0', Port) 70 @server.level = Logger::Severity::ERROR 71 @server_thread = start_server_thread(@server) 72 end 73 74 def setup_classdef 75 gen = WSDL::SOAP::WSDL2Ruby.new 76 gen.location = pathname("product.wsdl") 77 gen.basedir = DIR 78 gen.logger.level = Logger::FATAL 79 gen.opt['classdef'] = nil 80 gen.opt['driver'] = nil 81 gen.opt['force'] = true 82 gen.run 83 begin 84 back = $:.dup 85 $:.unshift(pathname(".")) 86 require pathname('product') 87 require pathname('productDriver') 88 ensure 89 $:.replace(back) if back 90 end 91 end 92 93 def teardown_server 94 @server.shutdown 95 @server_thread.kill 96 @server_thread.join 97 end 98 99 def start_server_thread(server) 100 t = Thread.new { 101 Thread.current.abort_on_exception = true 102 server.start 103 } 104 t 105 end 106 107 def pathname(filename) 108 File.join(DIR, filename) 109 end 110 111 def compare(expected, actual) 112 assert_equal(loadfile(expected), loadfile(actual), actual) 113 end 114 115 def loadfile(file) 116 File.open(pathname(file)) { |f| f.read } 117 end 118 119 def suppress_warning 120 back = $VERBOSE 121 $VERBOSE = nil 122 begin 123 yield 124 ensure 125 $VERBOSE = back 126 end 127 end 14 128 15 129 def test_classdef … … 24 138 end 25 139 compare("expectedProduct.rb", "product.rb") 26 File.unlink(pathname('product.rb')) unless $DEBUG 27 end 28 29 def compare(expected, actual) 30 assert_equal(loadfile(expected), loadfile(actual), actual) 31 end 32 33 def loadfile(file) 34 File.open(pathname(file)) { |f| f.read } 35 end 36 37 def pathname(filename) 38 File.join(DIR, filename) 39 end 40 41 def suppress_warning 42 back = $VERBOSE 43 $VERBOSE = nil 44 begin 45 yield 46 ensure 47 $VERBOSE = back 48 end 140 end 141 142 def test_wsdl 143 wsdl = File.join(DIR, 'product.wsdl') 144 @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver 145 @client.endpoint_url = "http://localhost:#{Port}/" 146 @client.wiredump_dev = STDOUT if $DEBUG 147 p1 = e("bag") 148 p1.add(e("name", "foo")) 149 p1.add(e(q(Namespace, "Rating"), "0")) 150 p2 = e("bag") 151 p2.add(e("name", "bar")) 152 p2.add(e(q(Namespace, "Rating"), "+1")) 153 r1 = e(q(Namespace, "Rating"), "0") 154 r2 = e(q(Namespace, "Rating"), "+1") 155 r3 = e(q(Namespace, "Rating"), "-1") 156 c11 = e("comment_1", "comment11") 157 c11.extraattr["msgid"] = "msgid11" 158 c12 = e("comment_1", "comment12") 159 c12.extraattr["msgid"] = "msgid12" 160 c21 = e("comment-2", "comment21") 161 c21.extraattr["msgid"] = "msgid21" 162 c22 = e("comment-2", "comment22") 163 c22.extraattr["msgid"] = "msgid22" 164 bag = e(q(Namespace, "Product-Bag")) 165 bag.add(p1) 166 bag.add(p2) 167 bag.add(r1) 168 bag.add(r2) 169 bag.add(r3) 170 bag.add(c11) 171 bag.add(c12) 172 bag.add(c21) 173 bag.add(c22) 174 bag.extraattr["version"] = "version" 175 bag.extraattr["yesno"] = "Y" 176 ret = @client.echo(bag) 177 assert_equal( 178 [ 179 p1["name"].text, p1["Rating"].text, 180 p2["name"].text, p2["Rating"].text, 181 r1.text, r2.text, r3.text, 182 c11.text, c11.extraattr["msgid"], 183 c12.text, c12.extraattr["msgid"], 184 c21.text, c21.extraattr["msgid"], 185 c22.text, c22.extraattr["msgid"] 186 ].join(" "), 187 ret 188 ) 189 assert_equal("role", ret.xmlattr_Role) 190 end 191 192 def test_wsdl_with_classdef 193 wsdl = File.join(DIR, 'product.wsdl') 194 @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver 195 @client.endpoint_url = "http://localhost:#{Port}/" 196 @client.wiredump_dev = STDOUT if $DEBUG 197 p1 = Product.new("foo", Rating::C_0) 198 p2 = Product.new("bar", Rating::C_1) 199 r1 = Rating::C_0 200 r2 = Rating::C_1 201 r3 = Rating::C_1_2 202 c11 = ::SOAP::SOAPElement.new("comment_1", "comment11") 203 c11.extraattr["msgid"] = "msgid11" 204 c12 = ::SOAP::SOAPElement.new("comment_1", "comment12") 205 c12.extraattr["msgid"] = "msgid12" 206 c21 = Comment.new("comment21") 207 c21.xmlattr_msgid = "msgid21" 208 c22 = Comment.new("comment22") 209 c22.xmlattr_msgid = "msgid22" 210 bag = ProductBag.new([p1, p2], [r1, r2, r3], [c11, c12], [c21, c22]) 211 bag.xmlattr_version = "version" 212 bag.xmlattr_yesno = Yesno::Y 213 ret = @client.echo(bag) 214 assert_equal( 215 [ 216 p1.name, p1.rating, 217 p2.name, p2.rating, 218 r1, r2, r3, 219 c11.text, c11.extraattr["msgid"], 220 c12.text, c12.extraattr["msgid"], 221 c21, c21.xmlattr_msgid, 222 c22, c22.xmlattr_msgid 223 ].join(" "), 224 ret 225 ) 226 assert_equal("role", ret.xmlattr_Role) 227 end 228 229 def test_naive&nbs