diff options
Diffstat (limited to 'lib/soap/mapping/registry.rb')
-rw-r--r-- | lib/soap/mapping/registry.rb | 99 |
1 files changed, 64 insertions, 35 deletions
diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb index 8142047724..1317d40cd6 100644 --- a/lib/soap/mapping/registry.rb +++ b/lib/soap/mapping/registry.rb @@ -44,14 +44,15 @@ class SOAPException; include Marshallable if @cause.is_a?(::Exception) @cause.extend(::SOAP::Mapping::MappedException) return @cause + elsif @cause.respond_to?(:message) and @cause.respond_to?(:backtrace) + e = RuntimeError.new(@cause.message) + e.set_backtrace(@cause.backtrace) + return e end klass = Mapping.class_from_name( Mapping.elename2name(@excn_type_name.to_s)) - if klass.nil? - raise RuntimeError.new(@cause.message) - end - unless klass <= ::Exception - raise NameError.new + if klass.nil? or not klass <= ::Exception + return RuntimeError.new(@cause.inspect) end obj = klass.new(@cause.message) obj.extend(::SOAP::Mapping::MappedException) @@ -62,50 +63,78 @@ end # For anyType object: SOAP::Mapping::Object not ::Object class Object; include Marshallable - def set_property(name, value) - var_name = name - begin - instance_eval <<-EOS - def #{ var_name } - @#{ var_name } - end + def initialize + @__members = [] + @__value_type = {} + end - def #{ var_name }=(value) - @#{ var_name } = value - end - EOS - self.send(var_name + '=', value) - rescue SyntaxError - var_name = safe_name(var_name) - retry + def [](name) + if @__members.include?(name) + self.__send__(name) + else + self.__send__(Object.safe_name(name)) end + end + + def []=(name, value) + if @__members.include?(name) + self.__send__(name + '=', value) + else + self.__send__(Object.safe_name(name) + '=', value) + end + end + def __set_property(name, value) + var_name = name + unless @__members.include?(name) + var_name = __define_attr_accessor(var_name) + end + __set_property_value(var_name, value) var_name end - def members - instance_variables.collect { |str| str[1..-1] } + def __members + @__members end - def [](name) - if self.respond_to?(name) - self.send(name) +private + + def __set_property_value(name, value) + org = self.__send__(name) + case @__value_type[name] + when :single + self.__send__(name + '=', [org, value]) + @__value_type[name] = :multi + when :multi + org << value else - self.send(safe_name(name)) + self.__send__(name + '=', value) + @__value_type[name] = :single end + value end - def []=(name, value) - if self.respond_to?(name) - self.send(name + '=', value) - else - self.send(safe_name(name) + '=', value) + def __define_attr_accessor(name) + var_name = name + begin + instance_eval <<-EOS + def #{ var_name } + @#{ var_name } + end + + def #{ var_name }=(value) + @#{ var_name } = value + end + EOS + rescue SyntaxError + var_name = Object.safe_name(var_name) + retry end + @__members << var_name + var_name end -private - - def safe_name(name) + def Object.safe_name(name) require 'md5' "var_" << MD5.new(name).hexdigest end @@ -309,7 +338,7 @@ class Registry def add(obj_class, soap_class, factory, info = nil) @map.add(obj_class, soap_class, factory, info) end - alias :set :add + alias set add # This mapping registry ignores type hint. def obj2soap(klass, obj, type_qname = nil) |