diff options
Diffstat (limited to 'lib/soap/encodingstyle/soapHandler.rb')
-rw-r--r-- | lib/soap/encodingstyle/soapHandler.rb | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/lib/soap/encodingstyle/soapHandler.rb b/lib/soap/encodingstyle/soapHandler.rb index d755d7b952..114060bd02 100644 --- a/lib/soap/encodingstyle/soapHandler.rb +++ b/lib/soap/encodingstyle/soapHandler.rb @@ -33,7 +33,7 @@ class SOAPHandler < Handler attrs = encode_attrs(generator, ns, data, parent) if parent && parent.is_a?(SOAPArray) && parent.position - attrs[ns.name(AttrPositionName)] = '[' << parent.position.join(',') << ']' + attrs[ns.name(AttrPositionName)] = "[#{ parent.position.join(',') }]" end name = nil @@ -207,16 +207,12 @@ class SOAPHandler < Handler node.replace_node(newnode) o = node.node end - if o.is_a?(SOAPCompoundtype) - o.definedtype = nil - end - decode_textbuf(o) - @textbuf = '' + # unlink definedtype + o.definedtype = nil end def decode_text(ns, text) - # @textbuf is set at decode_tag_end. @textbuf << text end @@ -240,11 +236,9 @@ class SOAPHandler < Handler end parent.replace_node(newparent) decode_parent(parent, node) - when SOAPStruct parent.node.add(node.elename.name, node) node.parent = parent.node - when SOAPArray if node.position parent.node[*(decode_arypos(node.position))] = node @@ -253,10 +247,8 @@ class SOAPHandler < Handler parent.node.add(node) end node.parent = parent.node - when SOAPBasetype raise EncodingStyleError.new("SOAP base type must not have a child.") - else raise EncodingStyleError.new("Illegal parent: #{ parent.node }.") end @@ -274,7 +266,7 @@ private def create_arytype(ns, data) XSD::QName.new(data.arytype.namespace, - content_typename(data.arytype.name) << '[' << data.size.join(',') << ']') + content_typename(data.arytype.name) + "[#{ data.size.join(',') }]") end def encode_attrs(generator, ns, data, parent) @@ -353,8 +345,7 @@ private typename = ns.parse(typestr) typedef = @decode_typemap[typename] if typedef - return decode_defined_compoundtype(elename, typename, typedef, - arytypestr) + return decode_definedtype(elename, typename, typedef, arytypestr) end end return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, @@ -376,21 +367,42 @@ private definedtype_name = parenttype.child_type(elename) if definedtype_name and (klass = TypeMap[definedtype_name]) - return klass.decode(elename) + return decode_basetype(klass, elename) elsif definedtype_name == XSD::AnyTypeName return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, extraattr) end - typedef = definedtype_name ? @decode_typemap[definedtype_name] : - parenttype.child_defined_complextype(elename) - decode_defined_compoundtype(elename, definedtype_name, typedef, arytypestr) + if definedtype_name + typedef = @decode_typemap[definedtype_name] + else + typedef = parenttype.child_defined_complextype(elename) + end + decode_definedtype(elename, definedtype_name, typedef, arytypestr) end - def decode_defined_compoundtype(elename, typename, typedef, arytypestr) + def decode_definedtype(elename, typename, typedef, arytypestr) unless typedef raise EncodingStyleError.new("Unknown type '#{ typename }'.") end + if typedef.is_a?(::WSDL::XMLSchema::SimpleType) + decode_defined_simpletype(elename, typename, typedef, arytypestr) + else + decode_defined_complextype(elename, typename, typedef, arytypestr) + end + end + + def decode_basetype(klass, elename) + klass.decode(elename) + end + + def decode_defined_simpletype(elename, typename, typedef, arytypestr) + o = decode_basetype(TypeMap[typedef.base], elename) + o.definedtype = typedef + o + end + + def decode_defined_complextype(elename, typename, typedef, arytypestr) case typedef.compoundtype when :TYPE_STRUCT o = SOAPStruct.decode(elename, typename) @@ -410,7 +422,7 @@ private o.definedtype = typedef return o end - return nil + nil end def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, extraattr) @@ -435,7 +447,7 @@ private end if (klass = TypeMap[type]) - node = klass.decode(elename) + node = decode_basetype(klass, elename) node.extraattr.update(extraattr) return node end @@ -450,10 +462,12 @@ private node.set_encoded(@textbuf) when XSD::XSDString if @charset - node.set(XSD::Charset.encoding_from_xml(@textbuf, @charset)) - else - node.set(@textbuf) + @textbuf = XSD::Charset.encoding_from_xml(@textbuf, @charset) + end + if node.definedtype + node.definedtype.check_lexical_format(@textbuf) end + node.set(@textbuf) when SOAPNil # Nothing to do. when SOAPBasetype @@ -461,6 +475,7 @@ private else # Nothing to do... end + @textbuf = '' end NilLiteralMap = { |