diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 15:14:02 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 15:14:02 +0000 |
commit | 9cba39a1a1b09f94a5d890e0ad6f4c74bb9f36bf (patch) | |
tree | 559f6780e94880fc3e7c37678fbe8b49ff0556d7 /lib/soap/encodingstyle | |
parent | 0b841783b508c9bddb1c0117b1970fc7c350843b (diff) |
* lib/soap/baseData.rb: Introduce SOAPType as the common ancestor of
SOAPBasetype and SOAPCompoundtype.
* lib/soap/generator.rb, lib/soap/element.rb, lib/soap/encodingstyle/*:
Encoding methods signature change. Pass SOAPGenerator as a parameter.
* lib/soap/mapping/*, test/soap/marshal/test_marshal.rb: Refactoring for better
marshalling/unmarshalling support. Now I think SOAP marshaller supports all
kind of object graph which is supported by Ruby's original marshaller. Of
course there could be bugs as always. Find it. :-)
* lib/soap/rpc/standaloneServer.rb: Set severity threshould to INFO. DEBUG is
too noisy.
* lib/xsd/datatypes.rb: DateTime#of is obsoleted. Use DateTime#offset.
* test/wsdl/emptycomplextype.wsdl, test/xsd/xmlschema.xml: Avoid useless
warning.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4760 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/soap/encodingstyle')
-rw-r--r-- | lib/soap/encodingstyle/aspDotNetHandler.rb | 23 | ||||
-rw-r--r-- | lib/soap/encodingstyle/handler.rb | 4 | ||||
-rw-r--r-- | lib/soap/encodingstyle/literalHandler.rb | 28 | ||||
-rw-r--r-- | lib/soap/encodingstyle/soapHandler.rb | 71 |
4 files changed, 70 insertions, 56 deletions
diff --git a/lib/soap/encodingstyle/aspDotNetHandler.rb b/lib/soap/encodingstyle/aspDotNetHandler.rb index fdce42a48a..b00084e3a9 100644 --- a/lib/soap/encodingstyle/aspDotNetHandler.rb +++ b/lib/soap/encodingstyle/aspDotNetHandler.rb @@ -38,7 +38,7 @@ class ASPDotNetHandler < Handler ### ## encode interface. # - def encode_data(buf, ns, qualified, data, parent, indent = '') + def encode_data(generator, ns, qualified, data, parent) attrs = {} name = if qualified and data.elename.namespace SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace) @@ -49,17 +49,16 @@ class ASPDotNetHandler < Handler case data 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| if !value.elename.namespace value.elename.namespace = data.elename.namespace @@ -67,7 +66,7 @@ class ASPDotNetHandler < Handler yield(value, true) end when SOAPArray - SOAPGenerator.encode_tag(buf, name, attrs, indent) + generator.encode_tag(name, attrs) data.traverse do |child, *rank| data.position = nil yield(child, true) @@ -78,14 +77,14 @@ yle.") 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 diff --git a/lib/soap/encodingstyle/handler.rb b/lib/soap/encodingstyle/handler.rb index 1ab9d86ec5..2cbbd893d8 100644 --- a/lib/soap/encodingstyle/handler.rb +++ b/lib/soap/encodingstyle/handler.rb @@ -69,11 +69,11 @@ class Handler ## encode interface. # # Returns a XML instance as a string. - def encode_data(buf, ns, qualified, data, parent, indent) + def encode_data(generator, ns, qualified, data, parent) raise NotImplementError.new('Method encode_data must be defined in derived class.') end - def encode_data_end(buf, ns, qualified, data, parent, indent) + def encode_data_end(generator, ns, qualified, data, parent) raise NotImplementError.new('Method encode_data must be defined in derived class.') end diff --git a/lib/soap/encodingstyle/literalHandler.rb b/lib/soap/encodingstyle/literalHandler.rb index b5d0d464d7..5ff0e5dd66 100644 --- a/lib/soap/encodingstyle/literalHandler.rb +++ b/lib/soap/encodingstyle/literalHandler.rb @@ -37,7 +37,7 @@ class LiteralHandler < Handler ### ## encode interface. # - def encode_data(buf, ns, qualified, data, parent, indent = '') + def encode_data(generator, ns, qualified, data, parent) attrs = {} name = if qualified and data.elename.namespace SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace) @@ -48,31 +48,29 @@ class LiteralHandler < Handler case data 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| value.elename.namespace = data.elename.namespace if !value.elename.namespace yield(value, true) end when SOAPArray - SOAPGenerator.encode_tag(buf, name, attrs, indent) + generator.encode_tag(name, attrs) data.traverse do |child, *rank| data.position = nil yield(child, true) end when SOAPElement - SOAPGenerator.encode_tag(buf, name, attrs.update(data.extraattr), - indent) - buf << data.text if data.text + generator.encode_tag(name, attrs.update(data.extraattr)) + generator.encode_rawstring(data.text) if data.text data.each do |key, value| value.elename.namespace = data.elename.namespace if !value.elename.namespace #yield(value, data.qualified) @@ -83,13 +81,13 @@ class LiteralHandler < 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 - SOAPGenerator.encode_tag_end(buf, name, indent) + generator.encode_tag_end(name) end 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 }.") |