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