diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 15:14:02 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 15:14:02 +0000 |
commit | 9cba39a1a1b09f94a5d890e0ad6f4c74bb9f36bf (patch) | |
tree | 559f6780e94880fc3e7c37678fbe8b49ff0556d7 /lib/soap/mapping/registry.rb | |
parent | 0b841783b508c9bddb1c0117b1970fc7c350843b (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/mapping/registry.rb')
-rw-r--r-- | lib/soap/mapping/registry.rb | 119 |
1 files changed, 84 insertions, 35 deletions
diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb index 568f34ac3e..bdf14d4fc6 100644 --- a/lib/soap/mapping/registry.rb +++ b/lib/soap/mapping/registry.rb @@ -39,6 +39,8 @@ module MappedException; end RubyTypeName = XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType') +RubyExtendName = XSD::QName.new(RubyTypeInstanceNamespace, 'extends') +RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars') # Inner class to pass an exception. @@ -217,11 +219,11 @@ class Registry [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory], [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory], [::String, ::SOAP::SOAPString, StringFactory], - [::DateTime, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Date, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Date, ::SOAP::SOAPDate, BasetypeFactory], - [::Time, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Time, ::SOAP::SOAPTime, BasetypeFactory], + [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Date, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Date, ::SOAP::SOAPDate, DateTimeFactory], + [::Time, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Time, ::SOAP::SOAPTime, DateTimeFactory], [::Float, ::SOAP::SOAPDouble, BasetypeFactory, {:derived_class => true}], [::Float, ::SOAP::SOAPFloat, BasetypeFactory, @@ -261,11 +263,11 @@ class Registry [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory], [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory], [::String, ::SOAP::SOAPString, StringFactory], - [::DateTime, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Date, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Date, ::SOAP::SOAPDate, BasetypeFactory], - [::Time, ::SOAP::SOAPDateTime, BasetypeFactory], - [::Time, ::SOAP::SOAPTime, BasetypeFactory], + [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Date, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Date, ::SOAP::SOAPDate, DateTimeFactory], + [::Time, ::SOAP::SOAPDateTime, DateTimeFactory], + [::Time, ::SOAP::SOAPTime, DateTimeFactory], [::Float, ::SOAP::SOAPDouble, BasetypeFactory, {:derived_class => true}], [::Float, ::SOAP::SOAPFloat, BasetypeFactory, @@ -304,18 +306,18 @@ class Registry @config = config @map = Map.new(self) if @config[:allow_original_mapping] - allow_original_mapping = true + @allow_original_mapping = true @map.init(RubyOriginalMap) else - allow_original_mapping = false + @allow_original_mapping = false @map.init(SOAPBaseMap) end - allow_untyped_struct = @config.key?(:allow_untyped_struct) ? + @allow_untyped_struct = @config.key?(:allow_untyped_struct) ? @config[:allow_untyped_struct] : true @rubytype_factory = RubytypeFactory.new( - :allow_untyped_struct => allow_untyped_struct, - :allow_original_mapping => allow_original_mapping + :allow_untyped_struct => @allow_untyped_struct, + :allow_original_mapping => @allow_original_mapping ) @default_factory = @rubytype_factory @excn_handler_obj2soap = nil @@ -329,8 +331,47 @@ class Registry # This mapping registry ignores type hint. def obj2soap(klass, obj, type = nil) + soap = _obj2soap(klass, obj, type) + if @allow_original_mapping + addextend2soap(soap, obj) + end + soap + end + + def soap2obj(klass, node) + obj = _soap2obj(klass, node) + if @allow_original_mapping + addextend2obj(obj, node.extraattr[RubyExtendName]) + addiv2obj(obj, node.extraattr[RubyIVarName]) + end + obj + end + + def default_factory=(factory) + @default_factory = factory + end + + def excn_handler_obj2soap=(handler) + @excn_handler_obj2soap = handler + end + + def excn_handler_soap2obj=(handler) + @excn_handler_soap2obj = handler + end + + def find_mapped_soap_class(obj_class) + @map.find_mapped_soap_class(obj_class) + end + + def find_mapped_obj_class(soap_class) + @map.find_mapped_obj_class(soap_class) + end + +private + + def _obj2soap(klass, obj, type) ret = nil - if obj.is_a?(SOAPStruct) || obj.is_a?(SOAPArray) + if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray) obj.replace do |ele| Mapping._obj2soap(ele, self) end @@ -344,18 +385,17 @@ class Registry rescue MappingError end return ret if ret - if @excn_handler_obj2soap ret = @excn_handler_obj2soap.call(obj) { |yield_obj| Mapping._obj2soap(yield_obj, self) } end return ret if ret - raise MappingError.new("Cannot map #{ klass.name } to SOAP/OM.") end - def soap2obj(klass, node) + # Might return nil as a mapping result. + def _soap2obj(klass, node) if node.extraattr.key?(RubyTypeName) conv, obj = @rubytype_factory.soap2obj(klass, node, nil, self) return obj if conv @@ -369,34 +409,43 @@ class Registry if @excn_handler_soap2obj begin return @excn_handler_soap2obj.call(node) { |yield_node| - Mapping._soap2obj(yield_node, self) - } + Mapping._soap2obj(yield_node, self) + } rescue Exception end end - raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.") end - def default_factory=(factory) - @default_factory = factory - end - - def excn_handler_obj2soap=(handler) - @excn_handler_obj2soap = handler + def addiv2obj(obj, attr) + return unless attr + vars = {} + attr.__getobj__.each do |name, value| + vars[name] = Mapping._soap2obj(value, self) + end + Mapping.set_instance_vars(obj, vars) end - def excn_handler_soap2obj=(handler) - @excn_handler_soap2obj = handler + def addextend2obj(obj, attr) + return unless attr + attr.split(/ /).reverse_each do |mstr| + obj.extend(Mapping.class_from_name(mstr)) + end end - def find_mapped_soap_class(obj_class) - @map.find_mapped_soap_class(obj_class) + def addextend2soap(node, obj) + return if obj.is_a?(Symbol) or obj.is_a?(Fixnum) + list = (class << obj; self; end).ancestors - obj.class.ancestors + unless list.empty? + node.extraattr[RubyExtendName] = list.collect { |c| + if c.name.empty? + raise TypeError.new("singleton can't be dumped #{ obj }") + end + c.name + }.join(" ") + end end - def find_mapped_obj_class(soap_class) - @map.find_mapped_obj_class(soap_class) - end end |