Changeset 1522
- Timestamp:
- 04/29/05 17:10:31 (4 years ago)
- Files:
-
- trunk/lib/soap/mapping/mapping.rb (modified) (1 diff)
- trunk/lib/soap/mapping/registry.rb (modified) (1 diff)
- trunk/lib/soap/mapping/rubytypeFactory.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/wsdlliteralregistry.rb (modified) (7 diffs)
- trunk/lib/wsdl/soap/classDefCreator.rb (modified) (5 diffs)
- trunk/test/wsdl/document/echo.rb (modified) (6 diffs)
- trunk/test/wsdl/ref/expectedProduct.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/mapping.rb
r1520 r1522 280 280 else 281 281 obj.instance_variable_set('@' + name, value) 282 end 283 end 284 end 282 begin 283 define_attr_accessor(obj, name, 284 proc { instance_variable_get('@' + name) }, 285 proc { |value| instance_variable_set('@' + name, value) }) 286 rescue TypeError 287 # singleton class may not exist (e.g. Float) 288 end 289 end 290 end 291 end 292 end 293 294 def self.define_attr_accessor(obj, name, getterproc, setterproc = nil) 295 sclass = class << obj; self; end 296 sclass.__send__(:define_method, name, getterproc) 297 sclass.__send__(:define_method, name + '=', setterproc) if setterproc 285 298 end 286 299 trunk/lib/soap/mapping/registry.rb
r1520 r1522 83 83 end 84 84 85 def [](name) 86 @__xmlele[name] 87 end 88 89 def []=(name, value) 90 @__xmlele[name] = value 91 end 92 93 def __set_xmlele(name, value) 94 unless @__xmlele.key?(name) 95 __define_attr_accessor(name) 96 end 97 __set_xmlele_value(name, value) 85 def [](qname) 86 unless qname.is_a?(XSD::QName) 87 qname = XSD::QName.new(nil, qname) 88 end 89 @__xmlele[qname] 90 end 91 92 def []=(qname, value) 93 unless qname.is_a?(XSD::QName) 94 qname = XSD::QName.new(nil, qname) 95 end 96 @__xmlele[qname] = value 97 end 98 99 def __set_xmlele(qname, value) 100 unless @__xmlele.key?(qname) 101 __define_attr_accessor(qname) 102 end 103 __set_xmlele_value(qname, value) 98 104 end 99 105 100 106 private 101 107 102 def __set_xmlele_value( name, value)103 org = self[ name]104 case @__xmlele_type[ name]108 def __set_xmlele_value(qname, value) 109 org = self[qname] 110 case @__xmlele_type[qname] 105 111 when :single 106 self[ name] = [org, value]107 @__xmlele_type[ name] = :multi112 self[qname] = [org, value] 113 @__xmlele_type[qname] = :multi 108 114 when :multi 109 115 org << value 110 116 else 111 self[ name] = value112 @__xmlele_type[ name] = :single117 self[qname] = value 118 @__xmlele_type[qname] = :single 113 119 end 114 120 value 115 121 end 116 122 117 def __define_attr_accessor(name) 118 sclass = class << self; self; end 119 sclass.__send__(:define_method, name, proc { 120 self[name] 121 }) 122 sclass.__send__(:define_method, name + '=', proc { |value| 123 self[name] = value 124 }) 123 def __define_attr_accessor(qname) 124 Mapping.define_attr_accessor(self, qname.name, 125 proc { self[qname] }, 126 proc { |value| self[qname] = value }) 125 127 end 126 128 end trunk/lib/soap/mapping/rubytypeFactory.rb
r1520 r1522 224 224 mark_marshalled_obj(obj, param) 225 225 obj.__xmlele.each do |key, value| 226 param.add(key , Mapping._obj2soap(value, map))226 param.add(key.name, Mapping._obj2soap(value, map)) 227 227 end 228 228 obj.__xmlattr.each do |key, value| … … 384 384 mark_unmarshalled_obj(node, obj) 385 385 node.each do |name, value| 386 obj.__set_xmlele(name, Mapping._soap2obj(value, map)) 386 obj.__set_xmlele(XSD::QName.new(nil, name), 387 Mapping._soap2obj(value, map)) 387 388 end 388 389 unless node.extraattr.empty? trunk/lib/soap/mapping/wsdlliteralregistry.rb
r1520 r1522 139 139 obj 140 140 elsif obj.class.class_variables.include?('@@schema_element') 141 ele = SOAPElement.new(name) 142 add_elements2soap(obj, ele) 143 add_attributes2soap(obj, ele) 144 ele 141 unknownobj2definedsoap(obj, name) 142 elsif obj.is_a?(SOAP::Mapping::Object) 143 mappingobj2soap(obj, name) 145 144 elsif obj.is_a?(Hash) 146 145 ele = SOAPElement.from_obj(obj) … … 150 149 # expected to be a basetype or an anyType. 151 150 # SOAPStruct, etc. is used instead of SOAPElement. 152 o = Mapping.obj2soap(obj) 153 o.elename = name 154 o 155 end 151 begin 152 ele = Mapping.obj2soap(obj) 153 ele.elename = name 154 ele 155 rescue MappingError 156 ele = SOAPElement.new(name, obj.to_s) 157 end 158 if obj.respond_to?(:__xmlattr) 159 obj.__xmlattr.each do |key, value| 160 ele.extraattr[key] = value 161 end 162 end 163 ele 164 end 165 end 166 167 def unknownobj2definedsoap(obj, name) 168 ele = SOAPElement.new(name) 169 add_elements2soap(obj, ele) 170 add_attributes2soap(obj, ele) 171 ele 172 end 173 174 def mappingobj2soap(obj, name) 175 ele = SOAPElement.new(name) 176 obj.__xmlele.each do |key, value| 177 if value.is_a?(::Array) 178 value.each do |item| 179 ele.add(obj2soap(item, key)) 180 end 181 else 182 ele.add(obj2soap(value, key)) 183 end 184 end 185 obj.__xmlattr.each do |key, value| 186 ele.extraattr[key] = value 187 end 188 ele 156 189 end 157 190 … … 176 209 attributes = schema_attribute_definition(obj.class) 177 210 if attributes 178 attributes.each do | attrname, param|211 attributes.each do |qname, param| 179 212 attr = obj.__send__('xmlattr_' + 180 XSD::CodeGen::GenSupport.safevarname( attrname))181 ele.extraattr[ attrname] = attr213 XSD::CodeGen::GenSupport.safevarname(qname.name)) 214 ele.extraattr[qname] = attr 182 215 end 183 216 end … … 270 303 def add_attributes2obj(node, obj) 271 304 if attributes = schema_attribute_definition(obj.class) 272 vars = {} 273 obj.instance_variable_set('@__xmlattr', {}) 274 attributes.each do |attrname, class_name| 275 attr = node.extraattr[XSD::QName.new(nil, attrname)] 305 define_xmlattr(obj) 306 attributes.each do |qname, class_name| 307 attr = node.extraattr[qname] 276 308 next if attr.nil? or attr.empty? 277 309 klass = Mapping.class_from_name(class_name) … … 281 313 child = attr 282 314 end 283 vars['xmlattr_' + attrname] = child 284 end 285 Mapping.set_attributes(obj, vars) 315 obj.__xmlattr[qname] = child 316 Mapping.define_attr_accessor(obj, 'xmlattr_' + qname.name, 317 proc { @__xmlattr[qname] }, 318 proc { |value| @__xmlattr[qname] = value }) 319 end 286 320 end 287 321 end … … 289 323 def add_elements2undefinedobj(node, obj) 290 324 node.each do |name, value| 291 obj.__set_xmlele( name, soapele2obj(value))325 obj.__set_xmlele(XSD::QName.new(nil, name), soapele2obj(value)) 292 326 end 293 327 end … … 295 329 def add_attributes2undefinedobj(node, obj) 296 330 return if node.extraattr.empty? 297 obj.instance_variable_set('@__xmlattr', node.extraattr) 331 define_xmlattr(obj) 332 node.extraattr.each do |qname, value| 333 attrname = qname.name 334 obj.__xmlattr[qname] = value 335 Mapping.define_attr_accessor(obj, 'xmlattr_' + attrname, 336 proc { @__xmlattr[qname] }, 337 proc { |value| @__xmlattr[qname] = value }) 338 end 339 end 340 341 def define_xmlattr(obj) 342 obj.instance_variable_set('@__xmlattr', {}) 298 343 unless obj.respond_to?(:__xmlattr) 299 class << obj 300 define_method(:__xmlattr, proc { @__xmlattr }) 301 end 344 Mapping.define_attr_accessor(obj, :__xmlattr, proc { @__xmlattr }) 302 345 end 303 346 end trunk/lib/wsdl/soap/classDefCreator.rb
r1520 r1522 132 132 params = [] 133 133 typedef.each_element do |element| 134 name = name_element(element)135 134 if element.type == XSD::AnyTypeName 136 135 type = nil … … 149 148 # </element> 150 149 end 150 name = name_element(element).name 151 151 attrname = safemethodname?(name) ? name : safemethodname(name) 152 152 varname = safevarname(name) … … 225 225 type = nil 226 226 end 227 varname = safevarname('xmlattr_' +name)228 c.def_method( varname) do <<-__EOD__229 (@__xmlattr ||= {})[#{ name.dump}]227 methodname = safemethodname('xmlattr_' + name.name) 228 c.def_method(methodname) do <<-__EOD__ 229 (@__xmlattr ||= {})[#{dqname(name)}] 230 230 __EOD__ 231 231 end 232 c.def_method( varname + '=', 'value') do <<-__EOD__233 (@__xmlattr ||= {})[#{ name.dump}] = value232 c.def_method(methodname + '=', 'value') do <<-__EOD__ 233 (@__xmlattr ||= {})[#{dqname(name)}] = value 234 234 __EOD__ 235 235 end … … 239 239 '{' + 240 240 schema_attribute.collect { |name, type| 241 name.dump+ ' => ' + ndq(type)241 dqname(name) + ' => ' + ndq(type) 242 242 }.join(', ') + 243 243 '}' … … 246 246 247 247 def name_element(element) 248 return element.name .nameif element.name249 return element.ref .nameif element.ref248 return element.name if element.name 249 return element.ref if element.ref 250 250 raise RuntimeError.new("cannot define name of #{element}") 251 251 end 252 252 253 253 def name_attribute(attribute) 254 return attribute.name .nameif attribute.name255 return attribute.ref .nameif attribute.ref254 return attribute.name if attribute.name 255 return attribute.ref if attribute.ref 256 256 raise RuntimeError.new("cannot define name of #{attribute}") 257 257 end trunk/test/wsdl/document/echo.rb
r1519 r1522 5 5 @@schema_type = "echoele" 6 6 @@schema_ns = "urn:docrpc" 7 @@schema_attribute = { "attr_string" => "SOAP::SOAPString", "attr-int"=> "SOAP::SOAPInt"}7 @@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"} 8 8 @@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]] 9 9 … … 12 12 13 13 def xmlattr_attr_string 14 (@__xmlattr ||= {})[ "attr_string"]14 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] 15 15 end 16 16 17 17 def xmlattr_attr_string=(value) 18 (@__xmlattr ||= {})[ "attr_string"] = value18 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value 19 19 end 20 20 21 21 def xmlattr_attr_int 22 (@__xmlattr ||= {})[ "attr-int"]22 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] 23 23 end 24 24 25 25 def xmlattr_attr_int=(value) 26 (@__xmlattr ||= {})[ "attr-int"] = value26 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value 27 27 end 28 28 … … 38 38 @@schema_type = "echo_response" 39 39 @@schema_ns = "urn:docrpc" 40 @@schema_attribute = { "attr_string" => "SOAP::SOAPString", "attr-int"=> "SOAP::SOAPInt"}40 @@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"} 41 41 @@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]] 42 42 … … 45 45 46 46 def xmlattr_attr_string 47 (@__xmlattr ||= {})[ "attr_string"]47 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] 48 48 end 49 49 50 50 def xmlattr_attr_string=(value) 51 (@__xmlattr ||= {})[ "attr_string"] = value51 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value 52 52 end 53 53 54 54 def xmlattr_attr_int 55 (@__xmlattr ||= {})[ "attr-int"]55 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] 56 56 end 57 57 58 58 def xmlattr_attr_int=(value) 59 (@__xmlattr ||= {})[ "attr-int"] = value59 (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value 60 60 end 61 61 … … 71 71 @@schema_type = "echo_struct" 72 72 @@schema_ns = "urn:docrpc" 73 @@schema_attribute = { "m_attr"=> "SOAP::SOAPString"}73 @@schema_attribute = {XSD::QName.new("urn:docrpc", "m_attr") => "SOAP::SOAPString"} 74 74 @@schema_element = [["m_string", "SOAP::SOAPString"], ["m_datetime", "SOAP::SOAPDateTime"]] 75 75 … … 78 78 79 79 def xmlattr_m_attr 80 (@__xmlattr ||= {})[ "m_attr"]80 (@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")] 81 81 end 82 82 83 83 def xmlattr_m_attr=(value) 84 (@__xmlattr ||= {})[ "m_attr"] = value84 (@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")] = value 85 85 end 86 86 trunk/test/wsdl/ref/expectedProduct.rb
r1519 r1522 12 12 @@schema_type = "Product-Bag" 13 13 @@schema_ns = "urn:product" 14 @@schema_attribute = { "version" => "SOAP::SOAPString", "yesno"=> "SOAP::SOAPString"}14 @@schema_attribute = {XSD::QName.new("urn:product", "version") => "SOAP::SOAPString", XSD::QName.new("urn:product", "yesno") => "SOAP::SOAPString"} 15 15 @@schema_element = [["bag", "Product[]"], ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")]], ["product_Bag", [nil, XSD::QName.new("urn:product", "Product-Bag")]], ["comment_1", nil], ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]]] 16 16 … … 29 29 30 30 def xmlattr_version 31 (@__xmlattr ||= {})[ "version"]31 (@__xmlattr ||= {})[XSD::QName.new("urn:product", "version")] 32 32 end 33 33 34 34 def xmlattr_version=(value) 35 (@__xmlattr ||= {})[ "version"] = value35 (@__xmlattr ||= {})[XSD::QName.new("urn:product", "version")] = value 36 36 end 37 37 38 38 def xmlattr_yesno 39 (@__xmlattr ||= {})[ "yesno"]39 (@__xmlattr ||= {})[XSD::QName.new("urn:product", "yesno")] 40 40 end 41 41 42 42 def xmlattr_yesno=(value) 43 (@__xmlattr ||= {})[ "yesno"] = value43 (@__xmlattr ||= {})[XSD::QName.new("urn:product", "yesno")] = value 44 44 end 45 45