reidiculous-actionwebservice-client 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. data/CHANGELOG +320 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/lib/action_web_service.rb +71 -0
  7. data/lib/action_web_service/api.rb +297 -0
  8. data/lib/action_web_service/base.rb +38 -0
  9. data/lib/action_web_service/casting.rb +149 -0
  10. data/lib/action_web_service/client.rb +3 -0
  11. data/lib/action_web_service/client/base.rb +28 -0
  12. data/lib/action_web_service/client/soap_client.rb +113 -0
  13. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  14. data/lib/action_web_service/container.rb +3 -0
  15. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  16. data/lib/action_web_service/container/delegated_container.rb +86 -0
  17. data/lib/action_web_service/container/direct_container.rb +69 -0
  18. data/lib/action_web_service/dispatcher.rb +2 -0
  19. data/lib/action_web_service/dispatcher/abstract.rb +207 -0
  20. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +379 -0
  21. data/lib/action_web_service/invocation.rb +202 -0
  22. data/lib/action_web_service/protocol.rb +4 -0
  23. data/lib/action_web_service/protocol/abstract.rb +115 -0
  24. data/lib/action_web_service/protocol/discovery.rb +37 -0
  25. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  26. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  27. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +122 -0
  28. data/lib/action_web_service/scaffolding.rb +281 -0
  29. data/lib/action_web_service/soap/attachment.rb +107 -0
  30. data/lib/action_web_service/soap/baseData.rb +942 -0
  31. data/lib/action_web_service/soap/element.rb +258 -0
  32. data/lib/action_web_service/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  33. data/lib/action_web_service/soap/encodingstyle/handler.rb +100 -0
  34. data/lib/action_web_service/soap/encodingstyle/literalHandler.rb +226 -0
  35. data/lib/action_web_service/soap/encodingstyle/soapHandler.rb +582 -0
  36. data/lib/action_web_service/soap/generator.rb +268 -0
  37. data/lib/action_web_service/soap/header/handler.rb +57 -0
  38. data/lib/action_web_service/soap/header/handlerset.rb +70 -0
  39. data/lib/action_web_service/soap/header/simplehandler.rb +44 -0
  40. data/lib/action_web_service/soap/httpconfigloader.rb +119 -0
  41. data/lib/action_web_service/soap/mapping.rb +10 -0
  42. data/lib/action_web_service/soap/mapping/factory.rb +355 -0
  43. data/lib/action_web_service/soap/mapping/mapping.rb +381 -0
  44. data/lib/action_web_service/soap/mapping/registry.rb +541 -0
  45. data/lib/action_web_service/soap/mapping/rubytypeFactory.rb +475 -0
  46. data/lib/action_web_service/soap/mapping/typeMap.rb +50 -0
  47. data/lib/action_web_service/soap/mapping/wsdlencodedregistry.rb +280 -0
  48. data/lib/action_web_service/soap/mapping/wsdlliteralregistry.rb +418 -0
  49. data/lib/action_web_service/soap/marshal.rb +59 -0
  50. data/lib/action_web_service/soap/mimemessage.rb +240 -0
  51. data/lib/action_web_service/soap/netHttpClient.rb +190 -0
  52. data/lib/action_web_service/soap/parser.rb +251 -0
  53. data/lib/action_web_service/soap/processor.rb +66 -0
  54. data/lib/action_web_service/soap/property.rb +333 -0
  55. data/lib/action_web_service/soap/rpc/cgistub.rb +206 -0
  56. data/lib/action_web_service/soap/rpc/driver.rb +254 -0
  57. data/lib/action_web_service/soap/rpc/element.rb +325 -0
  58. data/lib/action_web_service/soap/rpc/httpserver.rb +129 -0
  59. data/lib/action_web_service/soap/rpc/proxy.rb +497 -0
  60. data/lib/action_web_service/soap/rpc/router.rb +594 -0
  61. data/lib/action_web_service/soap/rpc/rpc.rb +25 -0
  62. data/lib/action_web_service/soap/rpc/soaplet.rb +162 -0
  63. data/lib/action_web_service/soap/rpc/standaloneServer.rb +43 -0
  64. data/lib/action_web_service/soap/soap.rb +140 -0
  65. data/lib/action_web_service/soap/streamHandler.rb +229 -0
  66. data/lib/action_web_service/soap/wsdlDriver.rb +575 -0
  67. data/lib/action_web_service/struct.rb +64 -0
  68. data/lib/action_web_service/support/class_inheritable_options.rb +28 -0
  69. data/lib/action_web_service/support/signature_types.rb +227 -0
  70. data/lib/action_web_service/test_invoke.rb +110 -0
  71. data/lib/action_web_service/version.rb +9 -0
  72. data/lib/action_web_service/wsdl/binding.rb +65 -0
  73. data/lib/action_web_service/wsdl/data.rb +64 -0
  74. data/lib/action_web_service/wsdl/definitions.rb +250 -0
  75. data/lib/action_web_service/wsdl/documentation.rb +32 -0
  76. data/lib/action_web_service/wsdl/import.rb +80 -0
  77. data/lib/action_web_service/wsdl/importer.rb +38 -0
  78. data/lib/action_web_service/wsdl/info.rb +39 -0
  79. data/lib/action_web_service/wsdl/message.rb +54 -0
  80. data/lib/action_web_service/wsdl/operation.rb +130 -0
  81. data/lib/action_web_service/wsdl/operationBinding.rb +108 -0
  82. data/lib/action_web_service/wsdl/param.rb +85 -0
  83. data/lib/action_web_service/wsdl/parser.rb +163 -0
  84. data/lib/action_web_service/wsdl/part.rb +52 -0
  85. data/lib/action_web_service/wsdl/port.rb +84 -0
  86. data/lib/action_web_service/wsdl/portType.rb +73 -0
  87. data/lib/action_web_service/wsdl/service.rb +61 -0
  88. data/lib/action_web_service/wsdl/soap/address.rb +40 -0
  89. data/lib/action_web_service/wsdl/soap/binding.rb +49 -0
  90. data/lib/action_web_service/wsdl/soap/body.rb +56 -0
  91. data/lib/action_web_service/wsdl/soap/cgiStubCreator.rb +76 -0
  92. data/lib/action_web_service/wsdl/soap/classDefCreator.rb +314 -0
  93. data/lib/action_web_service/wsdl/soap/classDefCreatorSupport.rb +126 -0
  94. data/lib/action_web_service/wsdl/soap/clientSkeltonCreator.rb +78 -0
  95. data/lib/action_web_service/wsdl/soap/complexType.rb +161 -0
  96. data/lib/action_web_service/wsdl/soap/data.rb +42 -0
  97. data/lib/action_web_service/wsdl/soap/definitions.rb +149 -0
  98. data/lib/action_web_service/wsdl/soap/driverCreator.rb +95 -0
  99. data/lib/action_web_service/wsdl/soap/element.rb +28 -0
  100. data/lib/action_web_service/wsdl/soap/fault.rb +56 -0
  101. data/lib/action_web_service/wsdl/soap/header.rb +86 -0
  102. data/lib/action_web_service/wsdl/soap/headerfault.rb +56 -0
  103. data/lib/action_web_service/wsdl/soap/mappingRegistryCreator.rb +92 -0
  104. data/lib/action_web_service/wsdl/soap/methodDefCreator.rb +228 -0
  105. data/lib/action_web_service/wsdl/soap/operation.rb +122 -0
  106. data/lib/action_web_service/wsdl/soap/servantSkeltonCreator.rb +67 -0
  107. data/lib/action_web_service/wsdl/soap/standaloneServerStubCreator.rb +85 -0
  108. data/lib/action_web_service/wsdl/soap/wsdl2ruby.rb +176 -0
  109. data/lib/action_web_service/wsdl/types.rb +43 -0
  110. data/lib/action_web_service/wsdl/wsdl.rb +23 -0
  111. data/lib/action_web_service/wsdl/xmlSchema/all.rb +69 -0
  112. data/lib/action_web_service/wsdl/xmlSchema/annotation.rb +34 -0
  113. data/lib/action_web_service/wsdl/xmlSchema/any.rb +56 -0
  114. data/lib/action_web_service/wsdl/xmlSchema/attribute.rb +127 -0
  115. data/lib/action_web_service/wsdl/xmlSchema/choice.rb +69 -0
  116. data/lib/action_web_service/wsdl/xmlSchema/complexContent.rb +92 -0
  117. data/lib/action_web_service/wsdl/xmlSchema/complexType.rb +139 -0
  118. data/lib/action_web_service/wsdl/xmlSchema/content.rb +96 -0
  119. data/lib/action_web_service/wsdl/xmlSchema/data.rb +80 -0
  120. data/lib/action_web_service/wsdl/xmlSchema/element.rb +154 -0
  121. data/lib/action_web_service/wsdl/xmlSchema/enumeration.rb +36 -0
  122. data/lib/action_web_service/wsdl/xmlSchema/import.rb +65 -0
  123. data/lib/action_web_service/wsdl/xmlSchema/importer.rb +87 -0
  124. data/lib/action_web_service/wsdl/xmlSchema/include.rb +54 -0
  125. data/lib/action_web_service/wsdl/xmlSchema/length.rb +35 -0
  126. data/lib/action_web_service/wsdl/xmlSchema/parser.rb +166 -0
  127. data/lib/action_web_service/wsdl/xmlSchema/pattern.rb +36 -0
  128. data/lib/action_web_service/wsdl/xmlSchema/schema.rb +143 -0
  129. data/lib/action_web_service/wsdl/xmlSchema/sequence.rb +69 -0
  130. data/lib/action_web_service/wsdl/xmlSchema/simpleContent.rb +65 -0
  131. data/lib/action_web_service/wsdl/xmlSchema/simpleExtension.rb +54 -0
  132. data/lib/action_web_service/wsdl/xmlSchema/simpleRestriction.rb +73 -0
  133. data/lib/action_web_service/wsdl/xmlSchema/simpleType.rb +73 -0
  134. data/lib/action_web_service/wsdl/xmlSchema/unique.rb +34 -0
  135. data/lib/action_web_service/wsdl/xmlSchema/xsd2ruby.rb +107 -0
  136. data/lib/action_web_service/xsd/charset.rb +187 -0
  137. data/lib/action_web_service/xsd/codegen.rb +12 -0
  138. data/lib/action_web_service/xsd/codegen/classdef.rb +203 -0
  139. data/lib/action_web_service/xsd/codegen/commentdef.rb +34 -0
  140. data/lib/action_web_service/xsd/codegen/gensupport.rb +166 -0
  141. data/lib/action_web_service/xsd/codegen/methoddef.rb +63 -0
  142. data/lib/action_web_service/xsd/codegen/moduledef.rb +191 -0
  143. data/lib/action_web_service/xsd/datatypes.rb +1269 -0
  144. data/lib/action_web_service/xsd/datatypes1999.rb +20 -0
  145. data/lib/action_web_service/xsd/iconvcharset.rb +33 -0
  146. data/lib/action_web_service/xsd/mapping.rb +42 -0
  147. data/lib/action_web_service/xsd/namedelements.rb +95 -0
  148. data/lib/action_web_service/xsd/ns.rb +140 -0
  149. data/lib/action_web_service/xsd/qname.rb +78 -0
  150. data/lib/action_web_service/xsd/xmlparser.rb +61 -0
  151. data/lib/action_web_service/xsd/xmlparser/parser.rb +96 -0
  152. data/lib/action_web_service/xsd/xmlparser/rexmlparser.rb +54 -0
  153. data/lib/action_web_service/xsd/xmlparser/xmlparser.rb +50 -0
  154. data/lib/action_web_service/xsd/xmlparser/xmlscanner.rb +147 -0
  155. data/lib/actionwebservice.rb +1 -0
  156. data/setup.rb +1379 -0
  157. data/test/abstract_client.rb +183 -0
  158. data/test/abstract_dispatcher.rb +548 -0
  159. data/test/abstract_unit.rb +45 -0
  160. data/test/api_test.rb +103 -0
  161. data/test/apis/auto_load_api.rb +3 -0
  162. data/test/apis/broken_auto_load_api.rb +2 -0
  163. data/test/base_test.rb +42 -0
  164. data/test/casting_test.rb +95 -0
  165. data/test/client_soap_test.rb +156 -0
  166. data/test/client_xmlrpc_test.rb +153 -0
  167. data/test/container_test.rb +73 -0
  168. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  169. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  170. data/test/fixtures/db_definitions/mysql.sql +8 -0
  171. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  172. data/test/fixtures/users.yml +12 -0
  173. data/test/gencov +3 -0
  174. data/test/invocation_test.rb +185 -0
  175. data/test/run +6 -0
  176. data/test/scaffolded_controller_test.rb +146 -0
  177. data/test/struct_test.rb +52 -0
  178. data/test/test_invoke_test.rb +112 -0
  179. metadata +265 -0
@@ -0,0 +1,64 @@
1
+ module ActionWebService
2
+ # To send structured types across the wire, derive from ActionWebService::Struct,
3
+ # and use +member+ to declare structure members.
4
+ #
5
+ # ActionWebService::Struct should be used in method signatures when you want to accept or return
6
+ # structured types that have no Active Record model class representations, or you don't
7
+ # want to expose your entire Active Record model to remote callers.
8
+ #
9
+ # === Example
10
+ #
11
+ # class Person < ActionWebService::Struct
12
+ # member :id, :int
13
+ # member :firstnames, [:string]
14
+ # member :lastname, :string
15
+ # member :email, :string
16
+ # end
17
+ # person = Person.new(:id => 5, :firstname => 'john', :lastname => 'doe')
18
+ #
19
+ # Active Record model classes are already implicitly supported in method
20
+ # signatures.
21
+ class Struct
22
+ # If a Hash is given as argument to an ActionWebService::Struct constructor,
23
+ # it can contain initial values for the structure member.
24
+ def initialize(values={})
25
+ if values.is_a?(Hash)
26
+ values.map{|k,v| __send__('%s=' % k.to_s, v)}
27
+ end
28
+ end
29
+
30
+ # The member with the given name
31
+ def [](name)
32
+ send(name.to_s)
33
+ end
34
+
35
+ # Iterates through each member
36
+ def each_pair(&block)
37
+ self.class.members.each do |name, type|
38
+ yield name, self.__send__(name)
39
+ end
40
+ end
41
+
42
+ class << self
43
+ # Creates a structure member with the specified +name+ and +type+. Generates
44
+ # accessor methods for reading and writing the member value.
45
+ def member(name, type)
46
+ name = name.to_sym
47
+ type = ActionWebService::SignatureTypes.canonical_signature_entry({ name => type }, 0)
48
+ write_inheritable_hash("struct_members", name => type)
49
+ class_eval <<-END
50
+ def #{name}; @#{name}; end
51
+ def #{name}=(value); @#{name} = value; end
52
+ END
53
+ end
54
+
55
+ def members # :nodoc:
56
+ read_inheritable_attribute("struct_members") || {}
57
+ end
58
+
59
+ def member_type(name) # :nodoc:
60
+ members[name.to_sym]
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/core_ext/class/inheritable_attributes'
2
+
3
+ class Class # :nodoc:
4
+ def class_inheritable_option(sym, default_value=nil)
5
+ write_inheritable_attribute sym, default_value
6
+ class_eval <<-EOS
7
+ def self.#{sym}(value=nil)
8
+ if !value.nil?
9
+ write_inheritable_attribute(:#{sym}, value)
10
+ else
11
+ read_inheritable_attribute(:#{sym})
12
+ end
13
+ end
14
+
15
+ def self.#{sym}=(value)
16
+ write_inheritable_attribute(:#{sym}, value)
17
+ end
18
+
19
+ def #{sym}
20
+ self.class.#{sym}
21
+ end
22
+
23
+ def #{sym}=(value)
24
+ self.class.#{sym} = value
25
+ end
26
+ EOS
27
+ end
28
+ end
@@ -0,0 +1,227 @@
1
+ module ActionWebService # :nodoc:
2
+ # Action Web Service supports the following base types in a signature:
3
+ #
4
+ # [<tt>:int</tt>] Represents an integer value, will be cast to an integer using <tt>Integer(value)</tt>
5
+ # [<tt>:string</tt>] Represents a string value, will be cast to an string using the <tt>to_s</tt> method on an object
6
+ # [<tt>:base64</tt>] Represents a Base 64 value, will contain the binary bytes of a Base 64 value sent by the caller
7
+ # [<tt>:bool</tt>] Represents a boolean value, whatever is passed will be cast to boolean (<tt>true</tt>, '1', 'true', 'y', 'yes' are taken to represent true; <tt>false</tt>, '0', 'false', 'n', 'no' and <tt>nil</tt> represent false)
8
+ # [<tt>:float</tt>] Represents a floating point value, will be cast to a float using <tt>Float(value)</tt>
9
+ # [<tt>:time</tt>] Represents a timestamp, will be cast to a <tt>Time</tt> object
10
+ # [<tt>:datetime</tt>] Represents a timestamp, will be cast to a <tt>DateTime</tt> object
11
+ # [<tt>:date</tt>] Represents a date, will be cast to a <tt>Date</tt> object
12
+ #
13
+ # For structured types, you'll need to pass in the Class objects of
14
+ # ActionWebService::Struct and ActiveRecord::Base derivatives.
15
+ module SignatureTypes
16
+ def canonical_signature(signature) # :nodoc:
17
+ return nil if signature.nil?
18
+ unless signature.is_a?(Array)
19
+ raise(ActionWebServiceError, "Expected signature to be an Array")
20
+ end
21
+ i = -1
22
+ signature.map{ |spec| canonical_signature_entry(spec, i += 1) }
23
+ end
24
+
25
+ def canonical_signature_entry(spec, i) # :nodoc:
26
+ orig_spec = spec
27
+ name = "param#{i}"
28
+ if spec.is_a?(Hash)
29
+ name, spec = spec.keys.first, spec.values.first
30
+ end
31
+ type = spec
32
+ if spec.is_a?(Array)
33
+ ArrayType.new(orig_spec, canonical_signature_entry(spec[0], 0), name)
34
+ else
35
+ type = canonical_type(type)
36
+ if type.is_a?(Symbol)
37
+ BaseType.new(orig_spec, type, name)
38
+ else
39
+ StructuredType.new(orig_spec, type, name)
40
+ end
41
+ end
42
+ end
43
+
44
+ def canonical_type(type) # :nodoc:
45
+ type_name = symbol_name(type) || class_to_type_name(type)
46
+ type = type_name || type
47
+ return canonical_type_name(type) if type.is_a?(Symbol)
48
+ type
49
+ end
50
+
51
+ def canonical_type_name(name) # :nodoc:
52
+ name = name.to_sym
53
+ case name
54
+ when :int, :integer, :fixnum, :bignum
55
+ :int
56
+ when :string, :text
57
+ :string
58
+ when :base64, :binary
59
+ :base64
60
+ when :bool, :boolean
61
+ :bool
62
+ when :float, :double
63
+ :float
64
+ when :decimal
65
+ :decimal
66
+ when :time, :timestamp
67
+ :time
68
+ when :datetime
69
+ :datetime
70
+ when :date
71
+ :date
72
+ else
73
+ raise(TypeError, "#{name} is not a valid base type")
74
+ end
75
+ end
76
+
77
+ def canonical_type_class(type) # :nodoc:
78
+ type = canonical_type(type)
79
+ type.is_a?(Symbol) ? type_name_to_class(type) : type
80
+ end
81
+
82
+ def symbol_name(name) # :nodoc:
83
+ return name.to_sym if name.is_a?(Symbol) || name.is_a?(String)
84
+ nil
85
+ end
86
+
87
+ def class_to_type_name(klass) # :nodoc:
88
+ klass = klass.class unless klass.is_a?(Class)
89
+ if derived_from?(Integer, klass) || derived_from?(Fixnum, klass) || derived_from?(Bignum, klass)
90
+ :int
91
+ elsif klass == String
92
+ :string
93
+ elsif klass == Base64
94
+ :base64
95
+ elsif klass == TrueClass || klass == FalseClass
96
+ :bool
97
+ # elsif derived_from?(Float, klass) || derived_from?(Precision, klass) || derived_from?(Numeric, klass)
98
+ elsif derived_from?(Float, klass) || derived_from?(Numeric, klass)
99
+ :float
100
+ elsif klass == Time
101
+ :time
102
+ elsif klass == DateTime
103
+ :datetime
104
+ elsif klass == Date
105
+ :date
106
+ else
107
+ nil
108
+ end
109
+ end
110
+
111
+ def type_name_to_class(name) # :nodoc:
112
+ case canonical_type_name(name)
113
+ when :int
114
+ Integer
115
+ when :string
116
+ String
117
+ when :base64
118
+ Base64
119
+ when :bool
120
+ TrueClass
121
+ when :float
122
+ Float
123
+ when :decimal
124
+ BigDecimal
125
+ when :time
126
+ Time
127
+ when :date
128
+ Date
129
+ when :datetime
130
+ DateTime
131
+ else
132
+ nil
133
+ end
134
+ end
135
+
136
+ def derived_from?(ancestor, child) # :nodoc:
137
+ child.ancestors.include?(ancestor)
138
+ end
139
+
140
+ module_function :type_name_to_class
141
+ module_function :class_to_type_name
142
+ module_function :symbol_name
143
+ module_function :canonical_type_class
144
+ module_function :canonical_type_name
145
+ module_function :canonical_type
146
+ module_function :canonical_signature_entry
147
+ module_function :canonical_signature
148
+ module_function :derived_from?
149
+ end
150
+
151
+ class BaseType # :nodoc:
152
+ include SignatureTypes
153
+
154
+ attr :spec
155
+ attr :type
156
+ attr :type_class
157
+ attr :name
158
+
159
+ def initialize(spec, type, name)
160
+ @spec = spec
161
+ @type = canonical_type(type)
162
+ @type_class = canonical_type_class(@type)
163
+ @name = name
164
+ end
165
+
166
+ def custom?
167
+ false
168
+ end
169
+
170
+ def array?
171
+ false
172
+ end
173
+
174
+ def structured?
175
+ false
176
+ end
177
+
178
+ def human_name(show_name=true)
179
+ type_type = array? ? element_type.type.to_s : self.type.to_s
180
+ str = array? ? (type_type + '[]') : type_type
181
+ show_name ? (str + " " + name.to_s) : str
182
+ end
183
+ end
184
+
185
+ class ArrayType < BaseType # :nodoc:
186
+ attr :element_type
187
+
188
+ def initialize(spec, element_type, name)
189
+ super(spec, Array, name)
190
+ @element_type = element_type
191
+ end
192
+
193
+ def custom?
194
+ true
195
+ end
196
+
197
+ def array?
198
+ true
199
+ end
200
+ end
201
+
202
+ class StructuredType < BaseType # :nodoc:
203
+ def each_member
204
+ if @type_class.respond_to?(:members)
205
+ @type_class.members.each do |name, type|
206
+ yield name, type
207
+ end
208
+ elsif @type_class.respond_to?(:columns)
209
+ i = -1
210
+ @type_class.columns.each do |column|
211
+ yield column.name, canonical_signature_entry(column.type, i += 1)
212
+ end
213
+ end
214
+ end
215
+
216
+ def custom?
217
+ true
218
+ end
219
+
220
+ def structured?
221
+ true
222
+ end
223
+ end
224
+
225
+ class Base64 < String # :nodoc:
226
+ end
227
+ end
@@ -0,0 +1,110 @@
1
+ require 'test/unit'
2
+
3
+ module Test # :nodoc:
4
+ module Unit # :nodoc:
5
+ class TestCase # :nodoc:
6
+ private
7
+ # invoke the specified API method
8
+ def invoke_direct(method_name, *args)
9
+ prepare_request('api', 'api', method_name, *args)
10
+ @controller.process(@request, @response)
11
+ decode_rpc_response
12
+ end
13
+ alias_method :invoke, :invoke_direct
14
+
15
+ # invoke the specified API method on the specified service
16
+ def invoke_delegated(service_name, method_name, *args)
17
+ prepare_request(service_name.to_s, service_name, method_name, *args)
18
+ @controller.process(@request, @response)
19
+ decode_rpc_response
20
+ end
21
+
22
+ # invoke the specified layered API method on the correct service
23
+ def invoke_layered(service_name, method_name, *args)
24
+ prepare_request('api', service_name, method_name, *args)
25
+ @controller.process(@request, @response)
26
+ decode_rpc_response
27
+ end
28
+
29
+ # ---------------------- internal ---------------------------
30
+
31
+ def prepare_request(action, service_name, api_method_name, *args)
32
+ @request.recycle!
33
+ @request.request_parameters['action'] = action
34
+ @request.env['REQUEST_METHOD'] = 'POST'
35
+ @request.env['HTTP_CONTENT_TYPE'] = 'text/xml'
36
+ @request.env['RAW_POST_DATA'] = encode_rpc_call(service_name, api_method_name, *args)
37
+ case protocol
38
+ when ActionWebService::Protocol::Soap::SoapProtocol
39
+ soap_action = "/#{@controller.controller_name}/#{service_name}/#{public_method_name(service_name, api_method_name)}"
40
+ @request.env['HTTP_SOAPACTION'] = soap_action
41
+ when ActionWebService::Protocol::XmlRpc::XmlRpcProtocol
42
+ @request.env.delete('HTTP_SOAPACTION')
43
+ end
44
+ end
45
+
46
+ def encode_rpc_call(service_name, api_method_name, *args)
47
+ case @controller.web_service_dispatching_mode
48
+ when :direct
49
+ api = @controller.class.web_service_api
50
+ when :delegated, :layered
51
+ api = @controller.web_service_object(service_name.to_sym).class.web_service_api
52
+ end
53
+ protocol.register_api(api)
54
+ method = api.api_methods[api_method_name.to_sym]
55
+ raise ArgumentError, "wrong number of arguments for rpc call (#{args.length} for #{method.expects.length})" if method && method.expects && args.length != method.expects.length
56
+ protocol.encode_request(public_method_name(service_name, api_method_name), args.dup, method.expects)
57
+ end
58
+
59
+ def decode_rpc_response
60
+ public_method_name, return_value = protocol.decode_response(@response.body)
61
+ exception = is_exception?(return_value)
62
+ raise exception if exception
63
+ return_value
64
+ end
65
+
66
+ def public_method_name(service_name, api_method_name)
67
+ public_name = service_api(service_name).public_api_method_name(api_method_name)
68
+ if @controller.web_service_dispatching_mode == :layered && protocol.is_a?(ActionWebService::Protocol::XmlRpc::XmlRpcProtocol)
69
+ '%s.%s' % [service_name.to_s, public_name]
70
+ else
71
+ public_name
72
+ end
73
+ end
74
+
75
+ def service_api(service_name)
76
+ case @controller.web_service_dispatching_mode
77
+ when :direct
78
+ @controller.class.web_service_api
79
+ when :delegated, :layered
80
+ @controller.web_service_object(service_name.to_sym).class.web_service_api
81
+ end
82
+ end
83
+
84
+ def protocol
85
+ if @protocol.nil?
86
+ @protocol ||= ActionWebService::Protocol::Soap::SoapProtocol.create(@controller)
87
+ else
88
+ case @protocol
89
+ when :xmlrpc
90
+ @protocol = ActionWebService::Protocol::XmlRpc::XmlRpcProtocol.create(@controller)
91
+ when :soap
92
+ @protocol = ActionWebService::Protocol::Soap::SoapProtocol.create(@controller)
93
+ else
94
+ @protocol
95
+ end
96
+ end
97
+ end
98
+
99
+ def is_exception?(obj)
100
+ case protocol
101
+ when :soap, ActionWebService::Protocol::Soap::SoapProtocol
102
+ (obj.respond_to?(:detail) && obj.detail.respond_to?(:cause) && \
103
+ obj.detail.cause.is_a?(Exception)) ? obj.detail.cause : nil
104
+ when :xmlrpc, ActionWebService::Protocol::XmlRpc::XmlRpcProtocol
105
+ obj.is_a?(XMLRPC::FaultException) ? obj : nil
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,9 @@
1
+ module ActionWebService
2
+ module VERSION #:nodoc:
3
+ MAJOR = 2
4
+ MINOR = 3
5
+ TINY = 5
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,65 @@
1
+ # WSDL4R - WSDL binding definition.
2
+ # Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'action_web_service/wsdl/info'
10
+ require 'action_web_service/xsd/namedelements'
11
+
12
+
13
+ module WSDL
14
+
15
+
16
+ class Binding < Info
17
+ attr_reader :name # required
18
+ attr_reader :type # required
19
+ attr_reader :operations
20
+ attr_reader :soapbinding
21
+
22
+ def initialize
23
+ super
24
+ @name = nil
25
+ @type = nil
26
+ @operations = XSD::NamedElements.new
27
+ @soapbinding = nil
28
+ end
29
+
30
+ def targetnamespace
31
+ parent.targetnamespace
32
+ end
33
+
34
+ def parse_element(element)
35
+ case element
36
+ when OperationName
37
+ o = OperationBinding.new
38
+ @operations << o
39
+ o
40
+ when SOAPBindingName
41
+ o = WSDL::SOAP::Binding.new
42
+ @soapbinding = o
43
+ o
44
+ when DocumentationName
45
+ o = Documentation.new
46
+ o
47
+ else
48
+ nil
49
+ end
50
+ end
51
+
52
+ def parse_attr(attr, value)
53
+ case attr
54
+ when NameAttrName
55
+ @name = XSD::QName.new(targetnamespace, value.source)
56
+ when TypeAttrName
57
+ @type = value
58
+ else
59
+ nil
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ end