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,497 @@
1
+ # SOAP4R - RPC Proxy library.
2
+ # Copyright (C) 2000, 2003-2005 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/soap/soap'
10
+ require 'action_web_service/soap/processor'
11
+ require 'action_web_service/soap/mapping'
12
+ require 'action_web_service/soap/rpc/rpc'
13
+ require 'action_web_service/soap/rpc/element'
14
+ require 'action_web_service/soap/streamHandler'
15
+ require 'action_web_service/soap/mimemessage'
16
+
17
+
18
+ module SOAP
19
+ module RPC
20
+
21
+
22
+ class Proxy
23
+ include SOAP
24
+
25
+ public
26
+
27
+ attr_accessor :soapaction
28
+ attr_accessor :mandatorycharset
29
+ attr_accessor :allow_unqualified_element
30
+ attr_accessor :default_encodingstyle
31
+ attr_accessor :generate_explicit_type
32
+ attr_reader :headerhandler
33
+ attr_reader :streamhandler
34
+
35
+ attr_accessor :mapping_registry
36
+ attr_accessor :literal_mapping_registry
37
+
38
+ attr_reader :operation
39
+
40
+ def initialize(endpoint_url, soapaction, options)
41
+ @endpoint_url = endpoint_url
42
+ @soapaction = soapaction
43
+ @options = options
44
+ @streamhandler = HTTPStreamHandler.new(
45
+ @options["protocol.http"] ||= ::SOAP::Property.new)
46
+ @operation = {}
47
+ @mandatorycharset = nil
48
+ @allow_unqualified_element = true
49
+ @default_encodingstyle = nil
50
+ @generate_explicit_type = true
51
+ @headerhandler = Header::HandlerSet.new
52
+ @mapping_registry = nil
53
+ @literal_mapping_registry = ::SOAP::Mapping::WSDLLiteralRegistry.new
54
+ end
55
+
56
+ def inspect
57
+ "#<#{self.class}:#{@endpoint_url}>"
58
+ end
59
+
60
+ def endpoint_url
61
+ @endpoint_url
62
+ end
63
+
64
+ def endpoint_url=(endpoint_url)
65
+ @endpoint_url = endpoint_url
66
+ reset_stream
67
+ end
68
+
69
+ def reset_stream
70
+ @streamhandler.reset(@endpoint_url)
71
+ end
72
+
73
+ def set_wiredump_file_base(wiredump_file_base)
74
+ @streamhandler.wiredump_file_base = wiredump_file_base
75
+ end
76
+
77
+ def test_loopback_response
78
+ @streamhandler.test_loopback_response
79
+ end
80
+
81
+ def add_rpc_operation(qname, soapaction, name, param_def, opt = {})
82
+ opt[:request_qname] = qname
83
+ opt[:request_style] ||= :rpc
84
+ opt[:response_style] ||= :rpc
85
+ opt[:request_use] ||= :encoded
86
+ opt[:response_use] ||= :encoded
87
+ @operation[name] = Operation.new(soapaction, param_def, opt)
88
+ end
89
+
90
+ def add_document_operation(soapaction, name, param_def, opt = {})
91
+ opt[:request_style] ||= :document
92
+ opt[:response_style] ||= :document
93
+ opt[:request_use] ||= :literal
94
+ opt[:response_use] ||= :literal
95
+ # default values of these values are unqualified in XML Schema.
96
+ # set true for backward compatibility.
97
+ unless opt.key?(:elementformdefault)
98
+ opt[:elementformdefault] = true
99
+ end
100
+ unless opt.key?(:attributeformdefault)
101
+ opt[:attributeformdefault] = true
102
+ end
103
+ @operation[name] = Operation.new(soapaction, param_def, opt)
104
+ end
105
+
106
+ # add_method is for shortcut of typical rpc/encoded method definition.
107
+ alias add_method add_rpc_operation
108
+ alias add_rpc_method add_rpc_operation
109
+ alias add_document_method add_document_operation
110
+
111
+ def invoke(req_header, req_body, opt = nil)
112
+ opt ||= create_encoding_opt
113
+ route(req_header, req_body, opt, opt)
114
+ end
115
+
116
+ def call(name, *params)
117
+ unless op_info = @operation[name]
118
+ raise MethodDefinitionError, "method: #{name} not defined"
119
+ end
120
+ mapping_opt = create_mapping_opt
121
+ req_header = create_request_header
122
+ req_body = SOAPBody.new(
123
+ op_info.request_body(params, @mapping_registry,
124
+ @literal_mapping_registry, mapping_opt)
125
+ )
126
+ reqopt = create_encoding_opt(
127
+ :soapaction => op_info.soapaction || @soapaction,
128
+ :envelopenamespace => @options["soap.envelope.requestnamespace"],
129
+ :default_encodingstyle =>
130
+ @default_encodingstyle || op_info.request_default_encodingstyle,
131
+ :elementformdefault => op_info.elementformdefault,
132
+ :attributeformdefault => op_info.attributeformdefault
133
+ )
134
+ resopt = create_encoding_opt(
135
+ :envelopenamespace => @options["soap.envelope.responsenamespace"],
136
+ :default_encodingstyle =>
137
+ @default_encodingstyle || op_info.response_default_encodingstyle,
138
+ :elementformdefault => op_info.elementformdefault,
139
+ :attributeformdefault => op_info.attributeformdefault
140
+ )
141
+ env = route(req_header, req_body, reqopt, resopt)
142
+ raise EmptyResponseError unless env
143
+ receive_headers(env.header)
144
+ begin
145
+ check_fault(env.body)
146
+ rescue ::SOAP::FaultError => e
147
+ op_info.raise_fault(e, @mapping_registry, @literal_mapping_registry)
148
+ end
149
+ op_info.response_obj(env.body, @mapping_registry,
150
+ @literal_mapping_registry, mapping_opt)
151
+ end
152
+
153
+ def route(req_header, req_body, reqopt, resopt)
154
+ req_env = ::SOAP::SOAPEnvelope.new(req_header, req_body)
155
+ unless reqopt[:envelopenamespace].nil?
156
+ set_envelopenamespace(req_env, reqopt[:envelopenamespace])
157
+ end
158
+ reqopt[:external_content] = nil
159
+ conn_data = marshal(req_env, reqopt)
160
+ if ext = reqopt[:external_content]
161
+ mime = MIMEMessage.new
162
+ ext.each do |k, v|
163
+ mime.add_attachment(v.data)
164
+ end
165
+ mime.add_part(conn_data.send_string + "\r\n")
166
+ mime.close
167
+ conn_data.send_string = mime.content_str
168
+ conn_data.send_contenttype = mime.headers['content-type'].str
169
+ end
170
+ conn_data = @streamhandler.send(@endpoint_url, conn_data,
171
+ reqopt[:soapaction])
172
+ if conn_data.receive_string.empty?
173
+ return nil
174
+ end
175
+ unmarshal(conn_data, resopt)
176
+ end
177
+
178
+ def check_fault(body)
179
+ if body.fault
180
+ raise SOAP::FaultError.new(body.fault)
181
+ end
182
+ end
183
+
184
+ private
185
+
186
+ def set_envelopenamespace(env, namespace)
187
+ env.elename = XSD::QName.new(namespace, env.elename.name)
188
+ if env.header
189
+ env.header.elename = XSD::QName.new(namespace, env.header.elename.name)
190
+ end
191
+ if env.body
192
+ env.body.elename = XSD::QName.new(namespace, env.body.elename.name)
193
+ end
194
+ end
195
+
196
+ def create_request_header
197
+ headers = @headerhandler.on_outbound
198
+ if headers.empty?
199
+ nil
200
+ else
201
+ h = ::SOAP::SOAPHeader.new
202
+ headers.each do |header|
203
+ h.add(header.elename.name, header)
204
+ end
205
+ h
206
+ end
207
+ end
208
+
209
+ def receive_headers(headers)
210
+ @headerhandler.on_inbound(headers) if headers
211
+ end
212
+
213
+ def marshal(env, opt)
214
+ send_string = Processor.marshal(env, opt)
215
+ StreamHandler::ConnectionData.new(send_string)
216
+ end
217
+
218
+ def unmarshal(conn_data, opt)
219
+ contenttype = conn_data.receive_contenttype
220
+ if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
221
+ opt[:external_content] = {}
222
+ mime = MIMEMessage.parse("Content-Type: " + contenttype,
223
+ conn_data.receive_string)
224
+ mime.parts.each do |part|
225
+ value = Attachment.new(part.content)
226
+ value.contentid = part.contentid
227
+ obj = SOAPAttachment.new(value)
228
+ opt[:external_content][value.contentid] = obj if value.contentid
229
+ end
230
+ opt[:charset] = @mandatorycharset ||
231
+ StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
232
+ env = Processor.unmarshal(mime.root.content, opt)
233
+ else
234
+ opt[:charset] = @mandatorycharset ||
235
+ ::SOAP::StreamHandler.parse_media_type(contenttype)
236
+ env = Processor.unmarshal(conn_data.receive_string, opt)
237
+ end
238
+ unless env.is_a?(::SOAP::SOAPEnvelope)
239
+ raise ResponseFormatError.new(
240
+ "response is not a SOAP envelope: #{conn_data.receive_string}")
241
+ end
242
+ env
243
+ end
244
+
245
+ def create_header(headers)
246
+ header = SOAPHeader.new()
247
+ headers.each do |content, mustunderstand, encodingstyle|
248
+ header.add(SOAPHeaderItem.new(content, mustunderstand, encodingstyle))
249
+ end
250
+ header
251
+ end
252
+
253
+ def create_encoding_opt(hash = nil)
254
+ opt = {}
255
+ opt[:default_encodingstyle] = @default_encodingstyle
256
+ opt[:allow_unqualified_element] = @allow_unqualified_element
257
+ opt[:generate_explicit_type] = @generate_explicit_type
258
+ opt[:no_indent] = @options["soap.envelope.no_indent"]
259
+ opt[:use_numeric_character_reference] =
260
+ @options["soap.envelope.use_numeric_character_reference"]
261
+ opt.update(hash) if hash
262
+ opt
263
+ end
264
+
265
+ def create_mapping_opt(hash = nil)
266
+ opt = {
267
+ :external_ces => @options["soap.mapping.external_ces"]
268
+ }
269
+ opt.update(hash) if hash
270
+ opt
271
+ end
272
+
273
+ class Operation
274
+ attr_reader :soapaction
275
+ attr_reader :request_style
276
+ attr_reader :response_style
277
+ attr_reader :request_use
278
+ attr_reader :response_use
279
+ attr_reader :elementformdefault
280
+ attr_reader :attributeformdefault
281
+
282
+ def initialize(soapaction, param_def, opt)
283
+ @soapaction = soapaction
284
+ @request_style = opt[:request_style]
285
+ @response_style = opt[:response_style]
286
+ @request_use = opt[:request_use]
287
+ @response_use = opt[:response_use]
288
+ # set nil(unqualified) by default
289
+ @elementformdefault = opt[:elementformdefault]
290
+ @attributeformdefault = opt[:attributeformdefault]
291
+ check_style(@request_style)
292
+ check_style(@response_style)
293
+ check_use(@request_use)
294
+ check_use(@response_use)
295
+ if @request_style == :rpc
296
+ @rpc_request_qname = opt[:request_qname]
297
+ if @rpc_request_qname.nil?
298
+ raise MethodDefinitionError.new("rpc_request_qname must be given")
299
+ end
300
+ @rpc_method_factory =
301
+ RPC::SOAPMethodRequest.new(@rpc_request_qname, param_def, @soapaction)
302
+ else
303
+ @doc_request_qnames = []
304
+ @doc_request_qualified = []
305
+ @doc_response_qnames = []
306
+ @doc_response_qualified = []
307
+ param_def.each do |inout, paramname, typeinfo, eleinfo|
308
+ klass_not_used, nsdef, namedef = typeinfo
309
+ qualified = eleinfo
310
+ if namedef.nil?
311
+ raise MethodDefinitionError.new("qname must be given")
312
+ end
313
+ case inout
314
+ when SOAPMethod::IN
315
+ @doc_request_qnames << XSD::QName.new(nsdef, namedef)
316
+ @doc_request_qualified << qualified
317
+ when SOAPMethod::OUT
318
+ @doc_response_qnames << XSD::QName.new(nsdef, namedef)
319
+ @doc_response_qualified << qualified
320
+ else
321
+ raise MethodDefinitionError.new(
322
+ "illegal inout definition for document style: #{inout}")
323
+ end
324
+ end
325
+ end
326
+ end
327
+
328
+ def request_default_encodingstyle
329
+ (@request_use == :encoded) ? EncodingNamespace : LiteralNamespace
330
+ end
331
+
332
+ def response_default_encodingstyle
333
+ (@response_use == :encoded) ? EncodingNamespace : LiteralNamespace
334
+ end
335
+
336
+ def request_body(values, mapping_registry, literal_mapping_registry, opt)
337
+ if @request_style == :rpc
338
+ request_rpc(values, mapping_registry, literal_mapping_registry, opt)
339
+ else
340
+ request_doc(values, mapping_registry, literal_mapping_registry, opt)
341
+ end
342
+ end
343
+
344
+ def response_obj(body, mapping_registry, literal_mapping_registry, opt)
345
+ if @response_style == :rpc
346
+ response_rpc(body, mapping_registry, literal_mapping_registry, opt)
347
+ else
348
+ response_doc(body, mapping_registry, literal_mapping_registry, opt)
349
+ end
350
+ end
351
+
352
+ def raise_fault(e, mapping_registry, literal_mapping_registry)
353
+ if @response_style == :rpc
354
+ Mapping.fault2exception(e, mapping_registry)
355
+ else
356
+ Mapping.fault2exception(e, literal_mapping_registry)
357
+ end
358
+ end
359
+
360
+ private
361
+
362
+ def check_style(style)
363
+ unless [:rpc, :document].include?(style)
364
+ raise MethodDefinitionError.new("unknown style: #{style}")
365
+ end
366
+ end
367
+
368
+ def check_use(use)
369
+ unless [:encoded, :literal].include?(use)
370
+ raise MethodDefinitionError.new("unknown use: #{use}")
371
+ end
372
+ end
373
+
374
+ def request_rpc(values, mapping_registry, literal_mapping_registry, opt)
375
+ if @request_use == :encoded
376
+ request_rpc_enc(values, mapping_registry, opt)
377
+ else
378
+ request_rpc_lit(values, literal_mapping_registry, opt)
379
+ end
380
+ end
381
+
382
+ def request_doc(values, mapping_registry, literal_mapping_registry, opt)
383
+ if @request_use == :encoded
384
+ request_doc_enc(values, mapping_registry, opt)
385
+ else
386
+ request_doc_lit(values, literal_mapping_registry, opt)
387
+ end
388
+ end
389
+
390
+ def request_rpc_enc(values, mapping_registry, opt)
391
+ method = @rpc_method_factory.dup
392
+ names = method.input_params
393
+ obj = create_request_obj(names, values)
394
+ soap = Mapping.obj2soap(obj, mapping_registry, @rpc_request_qname, opt)
395
+ method.set_param(soap)
396
+ method
397
+ end
398
+
399
+ def request_rpc_lit(values, mapping_registry, opt)
400
+ method = @rpc_method_factory.dup
401
+ params = {}
402
+ idx = 0
403
+ method.input_params.each do |name|
404
+ params[name] = Mapping.obj2soap(values[idx], mapping_registry,
405
+ XSD::QName.new(nil, name), opt)
406
+ idx += 1
407
+ end
408
+ method.set_param(params)
409
+ method
410
+ end
411
+
412
+ def request_doc_enc(values, mapping_registry, opt)
413
+ (0...values.size).collect { |idx|
414
+ ele = Mapping.obj2soap(values[idx], mapping_registry, nil, opt)
415
+ ele.elename = @doc_request_qnames[idx]
416
+ ele
417
+ }
418
+ end
419
+
420
+ def request_doc_lit(values, mapping_registry, opt)
421
+ (0...values.size).collect { |idx|
422
+ ele = Mapping.obj2soap(values[idx], mapping_registry,
423
+ @doc_request_qnames[idx], opt)
424
+ ele.encodingstyle = LiteralNamespace
425
+ if ele.respond_to?(:qualified)
426
+ ele.qualified = @doc_request_qualified[idx]
427
+ end
428
+ ele
429
+ }
430
+ end
431
+
432
+ def response_rpc(body, mapping_registry, literal_mapping_registry, opt)
433
+ if @response_use == :encoded
434
+ response_rpc_enc(body, mapping_registry, opt)
435
+ else
436
+ response_rpc_lit(body, literal_mapping_registry, opt)
437
+ end
438
+ end
439
+
440
+ def response_doc(body, mapping_registry, literal_mapping_registry, opt)
441
+ if @response_use == :encoded
442
+ return *response_doc_enc(body, mapping_registry, opt)
443
+ else
444
+ return *response_doc_lit(body, literal_mapping_registry, opt)
445
+ end
446
+ end
447
+
448
+ def response_rpc_enc(body, mapping_registry, opt)
449
+ ret = nil
450
+ if body.response
451
+ ret = Mapping.soap2obj(body.response, mapping_registry,
452
+ @rpc_method_factory.retval_class_name, opt)
453
+ end
454
+ if body.outparams
455
+ outparams = body.outparams.collect { |outparam|
456
+ Mapping.soap2obj(outparam, mapping_registry, nil, opt)
457
+ }
458
+ [ret].concat(outparams)
459
+ else
460
+ ret
461
+ end
462
+ end
463
+
464
+ def response_rpc_lit(body, mapping_registry, opt)
465
+ body.root_node.collect { |key, value|
466
+ Mapping.soap2obj(value, mapping_registry,
467
+ @rpc_method_factory.retval_class_name, opt)
468
+ }
469
+ end
470
+
471
+ def response_doc_enc(body, mapping_registry, opt)
472
+ body.collect { |key, value|
473
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
474
+ }
475
+ end
476
+
477
+ def response_doc_lit(body, mapping_registry, opt)
478
+ body.collect { |key, value|
479
+ Mapping.soap2obj(value, mapping_registry)
480
+ }
481
+ end
482
+
483
+ def create_request_obj(names, params)
484
+ o = Object.new
485
+ idx = 0
486
+ while idx < params.length
487
+ o.instance_variable_set('@' + names[idx], params[idx])
488
+ idx += 1
489
+ end
490
+ o
491
+ end
492
+ end
493
+ end
494
+
495
+
496
+ end
497
+ end