summaryrefslogtreecommitdiff
path: root/lib/soap/mapping/wsdlRegistry.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/soap/mapping/wsdlRegistry.rb')
-rw-r--r--lib/soap/mapping/wsdlRegistry.rb48
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