diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | lib/soap/baseData.rb | 21 | ||||
-rw-r--r-- | lib/soap/mapping/factory.rb | 2 | ||||
-rw-r--r-- | lib/soap/mapping/mapping.rb | 29 | ||||
-rw-r--r-- | lib/soap/mapping/registry.rb | 57 | ||||
-rw-r--r-- | lib/soap/mapping/wsdlencodedregistry.rb | 2 | ||||
-rw-r--r-- | lib/soap/rpc/driver.rb | 45 | ||||
-rw-r--r-- | lib/soap/wsdlDriver.rb | 45 | ||||
-rw-r--r-- | sample/soap/authheader/client2.rb | 15 | ||||
-rw-r--r-- | sample/soap/authheader/server.rb | 1 | ||||
-rw-r--r-- | sample/soap/authheader/server2.rb | 22 | ||||
-rw-r--r-- | test/soap/test_soapelement.rb | 2 |
12 files changed, 118 insertions, 131 deletions
@@ -1,3 +1,7 @@ +Wed Dec 22 00:08:01 2004 NAKAMURA, Hiroshi <nakahiro@sarion.co.jp> + + * lib/soap/*, test/soap/*, sample/soap/authheader/*: eval cleanup. + Tue Dec 21 22:07:33 2004 GOTOU Yuuzou <gotoyuzo@notwork.org> * ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode, @@ -6,9 +10,9 @@ Tue Dec 21 22:07:33 2004 GOTOU Yuuzou <gotoyuzo@notwork.org> Tue Dec 21 14:40:02 2004 GOTOU Yuuzou <gotoyuzo@notwork.org> * ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode, - ossl_asn1_decode_all): use rb_str_new4 to avoid SEGV. + ossl_asn1_decode_all): use rb_str_new4 to avoid SEGV. fix [ruby-dev:25261] - + * test/openssl/test_asn1.rb: add tests for OpenSSL::ASN1. Tue Dec 21 12:22:40 2004 Nobuyoshi Nakada <nobu@ruby-lang.org> diff --git a/lib/soap/baseData.rb b/lib/soap/baseData.rb index 2d3d059ebf..bf2fe6b25c 100644 --- a/lib/soap/baseData.rb +++ b/lib/soap/baseData.rb @@ -595,20 +595,13 @@ private if self.respond_to?(methodname) methodname = safe_accessor_name(methodname) end - begin - instance_eval <<-EOS - def #{ methodname }() - @data[@array.index('#{ name }')] - end - - def #{ methodname }=(value) - @data[@array.index('#{ name }')] = value - end - EOS - rescue SyntaxError - methodname = safe_accessor_name(methodname) - retry - end + sclass = class << self; self; end + sclass.__send__(:define_method, methodname, proc { + @data[@array.index(name)] + }) + sclass.__send__(:define_method, methodname + '=', proc { |value| + @data[@array.index(name)] = value + }) end def safe_accessor_name(name) diff --git a/lib/soap/mapping/factory.rb b/lib/soap/mapping/factory.rb index 8e82ae5efd..a535458c5a 100644 --- a/lib/soap/mapping/factory.rb +++ b/lib/soap/mapping/factory.rb @@ -41,7 +41,7 @@ class Factory obj.instance_variables.each do |var| name = var.sub(/^@/, '') node.add(Mapping.name2elename(name), - Mapping._obj2soap(obj.instance_eval(var), map)) + Mapping._obj2soap(obj.instance_variable_get(var), map)) end end diff --git a/lib/soap/mapping/mapping.rb b/lib/soap/mapping/mapping.rb index 17a0d3bcf4..e04e3fa50d 100644 --- a/lib/soap/mapping/mapping.rb +++ b/lib/soap/mapping/mapping.rb @@ -156,13 +156,26 @@ module Mapping ::Marshal.load(sprintf("\004\006o:%c%s\000", name.length + 5, name)) end end + + unless Object.respond_to?(:instance_variable_get) + class Object + def instance_variable_get(ivarname) + instance_eval(ivarname) + end + + def instance_variable_set(ivarname, value) + instance_eval("#{ivarname} = value") + end + end + end + def self.set_instance_vars(obj, values) values.each do |name, value| setter = name + "=" if obj.respond_to?(setter) obj.__send__(setter, value) else - obj.instance_eval("@#{ name } = value") + obj.instance_variable_set('@' + name, value) end end end @@ -202,12 +215,12 @@ module Mapping def self.class2qname(klass) name = if klass.class_variables.include?("@@schema_type") - klass.class_eval("@@schema_type") + klass.class_eval('@@schema_type') else nil end namespace = if klass.class_variables.include?("@@schema_ns") - klass.class_eval("@@schema_ns") + klass.class_eval('@@schema_ns') else nil end @@ -224,11 +237,11 @@ module Mapping def self.obj2element(obj) name = namespace = nil ivars = obj.instance_variables - if ivars.include?("@schema_type") - name = obj.instance_eval("@schema_type") + if ivars.include?('@schema_type') + name = obj.instance_variable_get('@schema_type') end - if ivars.include?("@schema_ns") - namespace = obj.instance_eval("@schema_ns") + if ivars.include?('@schema_ns') + namespace = obj.instance_variable_get('@schema_ns') end if !name or !namespace class2qname(obj.class) @@ -245,7 +258,7 @@ module Mapping if obj.respond_to?(name) obj.__send__(name) else - obj.instance_eval("@#{name}") + obj.instance_variable_get('@' + name) end end end diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb index 24cd57fa71..e62706f2d8 100644 --- a/lib/soap/mapping/registry.rb +++ b/lib/soap/mapping/registry.rb @@ -64,75 +64,50 @@ end # For anyType object: SOAP::Mapping::Object not ::Object class Object; include Marshallable def initialize - @__soap_members = [] @__soap_value_type = {} + @__soap_value = {} end def [](name) - if @__soap_members.include?(name) - self.__send__(name) - else - self.__send__(Object.safe_name(name)) - end + @__soap_value[name] end def []=(name, value) - if @__soap_members.include?(name) - self.__send__(name + '=', value) - else - self.__send__(Object.safe_name(name) + '=', value) - end + @__soap_value[name] = value end def __soap_set_property(name, value) - var_name = name - unless @__soap_members.include?(name) - var_name = __define_attr_accessor(var_name) + unless @__soap_value.key?(name) + __define_attr_accessor(name) end - __soap_set_property_value(var_name, value) - var_name + __soap_set_property_value(name, value) end private def __soap_set_property_value(name, value) - org = self.__send__(name) + org = self[name] case @__soap_value_type[name] when :single - self.__send__(name + '=', [org, value]) + self[name] = [org, value] @__soap_value_type[name] = :multi when :multi org << value else - self.__send__(name + '=', value) + self[name] = value @__soap_value_type[name] = :single end value end 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 - @__soap_members << var_name - var_name - end - - def Object.safe_name(name) - require 'md5' - "var_" << MD5.new(name).hexdigest + sclass = class << self; self; end + sclass.__send__(:define_method, name, proc { + self[name] + }) + sclass.__send__(:define_method, name + '=', proc { |value| + self[name] = value + }) end end diff --git a/lib/soap/mapping/wsdlencodedregistry.rb b/lib/soap/mapping/wsdlencodedregistry.rb index 4433c73cf0..335106fba1 100644 --- a/lib/soap/mapping/wsdlencodedregistry.rb +++ b/lib/soap/mapping/wsdlencodedregistry.rb @@ -162,7 +162,7 @@ private def elements2soap(obj, soap_obj, elements) elements.each do |element| name = element.name.name - child_obj = obj.instance_eval("@#{ name }") + child_obj = obj.instance_variable_get('@' + name) soap_obj.add(name, Mapping._obj2soap(child_obj, self, element.type)) end end diff --git a/lib/soap/rpc/driver.rb b/lib/soap/rpc/driver.rb index 028addc3eb..5fd755c51a 100644 --- a/lib/soap/rpc/driver.rb +++ b/lib/soap/rpc/driver.rb @@ -27,17 +27,13 @@ class Driver class << self def __attr_proxy(symbol, assignable = false) name = symbol.to_s - module_eval <<-EOD - def #{name} - @servant.#{name} - end - EOD + self.__send__(:define_method, name, proc { + @servant.__send__(name) + }) if assignable - module_eval <<-EOD - def #{name}=(rhs) - @servant.#{name} = rhs - end - EOD + self.__send__(:define_method, name + '=', proc { |rhs| + @servant.__send__(name + '=', rhs) + }) end end end @@ -292,28 +288,27 @@ private end def add_rpc_method_interface(name, param_def) - param_names = [] - i = 0 + param_count = 0 @proxy.operation[name].each_param_name(RPC::SOAPMethod::IN, RPC::SOAPMethod::INOUT) do |param_name| - i += 1 - param_names << "arg#{ i }" + param_count += 1 end - callparam = (param_names.collect { |pname| ", " + pname }).join - @host.instance_eval <<-EOS - def #{ name }(#{ param_names.join(", ") }) - @servant.call(#{ name.dump }#{ callparam }) - end - EOS + sclass = class << @host; self; end + sclass.__send__(:define_method, name, proc { |*arg| + unless arg.size == param_count + raise ArgumentError.new( + "wrong number of arguments (#{arg.size} for #{param_count})") + end + @servant.call(name, *arg) + }) @host.method(name) end def add_document_method_interface(name, paramname) - @host.instance_eval <<-EOS - def #{ name }(param) - @servant.call(#{ name.dump }, param) - end - EOS + sclass = class << @host; self; end + sclass.__send__(:define_method, name, proc { |param| + @servant.call(name, param) + }) @host.method(name) end diff --git a/lib/soap/wsdlDriver.rb b/lib/soap/wsdlDriver.rb index aa822df4e4..83db5c133c 100644 --- a/lib/soap/wsdlDriver.rb +++ b/lib/soap/wsdlDriver.rb @@ -79,17 +79,13 @@ class WSDLDriver class << self def __attr_proxy(symbol, assignable = false) name = symbol.to_s - module_eval <<-EOD - def #{name} - @servant.#{name} - end - EOD + self.__send__(:define_method, name, proc { + @servant.__send__(name) + }) if assignable - module_eval <<-EOD - def #{name}=(rhs) - @servant.#{name} = rhs - end - EOD + self.__send__(:define_method, name + '=', proc { |rhs| + @servant.__send__(name + '=', rhs) + }) end end end @@ -348,7 +344,7 @@ class WSDLDriver def create_method_obj(names, params) o = Object.new for idx in 0 ... params.length - o.instance_eval("@#{ names[idx] } = params[idx]") + o.instance_variable_set('@' + names[idx], params[idx]) end o end @@ -436,22 +432,23 @@ class WSDLDriver end def add_rpc_method_interface(name, parts_names) - i = 0 - param_names = parts_names.collect { |orgname| i += 1; "arg#{ i }" } - callparam = (param_names.collect { |pname| ", " + pname }).join - @host.instance_eval <<-EOS - def #{ name }(#{ param_names.join(", ") }) - @servant.rpc_call(#{ name.dump }#{ callparam }) - end - EOS + sclass = class << @host; self; end + sclass.__send__(:define_method, name, proc { |*arg| + unless arg.size == parts_names.size + raise ArgumentError.new( + "wrong number of arguments (#{arg.size} for #{parts_names.size})") + end + @servant.rpc_call(name, *arg) + }) + @host.method(name) end def add_document_method_interface(name) - @host.instance_eval <<-EOS - def #{ name }(h, b) - @servant.document_send(#{ name.dump }, h, b) - end - EOS + sclass = class << @host; self; end + sclass.__send__(:define_method, name, proc { |h, b| + @servant.document_send(name, h, b) + }) + @host.method(name) end def setup_options diff --git a/sample/soap/authheader/client2.rb b/sample/soap/authheader/client2.rb index 58a7da45ae..aa5172a5b1 100644 --- a/sample/soap/authheader/client2.rb +++ b/sample/soap/authheader/client2.rb @@ -6,18 +6,16 @@ server = ARGV.shift || 'http://localhost:7000/' class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth") - def initialize(userid, passwd) + attr_accessor :sessionid + + def initialize super(MyHeaderName) @sessionid = nil - @userid = userid - @passwd = passwd end def on_simple_outbound if @sessionid { "sessionid" => @sessionid } - else - { "userid" => @userid, "passwd" => @passwd } end end @@ -28,12 +26,17 @@ end ns = 'http://tempuri.org/authHeaderPort' serv = SOAP::RPC::Driver.new(server, ns) +serv.add_method('login', 'userid', 'passwd') serv.add_method('deposit', 'amt') serv.add_method('withdrawal', 'amt') -serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd') +h = ClientAuthHeaderHandler.new + +serv.headerhandler << h serv.wiredump_dev = STDOUT +sessionid = serv.login('NaHi', 'passwd') +h.sessionid = sessionid p serv.deposit(150) p serv.withdrawal(120) diff --git a/sample/soap/authheader/server.rb b/sample/soap/authheader/server.rb index 6b562d02f3..9c6adf280d 100644 --- a/sample/soap/authheader/server.rb +++ b/sample/soap/authheader/server.rb @@ -23,6 +23,7 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer def initialize(*arg) super add_rpc_servant(AuthHeaderService.new, Name) + # header handler must be a per request handler. add_rpc_request_headerhandler(ServerAuthHeaderHandler) end diff --git a/sample/soap/authheader/server2.rb b/sample/soap/authheader/server2.rb index b0065e3140..8a0eaafc8d 100644 --- a/sample/soap/authheader/server2.rb +++ b/sample/soap/authheader/server2.rb @@ -6,10 +6,6 @@ require 'authmgr' class AuthHeaderPortServer < SOAP::RPC::StandaloneServer class AuthHeaderService - def self.create - new - end - def initialize(authmgr) @authmgr = authmgr end @@ -34,14 +30,20 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer Name = 'http://tempuri.org/authHeaderPort' def initialize(*arg) super - add_rpc_servant(AuthHeaderService.new, Name) - ServerAuthHeaderHandler.init + authmgr = Authmgr.new + add_rpc_servant(AuthHeaderService.new(authmgr), Name) + ServerAuthHeaderHandler.init(authmgr) + # header handler must be a per request handler. add_rpc_request_headerhandler(ServerAuthHeaderHandler) end class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth") + def self.init(authmgr) + @authmgr = authmgr + end + def self.create new(@authmgr) end @@ -63,7 +65,7 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer if sessionid = my_header["sessionid"] if userid = @authmgr.auth(sessionid) @authmgr.destroy_session(sessionid) - @session_id = @authmgr.create_session(userid) + @sessionid = @authmgr.create_session(userid) auth = true end end @@ -73,5 +75,9 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer end if $0 == __FILE__ - status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000).start + svr = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000) + trap(:INT) do + svr.shutdown + end + status = svr.start end diff --git a/test/soap/test_soapelement.rb b/test/soap/test_soapelement.rb index 99c1f29b98..6cf91f93d6 100644 --- a/test/soap/test_soapelement.rb +++ b/test/soap/test_soapelement.rb @@ -59,7 +59,7 @@ class TestSOAPElement < Test::Unit::TestCase assert_equal(child, obj.var_foo) child = d("_?a?b_") obj.add(child) - assert_equal(child, obj.var__ab_) + assert_equal(child, obj.__send__('_?a?b_')) end def test_member |