diff options
Diffstat (limited to 'lib/soap/mapping/wsdlRegistry.rb')
-rw-r--r-- | lib/soap/mapping/wsdlRegistry.rb | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/lib/soap/mapping/wsdlRegistry.rb b/lib/soap/mapping/wsdlRegistry.rb index 66d16c6f90..64f49f2265 100644 --- a/lib/soap/mapping/wsdlRegistry.rb +++ b/lib/soap/mapping/wsdlRegistry.rb @@ -18,10 +18,10 @@ module Mapping class WSDLRegistry include TraverseSupport - attr_reader :complextypes + attr_reader :definedtypes - def initialize(complextypes, config = {}) - @complextypes = complextypes + def initialize(definedtypes, config = {}) + @definedtypes = definedtypes @config = config @excn_handler_obj2soap = nil # For mapping AnyType element. @@ -37,27 +37,20 @@ class WSDLRegistry soap_obj = SOAPNil.new elsif obj.is_a?(XSD::NSDBase) soap_obj = soap2soap(obj, type_qname) - elsif (type = @complextypes[type_qname]) - case type.compoundtype - when :TYPE_STRUCT - soap_obj = struct2soap(obj, type_qname, type) - when :TYPE_ARRAY - soap_obj = array2soap(obj, type_qname, type) - end + elsif type = @definedtypes[type_qname] + soap_obj = obj2type(obj, type) elsif (type = TypeMap[type_qname]) soap_obj = base2soap(obj, type) elsif type_qname == XSD::AnyTypeName soap_obj = @rubytype_factory.obj2soap(nil, obj, nil, nil) end return soap_obj if soap_obj - if @excn_handler_obj2soap soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj| Mapping._obj2soap(yield_obj, self) } end return soap_obj if soap_obj - raise MappingError.new("Cannot map #{ klass.name } to SOAP/OM.") end @@ -74,12 +67,12 @@ private def soap2soap(obj, type_qname) if obj.is_a?(SOAPBasetype) obj - elsif obj.is_a?(SOAPStruct) && (type = @complextypes[type_qname]) + elsif obj.is_a?(SOAPStruct) && (type = @definedtypes[type_qname]) soap_obj = obj mark_marshalled_obj(obj, soap_obj) elements2soap(obj, soap_obj, type.content.elements) soap_obj - elsif obj.is_a?(SOAPArray) && (type = @complextypes[type_qname]) + elsif obj.is_a?(SOAPArray) && (type = @definedtypes[type_qname]) soap_obj = obj contenttype = type.child_type mark_marshalled_obj(obj, soap_obj) @@ -92,6 +85,33 @@ private end end + def obj2type(obj, type) + if type.is_a?(::WSDL::XMLSchema::SimpleType) + simple2soap(obj, type) + else + complex2soap(obj, type) + end + end + + def simple2soap(obj, type) + o = base2soap(obj, TypeMap[type.base]) + if type.restriction.enumeration.empty? + STDERR.puts("#{type.name}: simpleType which is not enum type not supported.") + return o + end + type.check_lexical_format(obj) + o + end + + def complex2soap(obj, type) + case type.compoundtype + when :TYPE_STRUCT + struct2soap(obj, type.name, type) + when :TYPE_ARRAY + array2soap(obj, type.name, type) + end + end + def base2soap(obj, type) soap_obj = nil if type <= XSD::XSDString |