summaryrefslogtreecommitdiff
path: root/lib/soap/encodingstyle
diff options
context:
space:
mode:
authornahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-14 15:14:02 +0000
committernahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-14 15:14:02 +0000
commit9cba39a1a1b09f94a5d890e0ad6f4c74bb9f36bf (patch)
tree559f6780e94880fc3e7c37678fbe8b49ff0556d7 /lib/soap/encodingstyle
parent0b841783b508c9bddb1c0117b1970fc7c350843b (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.rb23
-rw-r--r--lib/soap/encodingstyle/handler.rb4
-rw-r--r--lib/soap/encodingstyle/literalHandler.rb28
-rw-r--r--lib/soap/encodingstyle/soapHandler.rb71
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 }.")