diff options
Diffstat (limited to 'lib/soap/encodingstyle/soapHandler.rb')
-rw-r--r-- | lib/soap/encodingstyle/soapHandler.rb | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/lib/soap/encodingstyle/soapHandler.rb b/lib/soap/encodingstyle/soapHandler.rb index b1b5072e49..85d8642b8c 100644 --- a/lib/soap/encodingstyle/soapHandler.rb +++ b/lib/soap/encodingstyle/soapHandler.rb @@ -40,8 +40,8 @@ class SOAPHandler < Handler ### ## encode interface. # - def encode_data(buf, ns, qualified, data, parent, indent = '') - attrs = encode_attrs(ns, qualified, data, parent) + def encode_data(generator, ns, qualified, data, parent) + attrs = encode_attrs(generator, ns, data, parent) if parent && parent.is_a?(SOAPArray) && parent.position attrs[ns.name(AttrPositionName)] = '[' << parent.position.join(',') << ']' @@ -55,32 +55,26 @@ class SOAPHandler < Handler name = data.elename.name end - if data.respond_to?(:encode) - SOAPGenerator.encode_tag(buf, name, attrs, indent) - return data.encode(buf, ns, attrs, indent) - end - case data when SOAPReference attrs['href'] = '#' << data.refid - SOAPGenerator.encode_tag(buf, name, attrs, indent) + generator.encode_tag(name, attrs) when SOAPRawString - SOAPGenerator.encode_tag(buf, name, attrs, indent) - buf << data.to_s + generator.encode_tag(name, attrs) + generator.encode_rawstring(data.to_s) when XSD::XSDString - SOAPGenerator.encode_tag(buf, name, attrs, indent) - buf << SOAPGenerator.encode_str(@charset ? - XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) + generator.encode_tag(name, attrs) + generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) when XSD::XSDAnySimpleType - SOAPGenerator.encode_tag(buf, name, attrs, indent) - buf << SOAPGenerator.encode_str(data.to_s) + generator.encode_tag(name, attrs) + generator.encode_string(data.to_s) when SOAPStruct - SOAPGenerator.encode_tag(buf, name, attrs, indent) + generator.encode_tag(name, attrs) data.each do |key, value| yield(value, false) end when SOAPArray - SOAPGenerator.encode_tag(buf, name, attrs, indent) + generator.encode_tag(name, attrs) data.traverse do |child, *rank| data.position = data.sparse ? rank : nil yield(child, false) @@ -91,14 +85,14 @@ class SOAPHandler < Handler end end - def encode_data_end(buf, ns, qualified, data, parent, indent = '') + def encode_data_end(generator, ns, qualified, data, parent) name = if qualified and data.elename.namespace ns.name(data.elename) else data.elename.name end cr = data.is_a?(SOAPCompoundtype) - SOAPGenerator.encode_tag_end(buf, name, indent, cr) + generator.encode_tag_end(name, cr) end @@ -292,7 +286,7 @@ private content_typename(data.arytype.name) << '[' << data.size.join(',') << ']') end - def encode_attrs(ns, qualified, data, parent) + def encode_attrs(generator, ns, data, parent) return {} if data.is_a?(SOAPReference) attrs = {} @@ -330,7 +324,7 @@ private data.extraattr.each do |key, value| SOAPGenerator.assign_ns(attrs, ns, key.namespace) - attrs[ns.name(key)] = value # ns.name(value) ? + attrs[ns.name(key)] = encode_attr_value(generator, ns, key, value) end if data.id attrs['id'] = data.id @@ -338,6 +332,17 @@ private attrs end + def encode_attr_value(generator, ns, qname, value) + if value.is_a?(SOAPType) + refid = SOAPReference.create_refid(value) + value.id = refid + generator.add_reftarget(qname.name, value) + '#' + refid + else + value.to_s + end + end + def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr) if parent.class == SOAPBody # Unqualified name is allowed here. @@ -423,11 +428,13 @@ private end if (klass = TypeMap[type]) - klass.decode(elename) - else - # Unknown type... Struct or String - SOAPUnknown.new(self, elename, type, extraattr) + node = klass.decode(elename) + node.extraattr.update(extraattr) + return node end + + # Unknown type... Struct or String + SOAPUnknown.new(self, elename, type, extraattr) end def decode_textbuf(node) @@ -508,12 +515,22 @@ private id = value next end - extraattr[qname] = value + extraattr[qname] = decode_attr_value(ns, qname, value) end return is_nil, type, arytype, root, offset, position, href, id, extraattr end + def decode_attr_value(ns, qname, value) + if /\A#/ =~ value + o = SOAPReference.new(value) + @refpool << o + o + else + value + end + end + def decode_arypos(position) /^\[(.+)\]$/ =~ position $1.split(',').collect { |s| s.to_i } @@ -524,7 +541,7 @@ private while !@refpool.empty? && count > 0 @refpool = @refpool.find_all { |ref| o = @idpool.find { |item| - ('#' << item.id == ref.refid) + '#' + item.id == ref.refid } unless o raise EncodingStyleError.new("Unresolved reference: #{ ref.refid }.") |