diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-25 07:31:33 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-25 07:31:33 +0000 |
commit | 6a09e1d9664f86b7deb576fb0dfe57e10503bb85 (patch) | |
tree | 49dc2abcb7640c805848e543d4e5d110cbde5ad6 /lib/soap/encodingstyle/soapHandler.rb | |
parent | ec373c3e1c332f814225c3d49ded8217545470e2 (diff) |
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/soap/encodingstyle/soapHandler.rb')
-rw-r--r-- | lib/soap/encodingstyle/soapHandler.rb | 111 |
1 files changed, 57 insertions, 54 deletions
diff --git a/lib/soap/encodingstyle/soapHandler.rb b/lib/soap/encodingstyle/soapHandler.rb index 0c68810cce..51780f5520 100644 --- a/lib/soap/encodingstyle/soapHandler.rb +++ b/lib/soap/encodingstyle/soapHandler.rb @@ -1,20 +1,9 @@ -=begin -SOAP4R - SOAP EncodingStyle handler library -Copyright (C) 2001, 2003 NAKAMURA, Hiroshi. +# SOAP4R - SOAP EncodingStyle handler library +# Copyright (C) 2001, 2003 NAKAMURA, Hiroshi <[email protected]>. -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PRATICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 675 Mass -Ave, Cambridge, MA 02139, USA. -=end +# This program is copyrighted free software by NAKAMURA, Hiroshi. You can +# redistribute it and/or modify it under the same terms of Ruby's license; +# either the dual license version in 2003, or any later version. require 'soap/encodingstyle/handler' @@ -172,10 +161,9 @@ class SOAPHandler < Handler elsif href o = SOAPReference.decode(elename, href) @refpool << o - elsif @decode_typemap && - (parent.node.class != SOAPBody || @is_first_top_ele) - # multi-ref element should be parsed by decode_tag_by_type. - @is_first_top_ele = false + elsif @decode_typemap + # to parse multi-ref element with decode_tag_by_type. + # && (parent.node.class != SOAPBody || @is_first_top_ele) o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, extraattr) else o = decode_tag_by_type(ns, elename, type, parent.node, arytype, extraattr) @@ -344,15 +332,30 @@ private end def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr) + o = nil if parent.class == SOAPBody - # Unqualified name is allowed here. - type = @decode_typemap[elename] || @decode_typemap.find_name(elename.name) - unless type - raise EncodingStyleError.new("Unknown operation '#{ elename }'.") + if @is_first_top_ele + # Unqualified name is allowed here. + @is_first_top_ele = false + type = @decode_typemap[elename] || + @decode_typemap.find_name(elename.name) + unless type + raise EncodingStyleError.new("Unknown operation '#{ elename }'.") + end + o = SOAPStruct.new(elename) + o.definedtype = type + return o + elsif !typestr + # typeless multi-ref element. + return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, + extraattr) + else + # typed multi-ref element. + typename = ns.parse(typestr) + typedef = @decode_typemap[typename] + return decode_defined_compoundtype(elename, typename, typedef, + arytypestr) end - o = SOAPStruct.new(elename) - o.definedtype = type - return o end if parent.type == XSD::AnyTypeName @@ -366,41 +369,41 @@ private unless parenttype raise EncodingStyleError.new("Unknown type '#{ parent.type }'.") end - typename = parenttype.child_type(elename) - if typename - if (klass = TypeMap[typename]) - return klass.decode(elename) - elsif typename == XSD::AnyTypeName - return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, - extraattr) - end + + definedtype_name = parenttype.child_type(elename) + if definedtype_name and (klass = TypeMap[definedtype_name]) + return klass.decode(elename) + elsif definedtype_name == XSD::AnyTypeName + return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, + extraattr) end - type = if typename - @decode_typemap[typename] - else - parenttype.child_defined_complextype(elename) - end - unless type + typedef = definedtype_name ? @decode_typemap[definedtype_name] : + parenttype.child_defined_complextype(elename) + decode_defined_compoundtype(elename, definedtype_name, typedef, arytypestr) + end + + def decode_defined_compoundtype(elename, typename, typedef, arytypestr) + unless typedef raise EncodingStyleError.new("Unknown type '#{ typename }'.") end - - case type.compoundtype + case typedef.compoundtype when :TYPE_STRUCT o = SOAPStruct.decode(elename, typename) - o.definedtype = type + o.definedtype = typedef return o when :TYPE_ARRAY - expected_arytype = type.find_arytype - actual_arytype = if arytypestr - XSD::QName.new(expected_arytype.namespace, - content_typename(expected_arytype.name) << - content_ranksize(arytypestr)) - else - expected_arytype - end - o = SOAPArray.decode(elename, typename, actual_arytype) - o.definedtype = type + expected_arytype = typedef.find_arytype + if arytypestr + actual_arytype = XSD::QName.new(expected_arytype.namespace, + content_typename(expected_arytype.name) << + content_ranksize(arytypestr)) + o = SOAPArray.decode(elename, typename, actual_arytype) + else + o = SOAPArray.new(typename, 1, expected_arytype) + o.elename = elename + end + o.definedtype = typedef return o end return nil |