Changeset 1970
- Timestamp:
- 09/17/07 12:10:11 (10 months ago)
- Files:
-
- trunk/lib/soap/baseData.rb (modified) (5 diffs)
- trunk/lib/soap/encodingstyle/literalHandler.rb (modified) (5 diffs)
- trunk/lib/soap/encodingstyle/soapHandler.rb (modified) (10 diffs)
- trunk/lib/soap/mapping/literalregistry.rb (modified) (4 diffs)
- trunk/lib/soap/mapping/registry.rb (modified) (1 diff)
- trunk/lib/soap/parser.rb (modified) (5 diffs)
- trunk/lib/soap/rpc/element.rb (modified) (1 diff)
- trunk/lib/soap/soap.rb (modified) (2 diffs)
- trunk/test/soap/test_extraattr.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/baseData.rb
r1962 r1970 28 28 d.elename = elename 29 29 d 30 end 31 32 def to_data(str) 33 new(str).data 30 34 end 31 35 end … … 544 548 545 549 def add(name, value) 546 add_member(name, value) 550 value = SOAPNil.new if value.nil? 551 @array.push(name) 552 value.elename = value.elename.dup_name(name) 553 @data.push(value) 554 value.parent = self if value.respond_to?(:parent=) 555 value 547 556 end 548 557 … … 623 632 s 624 633 end 625 626 private627 628 def add_member(name, value = nil)629 value = SOAPNil.new if value.nil?630 @array.push(name)631 value.elename = value.elename.dup_name(name)632 @data.push(value)633 value.parent = self if value.respond_to?(:parent=)634 value635 end636 634 end 637 635 … … 676 674 # Element interfaces. 677 675 def add(value) 678 add_member(value.elename.name, value) 676 name = value.elename.name 677 @array.push(name) 678 @data.push(value) 679 value.parent = self if value.respond_to?(:parent=) 680 value 679 681 end 680 682 … … 823 825 end 824 826 end 825 826 private827 828 def add_member(name, value)829 @array.push(name)830 @data.push(value)831 value.parent = self if value.respond_to?(:parent=)832 value833 end834 827 end 835 828 trunk/lib/soap/encodingstyle/literalHandler.rb
r1946 r1970 52 52 when XSD::XSDString 53 53 generator.encode_tag(name, attrs) 54 str = data.to_s 55 str = XSD::Charset.encoding_to_xml(str, @charset) if @charset 54 str = decode_str(data.to_s) 56 55 generator.encode_string(str) 57 56 when XSD::XSDAnySimpleType … … 112 111 def decode_tag(ns, elename, attrs, parent) 113 112 @textbuf.clear 114 extraattrs = decode_attrs(ns, attrs) 115 if extraattrs[XSD::AttrNilName] == 'true' 113 if attrs[XSD::AttrNilName] == 'true' 116 114 o = SOAPNil.decode(elename) 117 115 else 118 116 o = SOAPElement.decode(elename) 119 117 end 120 if definedtype = extraattrs[XSD::AttrTypeName]118 if definedtype = attrs[XSD::AttrTypeName] 121 119 o.type = ns.parse(definedtype) 122 120 end 123 121 o.parent = parent 124 o.extraattr.update( extraattrs)122 o.extraattr.update(attrs) 125 123 decode_parent(parent, o) 126 124 o … … 137 135 # @textbuf is set at decode_tag_end. 138 136 @textbuf << text 139 end140 141 def decode_attrs(ns, attrs)142 extraattr = {}143 attrs.each do |key, value|144 qname = ns.parse_local(key)145 extraattr[qname] = value146 end147 extraattr148 137 end 149 138 … … 182 171 when XSD::XSDString, SOAPElement 183 172 if @charset 184 node.set( XSD::Charset.encoding_from_xml(textbufstr, @charset))173 node.set(decode_str(textbufstr)) 185 174 else 186 175 node.set(textbufstr) … … 189 178 # Nothing to do... 190 179 end 180 end 181 182 def decode_str(str) 183 @charset ? XSD::Charset.encoding_from_xml(str, @charset) : str 191 184 end 192 185 end trunk/lib/soap/encodingstyle/soapHandler.rb
r1936 r1970 8 8 9 9 require 'soap/encodingstyle/handler' 10 require 'soap/mapping/registry' 10 11 11 12 … … 151 152 def decode_tag(ns, elename, attrs, parent) 152 153 @textbuf.clear 153 is_nil, type, arytype, root, offset, position, href, id , extraattr=154 decode_attrs(ns, attrs)154 is_nil, type, arytype, root, offset, position, href, id = 155 extract_attrs(ns, attrs) 155 156 o = nil 156 157 if is_nil … … 160 161 @refpool << o 161 162 elsif @decode_typemap 162 o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, extraattr)163 else 164 o = decode_tag_by_type(ns, elename, type, parent.node, arytype, extraattr)163 o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, attrs) 164 else 165 o = decode_tag_by_type(ns, elename, type, parent.node, arytype, attrs) 165 166 end 166 167 … … 327 328 end 328 329 329 def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr)330 def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, attrs) 330 331 o = nil 331 332 if parent.class == SOAPBody … … 351 352 end 352 353 end 353 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, 354 extraattr) 354 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs) 355 355 end 356 356 357 357 if parent.type == XSD::AnyTypeName 358 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, 359 extraattr) 358 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs) 360 359 end 361 360 … … 364 363 parenttype = parent.definedtype || @decode_typemap[parent.type] 365 364 unless parenttype 366 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, 367 extraattr) 365 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs) 368 366 end 369 367 … … 372 370 return decode_basetype(klass, elename) 373 371 elsif definedtype_name == XSD::AnyTypeName 374 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, 375 extraattr) 372 return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs) 376 373 end 377 374 … … 439 436 end 440 437 441 def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, extraattr)438 def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs) 442 439 if arytypestr 443 440 type = typestr ? ns.parse(typestr) : ValueArrayName 444 441 node = SOAPArray.decode(elename, type, ns.parse(arytypestr)) 445 node.extraattr.update( extraattr)442 node.extraattr.update(attrs) 446 443 return node 447 444 end … … 462 459 if klass = TypeMap[type] 463 460 node = decode_basetype(klass, elename) 464 node.extraattr.update( extraattr)461 node.extraattr.update(attrs) 465 462 return node 466 463 end 467 464 468 465 # Unknown type... Struct or String 469 SOAPUnknown.new(self, elename, type, extraattr)466 SOAPUnknown.new(self, elename, type, attrs) 470 467 end 471 468 … … 501 498 '0' => 0 502 499 } 503 def decode_attrs(ns, attrs) 504 is_nil = false 505 type = nil 506 arytype = nil 507 root = nil 508 offset = nil 509 position = nil 510 href = nil 511 id = nil 512 extraattr = {} 513 514 attrs.each do |key, value| 515 qname = ns.parse(key) 516 case qname.namespace 517 when XSD::InstanceNamespace 518 case qname.name 519 when XSD::NilLiteral 520 is_nil = NilLiteralMap[value] or 521 raise EncodingStyleError.new("cannot accept attribute value: #{value} as the value of xsi:#{XSD::NilLiteral} (expected 'true', 'false', '1', or '0')") 522 next 523 when XSD::AttrType 524 type = value 525 next 526 end 527 when EncodingNamespace 528 case qname.name 529 when AttrArrayType 530 arytype = value 531 next 532 when AttrRoot 533 root = RootLiteralMap[value] or 534 raise EncodingStyleError.new( 535 "illegal root attribute value: #{value}") 536 next 537 when AttrOffset 538 offset = value 539 next 540 when AttrPosition 541 position = value 542 next 543 end 544 end 545 if key == 'href' 546 href = value 547 next 548 elsif key == 'id' 549 id = value 550 next 551 end 552 qname = ns.parse_local(key) 553 extraattr[qname] = decode_attr_value(ns, qname, value) 554 end 555 556 return is_nil, type, arytype, root, offset, position, href, id, extraattr 557 end 558 559 def decode_attr_value(ns, qname, value) 500 def extract_attrs(ns, attrs) 501 is_nil = NilLiteralMap[attrs[XSD::AttrNilName]] 502 type = attrs[XSD::AttrTypeName] 503 arytype = attrs[AttrArrayTypeName] 504 root = attrs[AttrRootName] 505 offset = attrs[AttrOffsetName] 506 position = attrs[AttrPositionName] 507 href = attrs[AttrHrefName] 508 id = attrs[AttrIdName] 509 if attrs.key?(Mapping::RubyIVarName) 510 attrs[Mapping::RubyIVarName] = 511 decode_ref_value(ns, attrs[Mapping::RubyIVarName]) 512 end 513 return is_nil, type, arytype, root, offset, position, href, id 514 end 515 516 def decode_ref_value(ns, value) 560 517 if /\A#/ =~ value 561 518 o = SOAPReference.decode(nil, value) trunk/lib/soap/mapping/literalregistry.rb
r1962 r1970 207 207 end 208 208 end 209 add_attributes2soap(obj, ele) 209 obj.__xmlattr.each do |key, value| 210 ele.extraattr[key] = value 211 end 210 212 ele 211 213 end … … 240 242 def elesoap2stubobj(node, obj_class, definition) 241 243 obj = nil 242 if obj_class < ::String 244 if obj_class == ::String 245 obj = node.text 246 elsif obj_class < ::String 243 247 obj = obj_class.new(node.text) 244 248 else … … 266 270 return node.data 267 271 end 268 klass = ::SOAP::Mapping::Object 269 obj = klass.new 270 obj 272 ::SOAP::Mapping::Object.new 271 273 end 272 274 … … 325 327 klass = Mapping.class_from_name(class_name) 326 328 if klass.include?(::SOAP::SOAPBasetype) 327 child = klass. new(attr).data329 child = klass.to_data(attr) 328 330 end 329 331 end trunk/lib/soap/mapping/registry.rb
r1949 r1970 283 283 v 284 284 else 285 klass. new(v).data285 klass.to_data(v) 286 286 end 287 287 end trunk/lib/soap/parser.rb
r1901 r1970 113 113 end 114 114 115 def start_element(name, attrs)115 def start_element(name, raw_attrs) 116 116 lastframe = @parsestack.last 117 117 ns = parent = parent_encodingstyle = nil … … 126 126 end 127 127 # ns might be the same 128 ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 129 encodingstyle = find_encodingstyle(ns, attrs) 128 ns, raw_attrs = XSD::XMLParser.filter_ns(ns, raw_attrs) 129 attrs = decode_attrs(ns, raw_attrs) 130 encodingstyle = attrs[AttrEncodingStyleName] 130 131 # Children's encodingstyle is derived from its parent. 131 132 if encodingstyle.nil? … … 150 151 151 152 def characters(text) 152 lastframe = @parsestack.last153 if lastframe 153 # Ignore Text outside of SOAP Envelope. 154 if lastframe = @parsestack.last 154 155 # Need not to be cloned because character does not have attr. 155 156 decode_text(lastframe.ns, text, lastframe.handler) 156 else157 # Ignore Text outside of SOAP Envelope.158 p text if $DEBUG159 157 end 160 158 end … … 171 169 172 170 private 173 174 def find_encodingstyle(ns, attrs)175 attrs.each do |key, value|176 if (ns.compare(@envelopenamespace, AttrEncodingStyle, key))177 return value178 end179 end180 nil181 end182 171 183 172 def decode_tag(ns, name, attrs, parent, handler) … … 195 184 def decode_tag_end(ns, node, handler) 196 185 return handler.decode_tag_end(ns, node) 186 end 187 188 def decode_attrs(ns, attrs) 189 extraattr = {} 190 attrs.each do |key, value| 191 qname = ns.parse_local(key) 192 extraattr[qname] = value 193 end 194 extraattr 197 195 end 198 196 trunk/lib/soap/rpc/element.rb
r1893 r1970 57 57 def fault=(fault) 58 58 @is_fault = true 59 add _member('fault', fault)59 add('fault', fault) 60 60 end 61 61 end trunk/lib/soap/soap.rb
r1932 r1970 40 40 AttrOffset = 'offset' 41 41 AttrPosition = 'position' 42 AttrHref = 'href' 43 AttrId = 'id' 42 44 ValueArray = 'Array' 43 45 … … 57 59 AttrOffsetName = XSD::QName.new(EncodingNamespace, AttrOffset).freeze 58 60 AttrPositionName = XSD::QName.new(EncodingNamespace, AttrPosition).freeze 61 AttrHrefName = XSD::QName.new(nil, AttrHref).freeze 62 AttrIdName = XSD::QName.new(nil, AttrId).freeze 59 63 ValueArrayName = XSD::QName.new(EncodingNamespace, ValueArray).freeze 60 64 trunk/test/soap/test_extraattr.rb
r1949 r1970 45 45 header = env.header 46 46 body = env.body 47 assert_equal("extraattr", env.extraattr[ "Id"])48 assert_equal("extraattr", header.extraattr[ "Id"])49 assert_equal("extraattr<>", body.extraattr[ "Id"])47 assert_equal("extraattr", env.extraattr[XSD::QName.new(nil, "Id")]) 48 assert_equal("extraattr", header.extraattr[XSD::QName.new(nil, "Id")]) 49 assert_equal("extraattr<>", body.extraattr[XSD::QName.new(nil, "Id")]) 50 50 assert_equal("extraattr", header["headeritem"].element.extraattr[XSD::QName.new(nil, "Id")]) 51 51 end