actionwebservice 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/{ChangeLog → CHANGELOG} +20 -0
  2. data/README +45 -1
  3. data/Rakefile +12 -10
  4. data/TODO +8 -9
  5. data/lib/action_web_service.rb +10 -6
  6. data/lib/action_web_service/api.rb +1 -2
  7. data/lib/action_web_service/api/{abstract.rb → base.rb} +14 -71
  8. data/lib/action_web_service/base.rb +0 -3
  9. data/lib/action_web_service/client/base.rb +1 -12
  10. data/lib/action_web_service/client/soap_client.rb +49 -17
  11. data/lib/action_web_service/client/xmlrpc_client.rb +20 -15
  12. data/lib/action_web_service/container.rb +3 -85
  13. data/lib/action_web_service/{api/action_controller.rb → container/action_controller_container.rb} +2 -2
  14. data/lib/action_web_service/container/delegated_container.rb +87 -0
  15. data/lib/action_web_service/container/direct_container.rb +70 -0
  16. data/lib/action_web_service/dispatcher/abstract.rb +100 -102
  17. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +199 -137
  18. data/lib/action_web_service/protocol.rb +1 -1
  19. data/lib/action_web_service/protocol/abstract.rb +14 -112
  20. data/lib/action_web_service/protocol/discovery.rb +37 -0
  21. data/lib/action_web_service/protocol/soap_protocol.rb +32 -458
  22. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +29 -149
  23. data/lib/action_web_service/struct.rb +2 -5
  24. data/lib/action_web_service/test_invoke.rb +130 -0
  25. data/lib/action_web_service/vendor/ws.rb +4 -0
  26. data/lib/action_web_service/vendor/ws/common.rb +8 -0
  27. data/lib/action_web_service/vendor/ws/encoding.rb +3 -0
  28. data/lib/action_web_service/vendor/ws/encoding/abstract.rb +26 -0
  29. data/lib/action_web_service/vendor/ws/encoding/soap_rpc_encoding.rb +90 -0
  30. data/lib/action_web_service/vendor/ws/encoding/xmlrpc_encoding.rb +53 -0
  31. data/lib/action_web_service/vendor/ws/marshaling.rb +3 -0
  32. data/lib/action_web_service/vendor/ws/marshaling/abstract.rb +17 -0
  33. data/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb +277 -0
  34. data/lib/action_web_service/vendor/ws/marshaling/xmlrpc_marshaling.rb +116 -0
  35. data/lib/action_web_service/vendor/ws/types.rb +162 -0
  36. data/test/abstract_client.rb +8 -11
  37. data/test/abstract_dispatcher.rb +370 -0
  38. data/test/abstract_unit.rb +1 -0
  39. data/test/api_test.rb +18 -1
  40. data/test/apis/auto_load_api.rb +3 -0
  41. data/test/apis/broken_auto_load_api.rb +2 -0
  42. data/test/client_soap_test.rb +16 -3
  43. data/test/client_xmlrpc_test.rb +16 -4
  44. data/test/container_test.rb +28 -8
  45. data/test/dispatcher_action_controller_soap_test.rb +106 -0
  46. data/test/dispatcher_action_controller_xmlrpc_test.rb +44 -0
  47. data/test/gencov +1 -1
  48. data/test/invocation_test.rb +39 -3
  49. data/test/run +4 -4
  50. data/test/test_invoke_test.rb +77 -0
  51. data/test/ws/abstract_encoding.rb +68 -0
  52. data/test/ws/abstract_unit.rb +13 -0
  53. data/test/ws/gencov +3 -0
  54. data/test/ws/run +5 -0
  55. data/test/ws/soap_marshaling_test.rb +91 -0
  56. data/test/ws/soap_rpc_encoding_test.rb +47 -0
  57. data/test/ws/types_test.rb +41 -0
  58. data/test/ws/xmlrpc_encoding_test.rb +34 -0
  59. metadata +48 -19
  60. data/lib/action_web_service/protocol/registry.rb +0 -55
  61. data/lib/action_web_service/support/signature.rb +0 -100
  62. data/test/abstract_soap.rb +0 -58
  63. data/test/dispatcher_action_controller_test.rb +0 -186
  64. data/test/protocol_registry_test.rb +0 -53
  65. data/test/protocol_soap_test.rb +0 -252
  66. data/test/protocol_xmlrpc_test.rb +0 -147
@@ -31,6 +31,7 @@ module ActionWebService # :nodoc:
31
31
  @api = api
32
32
  @handler_name = options[:handler_name]
33
33
  @client = XMLRPC::Client.new2(endpoint_uri, options[:proxy], options[:timeout])
34
+ @marshaler = WS::Marshaling::XmlRpcMarshaler.new
34
35
  end
35
36
 
36
37
  protected
@@ -43,18 +44,21 @@ module ActionWebService # :nodoc:
43
44
 
44
45
  def transform_outgoing_method_params(method_name, params)
45
46
  info = @api.api_methods[method_name.to_sym]
46
- signature = info[:expects]
47
- signature_length = signature.nil?? 0 : signature.length
48
- if signature_length != params.length
49
- raise(ProtocolError, "API declares #{public_name(method_name)} to accept " +
50
- "#{signature_length} parameters, but #{params.length} parameters " +
51
- "were supplied")
47
+ expects = info[:expects]
48
+ expects_length = expects.nil?? 0 : expects.length
49
+ if expects_length != params.length
50
+ raise(ClientError, "API declares #{public_name(method_name)} to accept " +
51
+ "#{expects_length} parameters, but #{params.length} parameters " +
52
+ "were supplied")
52
53
  end
53
- if signature_length > 0
54
- signature = Protocol::XmlRpc::XmlRpcProtocol.transform_array_types(signature)
55
- (1..signature.size).each do |i|
56
- i -= 1
57
- params[i] = Protocol::XmlRpc::XmlRpcProtocol.ruby_to_xmlrpc(params[i], lookup_class(signature[i]))
54
+ params = params.dup
55
+ if expects_length > 0
56
+ i = 0
57
+ expects.each do |spec|
58
+ type_binding = @marshaler.register_type(spec)
59
+ info = WS::ParamInfo.create(spec, type_binding, i)
60
+ params[i] = @marshaler.marshal(WS::Param.new(params[i], info))
61
+ i += 1
58
62
  end
59
63
  end
60
64
  params
@@ -62,10 +66,11 @@ module ActionWebService # :nodoc:
62
66
 
63
67
  def transform_return_value(method_name, return_value)
64
68
  info = @api.api_methods[method_name.to_sym]
65
- return true unless signature = info[:returns]
66
- param_klass = lookup_class(signature[0])
67
- signature = Protocol::XmlRpc::XmlRpcProtocol.transform_array_types([param_klass])
68
- Protocol::XmlRpc::XmlRpcProtocol.xmlrpc_to_ruby(return_value, signature[0])
69
+ return true unless returns = info[:returns]
70
+ type_binding = @marshaler.register_type(returns[0])
71
+ info = WS::ParamInfo.create(returns[0], type_binding, 0)
72
+ info.name = 'return'
73
+ @marshaler.transform_inbound(WS::Param.new(return_value, info))
69
74
  end
70
75
 
71
76
  def public_name(method_name)
@@ -1,85 +1,3 @@
1
- module ActionWebService # :nodoc:
2
- module Container # :nodoc:
3
- class ContainerError < ActionWebService::ActionWebServiceError # :nodoc:
4
- end
5
-
6
- def self.append_features(base) # :nodoc:
7
- super
8
- base.extend(ClassMethods)
9
- base.send(:include, ActionWebService::Container::InstanceMethods)
10
- end
11
-
12
- module ClassMethods
13
- # Declares a web service that will provides access to the API of the given
14
- # +object+. +object+ must be an ActionWebService::Base derivative.
15
- #
16
- # Web service object creation can either be _immediate_, where the object
17
- # instance is given at class definition time, or _deferred_, where
18
- # object instantiation is delayed until request time.
19
- #
20
- # ==== Immediate web service object example
21
- #
22
- # class ApiController < ApplicationController
23
- # web_service_dispatching_mode :delegated
24
- #
25
- # web_service :person, PersonService.new
26
- # end
27
- #
28
- # For deferred instantiation, a block should be given instead of an
29
- # object instance. This block will be executed in controller instance
30
- # context, so it can rely on controller instance variables being present.
31
- #
32
- # ==== Deferred web service object example
33
- #
34
- # class ApiController < ApplicationController
35
- # web_service_dispatching_mode :delegated
36
- #
37
- # web_service(:person) { PersonService.new(@request.env) }
38
- # end
39
- def web_service(name, object=nil, &block)
40
- if (object && block_given?) || (object.nil? && block.nil?)
41
- raise(ContainerError, "either service, or a block must be given")
42
- end
43
- name = name.to_sym
44
- if block_given?
45
- info = { name => { :block => block } }
46
- else
47
- info = { name => { :object => object } }
48
- end
49
- write_inheritable_hash("web_services", info)
50
- call_web_service_definition_callbacks(self, name, info)
51
- end
52
-
53
- # Whether this service contains a service with the given +name+
54
- def has_web_service?(name)
55
- web_services.has_key?(name.to_sym)
56
- end
57
-
58
- def web_services # :nodoc:
59
- read_inheritable_attribute("web_services") || {}
60
- end
61
-
62
- def add_web_service_definition_callback(&block) # :nodoc:
63
- write_inheritable_array("web_service_definition_callbacks", [block])
64
- end
65
-
66
- private
67
- def call_web_service_definition_callbacks(container_class, web_service_name, service_info)
68
- (read_inheritable_attribute("web_service_definition_callbacks") || []).each do |block|
69
- block.call(container_class, web_service_name, service_info)
70
- end
71
- end
72
- end
73
-
74
- module InstanceMethods # :nodoc:
75
- def web_service_object(web_service_name)
76
- info = self.class.web_services[web_service_name.to_sym]
77
- unless info
78
- raise(ContainerError, "no such web service '#{web_service_name}'")
79
- end
80
- service = info[:block]
81
- service ? instance_eval(&service) : info[:object]
82
- end
83
- end
84
- end
85
- end
1
+ require 'action_web_service/container/direct_container'
2
+ require 'action_web_service/container/delegated_container'
3
+ require 'action_web_service/container/action_controller_container'
@@ -1,5 +1,5 @@
1
1
  module ActionWebService # :nodoc:
2
- module API # :nodoc:
2
+ module Container # :nodoc:
3
3
  module ActionController # :nodoc:
4
4
  def self.append_features(base) # :nodoc:
5
5
  base.class_eval do
@@ -36,7 +36,7 @@ module ActionWebService # :nodoc:
36
36
  api_klass = options.delete(:api) || require_web_service_api(name)
37
37
  class_eval do
38
38
  define_method(name) do
39
- probe_protocol_client(api_klass, protocol, endpoint_uri, options)
39
+ create_web_service_client(api_klass, protocol, endpoint_uri, options)
40
40
  end
41
41
  protected name
42
42
  end
@@ -0,0 +1,87 @@
1
+ module ActionWebService # :nodoc:
2
+ module Container # :nodoc:
3
+ module Delegated # :nodoc:
4
+ class ContainerError < ActionWebServiceError # :nodoc:
5
+ end
6
+
7
+ def self.append_features(base) # :nodoc:
8
+ super
9
+ base.extend(ClassMethods)
10
+ base.send(:include, ActionWebService::Container::Delegated::InstanceMethods)
11
+ end
12
+
13
+ module ClassMethods
14
+ # Declares a web service that will provides access to the API of the given
15
+ # +object+. +object+ must be an ActionWebService::Base derivative.
16
+ #
17
+ # Web service object creation can either be _immediate_, where the object
18
+ # instance is given at class definition time, or _deferred_, where
19
+ # object instantiation is delayed until request time.
20
+ #
21
+ # ==== Immediate web service object example
22
+ #
23
+ # class ApiController < ApplicationController
24
+ # web_service_dispatching_mode :delegated
25
+ #
26
+ # web_service :person, PersonService.new
27
+ # end
28
+ #
29
+ # For deferred instantiation, a block should be given instead of an
30
+ # object instance. This block will be executed in controller instance
31
+ # context, so it can rely on controller instance variables being present.
32
+ #
33
+ # ==== Deferred web service object example
34
+ #
35
+ # class ApiController < ApplicationController
36
+ # web_service_dispatching_mode :delegated
37
+ #
38
+ # web_service(:person) { PersonService.new(@request.env) }
39
+ # end
40
+ def web_service(name, object=nil, &block)
41
+ if (object && block_given?) || (object.nil? && block.nil?)
42
+ raise(ContainerError, "either service, or a block must be given")
43
+ end
44
+ name = name.to_sym
45
+ if block_given?
46
+ info = { name => { :block => block } }
47
+ else
48
+ info = { name => { :object => object } }
49
+ end
50
+ write_inheritable_hash("web_services", info)
51
+ call_web_service_definition_callbacks(self, name, info)
52
+ end
53
+
54
+ # Whether this service contains a service with the given +name+
55
+ def has_web_service?(name)
56
+ web_services.has_key?(name.to_sym)
57
+ end
58
+
59
+ def web_services # :nodoc:
60
+ read_inheritable_attribute("web_services") || {}
61
+ end
62
+
63
+ def add_web_service_definition_callback(&block) # :nodoc:
64
+ write_inheritable_array("web_service_definition_callbacks", [block])
65
+ end
66
+
67
+ private
68
+ def call_web_service_definition_callbacks(container_class, web_service_name, service_info)
69
+ (read_inheritable_attribute("web_service_definition_callbacks") || []).each do |block|
70
+ block.call(container_class, web_service_name, service_info)
71
+ end
72
+ end
73
+ end
74
+
75
+ module InstanceMethods # :nodoc:
76
+ def web_service_object(web_service_name)
77
+ info = self.class.web_services[web_service_name.to_sym]
78
+ unless info
79
+ raise(ContainerError, "no such web service '#{web_service_name}'")
80
+ end
81
+ service = info[:block]
82
+ service ? instance_eval(&service) : info[:object]
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,70 @@
1
+ module ActionWebService # :nodoc:
2
+ module Container # :nodoc:
3
+ module Direct # :nodoc:
4
+ class ContainerError < ActionWebServiceError # :nodoc:
5
+ end
6
+
7
+ def self.append_features(base) # :nodoc:
8
+ super
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ # Attaches ActionWebService API +definition+ to the calling class.
14
+ #
15
+ # Action Controllers can have a default associated API, removing the need
16
+ # to call this method if you follow the Action Web Service naming conventions.
17
+ #
18
+ # A controller with a class name of GoogleSearchController will
19
+ # implicitly load <tt>app/apis/google_search_api.rb</tt>, and expect the
20
+ # API definition class to be named <tt>GoogleSearchAPI</tt> or
21
+ # <tt>GoogleSearchApi</tt>.
22
+ #
23
+ # ==== Service class example
24
+ #
25
+ # class MyService < ActionWebService::Base
26
+ # web_service_api MyAPI
27
+ # end
28
+ #
29
+ # class MyAPI < ActionWebService::API::Base
30
+ # ...
31
+ # end
32
+ #
33
+ # ==== Controller class example
34
+ #
35
+ # class MyController < ActionController::Base
36
+ # web_service_api MyAPI
37
+ # end
38
+ #
39
+ # class MyAPI < ActionWebService::API::Base
40
+ # ...
41
+ # end
42
+ def web_service_api(definition=nil)
43
+ if definition.nil?
44
+ read_inheritable_attribute("web_service_api")
45
+ else
46
+ if definition.is_a?(Symbol)
47
+ raise(ContainerError, "symbols can only be used for #web_service_api inside of a controller")
48
+ end
49
+ unless definition.respond_to?(:ancestors) && definition.ancestors.include?(ActionWebService::API::Base)
50
+ raise(ContainerError, "#{definition.to_s} is not a valid API definition")
51
+ end
52
+ write_inheritable_attribute("web_service_api", definition)
53
+ call_web_service_api_callbacks(self, definition)
54
+ end
55
+ end
56
+
57
+ def add_web_service_api_callback(&block) # :nodoc:
58
+ write_inheritable_array("web_service_api_callbacks", [block])
59
+ end
60
+
61
+ private
62
+ def call_web_service_api_callbacks(container_class, definition)
63
+ (read_inheritable_attribute("web_service_api_callbacks") || []).each do |block|
64
+ block.call(container_class, definition)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -12,138 +12,136 @@ module ActionWebService # :nodoc:
12
12
  base.send(:include, ActionWebService::Dispatcher::InstanceMethods)
13
13
  end
14
14
 
15
+ def self.layered_service_name(public_method_name) # :nodoc:
16
+ if public_method_name =~ /^([^\.]+)\.(.*)$/
17
+ $1
18
+ else
19
+ nil
20
+ end
21
+ end
22
+
15
23
  module InstanceMethods # :nodoc:
16
24
  private
17
- def dispatch_web_service_request(action_pack_request)
18
- protocol_request = protocol_response = nil
19
- bm = Benchmark.measure do
20
- protocol_request = probe_request_protocol(action_pack_request)
21
- protocol_response = dispatch_protocol_request(protocol_request)
25
+ def invoke_web_service_request(protocol_request)
26
+ invocation = web_service_invocation(protocol_request)
27
+ case web_service_dispatching_mode
28
+ when :direct
29
+ web_service_direct_invoke(invocation)
30
+ when :delegated, :layered
31
+ web_service_delegated_invoke(invocation)
22
32
  end
23
- [protocol_request, protocol_response, bm.real, nil]
24
- rescue Exception => e
25
- protocol_response = prepare_exception_response(protocol_request, e)
26
- [protocol_request, prepare_exception_response(protocol_request, e), nil, e]
27
33
  end
28
34
 
29
- def dispatch_protocol_request(protocol_request)
30
- case web_service_dispatching_mode
31
- when :direct
32
- dispatch_direct_request(protocol_request)
33
- when :delegated
34
- dispatch_delegated_request(protocol_request)
35
+ def web_service_direct_invoke(invocation)
36
+ @method_params = invocation.method_ordered_params
37
+ return_value = self.__send__(invocation.api_method_name)
38
+ if invocation.api.has_api_method?(invocation.api_method_name)
39
+ returns = invocation.returns ? invocation.returns[0] : nil
35
40
  else
36
- raise(ContainerError, "unsupported dispatching mode :#{web_service_dispatching_mode}")
41
+ returns = return_value.class
37
42
  end
43
+ invocation.protocol.marshal_response(invocation.public_method_name, return_value, returns)
38
44
  end
39
45
 
40
- def dispatch_direct_request(protocol_request)
41
- request = prepare_dispatch_request(protocol_request)
42
- return_value = direct_invoke(request)
43
- protocol_request.marshal(return_value)
44
- end
45
-
46
- def dispatch_delegated_request(protocol_request)
47
- request = prepare_dispatch_request(protocol_request)
48
- return_value = delegated_invoke(request)
49
- protocol_request.marshal(return_value)
50
- end
51
-
52
- def direct_invoke(request)
53
- return nil unless before_direct_invoke(request)
54
- return_value = send(request.method_name)
55
- after_direct_invoke(request)
56
- return_value
57
- end
58
-
59
- def before_direct_invoke(request)
60
- @method_params = request.params
61
- end
62
-
63
- def after_direct_invoke(request)
64
- end
65
-
66
- def delegated_invoke(request)
46
+ def web_service_delegated_invoke(invocation)
67
47
  cancellation_reason = nil
68
- web_service = request.web_service
69
- return_value = web_service.perform_invocation(request.method_name, request.params) do |x|
48
+ return_value = invocation.service.perform_invocation(invocation.api_method_name, invocation.method_ordered_params) do |x|
70
49
  cancellation_reason = x
71
50
  end
72
51
  if cancellation_reason
73
52
  raise(DispatcherError, "request canceled: #{cancellation_reason}")
74
53
  end
75
- return_value
54
+ returns = invocation.returns ? invocation.returns[0] : nil
55
+ invocation.protocol.marshal_response(invocation.public_method_name, return_value, returns)
76
56
  end
77
57
 
78
- def prepare_dispatch_request(protocol_request)
79
- api = method_name = web_service_name = web_service = params = nil
80
- public_method_name = protocol_request.public_method_name
58
+ def web_service_invocation(request)
59
+ public_method_name = request.method_name
60
+ invocation = Invocation.new
61
+ invocation.protocol = request.protocol
62
+ invocation.service_name = request.service_name
63
+ if web_service_dispatching_mode == :layered
64
+ if request.method_name =~ /^([^\.]+)\.(.*)$/
65
+ public_method_name = $2
66
+ invocation.service_name = $1
67
+ end
68
+ end
69
+ invocation.public_method_name = public_method_name
81
70
  case web_service_dispatching_mode
82
71
  when :direct
83
- api = self.class.web_service_api
84
- when :delegated
85
- web_service_name = protocol_request.web_service_name
86
- web_service = web_service_object(web_service_name)
87
- api = web_service.class.web_service_api
72
+ invocation.api = self.class.web_service_api
73
+ invocation.service = self
74
+ when :delegated, :layered
75
+ invocation.service = web_service_object(invocation.service_name) rescue nil
76
+ unless invocation.service
77
+ raise(DispatcherError, "service #{invocation.service_name} not available")
78
+ end
79
+ invocation.api = invocation.service.class.web_service_api
88
80
  end
89
- method_name = api.api_method_name(public_method_name)
90
- signature = nil
91
- if method_name
92
- signature = api.api_methods[method_name]
93
- protocol_request.type = Protocol::CheckedMessage
94
- protocol_request.signature = signature[:expects]
95
- protocol_request.return_signature = signature[:returns]
81
+ if invocation.api.has_public_api_method?(public_method_name)
82
+ invocation.api_method_name = invocation.api.api_method_name(public_method_name)
96
83
  else
97
- method_name = api.default_api_method
98
- if method_name
99
- protocol_request.type = Protocol::UncheckedMessage
84
+ if invocation.api.default_api_method.nil?
85
+ raise(DispatcherError, "no such method '#{public_method_name}' on API #{invocation.api}")
100
86
  else
101
- raise(DispatcherError, "no such method #{web_service_name}##{public_method_name}")
87
+ invocation.api_method_name = invocation.api.default_api_method.to_s.to_sym
102
88
  end
103
89
  end
104
- params = protocol_request.unmarshal
105
- DispatchRequest.new(
106
- :api => api,
107
- :public_method_name => public_method_name,
108
- :method_name => method_name,
109
- :signature => signature,
110
- :web_service_name => web_service_name,
111
- :web_service => web_service,
112
- :params => params)
113
- end
114
-
115
- def prepare_exception_response(protocol_request, exception)
116
- if protocol_request && exception
117
- case web_service_dispatching_mode
118
- when :direct
119
- if web_service_exception_reporting
120
- return protocol_request.protocol.marshal_exception(exception)
121
- end
122
- when :delegated
123
- web_service = web_service_object(protocol_request.web_service_name)
124
- if web_service && web_service.class.web_service_exception_reporting
125
- return protocol_request.protocol.marshal_exception(exception)
90
+ unless invocation.service.respond_to?(invocation.api_method_name)
91
+ raise(DispatcherError, "no such method '#{public_method_name}' on API #{invocation.api} (#{invocation.api_method_name})")
92
+ end
93
+ info = invocation.api.api_methods[invocation.api_method_name]
94
+ invocation.expects = info ? info[:expects] : nil
95
+ invocation.returns = info ? info[:returns] : nil
96
+ if invocation.expects
97
+ i = 0
98
+ invocation.method_ordered_params = request.method_params.map do |param|
99
+ if invocation.protocol.is_a?(Protocol::XmlRpc::XmlRpcProtocol)
100
+ marshaler = invocation.protocol.marshaler
101
+ decoded_param = WS::Encoding::XmlRpcDecodedParam.new(param.info.name, param.value)
102
+ marshaled_param = marshaler.typed_unmarshal(decoded_param, invocation.expects[i]) rescue nil
103
+ param = marshaled_param ? marshaled_param : param
126
104
  end
105
+ i += 1
106
+ param.value
107
+ end
108
+ i = 0
109
+ params = []
110
+ invocation.expects.each do |spec|
111
+ type_binding = invocation.protocol.register_signature_type(spec)
112
+ info = WS::ParamInfo.create(spec, type_binding, i)
113
+ params << WS::Param.new(invocation.method_ordered_params[i], info)
114
+ i += 1
115
+ end
116
+ invocation.method_ws_params = params
117
+ invocation.method_named_params = {}
118
+ invocation.method_ws_params.each do |param|
119
+ invocation.method_named_params[param.info.name] = param.value
127
120
  end
128
121
  else
129
- protocol_request.protocol.marshal_exception(RuntimeError.new("missing protocol request or exception"))
122
+ invocation.method_ordered_params = []
123
+ invocation.method_named_params = {}
130
124
  end
131
- rescue Exception
132
- nil
125
+ if invocation.returns
126
+ invocation.returns.each do |spec|
127
+ invocation.protocol.register_signature_type(spec)
128
+ end
129
+ end
130
+ invocation
133
131
  end
134
132
 
135
- class DispatchRequest
136
- attr :api
137
- attr :public_method_name
138
- attr :method_name
139
- attr :signature
140
- attr :web_service_name
141
- attr :web_service
142
- attr :params
143
-
144
- def initialize(values={})
145
- values.each{|k,v| instance_variable_set("@#{k.to_s}", v)}
146
- end
133
+ class Invocation # :nodoc:
134
+ attr_accessor :protocol
135
+ attr_accessor :service_name
136
+ attr_accessor :api
137
+ attr_accessor :public_method_name
138
+ attr_accessor :api_method_name
139
+ attr_accessor :method_ordered_params
140
+ attr_accessor :method_named_params
141
+ attr_accessor :method_ws_params
142
+ attr_accessor :expects
143
+ attr_accessor :returns
144
+ attr_accessor :service
147
145
  end
148
146
  end
149
147
  end