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,594 @@
1
+ # SOAP4R - RPC Routing library
2
+ # Copyright (C) 2001, 2002, 2004, 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/mapping/wsdlliteralregistry'
13
+ require 'action_web_service/soap/rpc/rpc'
14
+ require 'action_web_service/soap/rpc/element'
15
+ require 'action_web_service/soap/streamHandler'
16
+ require 'action_web_service/soap/mimemessage'
17
+ require 'action_web_service/soap/header/handlerset'
18
+
19
+
20
+ module SOAP
21
+ module RPC
22
+
23
+
24
+ class Router
25
+ include SOAP
26
+
27
+ attr_reader :actor
28
+ attr_accessor :mapping_registry
29
+ attr_accessor :literal_mapping_registry
30
+ attr_accessor :generate_explicit_type
31
+ attr_accessor :external_ces
32
+
33
+ def initialize(actor)
34
+ @actor = actor
35
+ @mapping_registry = nil
36
+ @headerhandler = Header::HandlerSet.new
37
+ @literal_mapping_registry = ::SOAP::Mapping::WSDLLiteralRegistry.new
38
+ @generate_explicit_type = true
39
+ @external_ces = nil
40
+ @operation_by_soapaction = {}
41
+ @operation_by_qname = {}
42
+ @headerhandlerfactory = []
43
+ end
44
+
45
+ ###
46
+ ## header handler interface
47
+ #
48
+ def add_request_headerhandler(factory)
49
+ unless factory.respond_to?(:create)
50
+ raise TypeError.new("factory must respond to 'create'")
51
+ end
52
+ @headerhandlerfactory << factory
53
+ end
54
+
55
+ def add_headerhandler(handler)
56
+ @headerhandler.add(handler)
57
+ end
58
+
59
+ ###
60
+ ## servant definition interface
61
+ #
62
+ def add_rpc_request_servant(factory, namespace)
63
+ unless factory.respond_to?(:create)
64
+ raise TypeError.new("factory must respond to 'create'")
65
+ end
66
+ obj = factory.create # a dummy instance for introspection
67
+ ::SOAP::RPC.defined_methods(obj).each do |name|
68
+ begin
69
+ qname = XSD::QName.new(namespace, name)
70
+ param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
71
+ opt = create_styleuse_option(:rpc, :encoded)
72
+ add_rpc_request_operation(factory, qname, nil, name, param_def, opt)
73
+ rescue SOAP::RPC::MethodDefinitionError => e
74
+ p e if $DEBUG
75
+ end
76
+ end
77
+ end
78
+
79
+ def add_rpc_servant(obj, namespace)
80
+ ::SOAP::RPC.defined_methods(obj).each do |name|
81
+ begin
82
+ qname = XSD::QName.new(namespace, name)
83
+ param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
84
+ opt = create_styleuse_option(:rpc, :encoded)
85
+ add_rpc_operation(obj, qname, nil, name, param_def, opt)
86
+ rescue SOAP::RPC::MethodDefinitionError => e
87
+ p e if $DEBUG
88
+ end
89
+ end
90
+ end
91
+ alias add_servant add_rpc_servant
92
+
93
+ ###
94
+ ## operation definition interface
95
+ #
96
+ def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
97
+ ensure_styleuse_option(opt, :rpc, :encoded)
98
+ opt[:request_qname] = qname
99
+ op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
100
+ opt)
101
+ if opt[:request_style] != :rpc
102
+ raise RPCRoutingError.new("illegal request_style given")
103
+ end
104
+ assign_operation(soapaction, qname, op)
105
+ end
106
+ alias add_method add_rpc_operation
107
+ alias add_rpc_method add_rpc_operation
108
+
109
+ def add_rpc_request_operation(factory, qname, soapaction, name, param_def, opt = {})
110
+ ensure_styleuse_option(opt, :rpc, :encoded)
111
+ opt[:request_qname] = qname
112
+ op = RequestScopeOperation.new(soapaction, factory, name, param_def, opt)
113
+ if opt[:request_style] != :rpc
114
+ raise RPCRoutingError.new("illegal request_style given")
115
+ end
116
+ assign_operation(soapaction, qname, op)
117
+ end
118
+
119
+ def add_document_operation(receiver, soapaction, name, param_def, opt = {})
120
+ #
121
+ # adopt workaround for doc/lit wrapper method
122
+ # (you should consider to simply use rpc/lit service)
123
+ #
124
+ #unless soapaction
125
+ # raise RPCRoutingError.new("soapaction is a must for document method")
126
+ #end
127
+ ensure_styleuse_option(opt, :document, :literal)
128
+ op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
129
+ opt)
130
+ if opt[:request_style] != :document
131
+ raise RPCRoutingError.new("illegal request_style given")
132
+ end
133
+ assign_operation(soapaction, first_input_part_qname(param_def), op)
134
+ end
135
+ alias add_document_method add_document_operation
136
+
137
+ def add_document_request_operation(factory, soapaction, name, param_def, opt = {})
138
+ #
139
+ # adopt workaround for doc/lit wrapper method
140
+ # (you should consider to simply use rpc/lit service)
141
+ #
142
+ #unless soapaction
143
+ # raise RPCRoutingError.new("soapaction is a must for document method")
144
+ #end
145
+ ensure_styleuse_option(opt, :document, :literal)
146
+ op = RequestScopeOperation.new(soapaction, receiver, name, param_def, opt)
147
+ if opt[:request_style] != :document
148
+ raise RPCRoutingError.new("illegal request_style given")
149
+ end
150
+ assign_operation(soapaction, first_input_part_qname(param_def), op)
151
+ end
152
+
153
+ def route(conn_data)
154
+ # we cannot set request_default_encodingsyle before parsing the content.
155
+ env = unmarshal(conn_data)
156
+ if env.nil?
157
+ raise ArgumentError.new("illegal SOAP marshal format")
158
+ end
159
+ op = lookup_operation(conn_data.soapaction, env.body)
160
+ headerhandler = @headerhandler.dup
161
+ @headerhandlerfactory.each do |f|
162
+ headerhandler.add(f.create)
163
+ end
164
+ receive_headers(headerhandler, env.header)
165
+ soap_response = default_encodingstyle = nil
166
+ begin
167
+ soap_response =
168
+ op.call(env.body, @mapping_registry, @literal_mapping_registry,
169
+ create_mapping_opt)
170
+ default_encodingstyle = op.response_default_encodingstyle
171
+ rescue Exception
172
+ soap_response = fault($!)
173
+ default_encodingstyle = nil
174
+ end
175
+ conn_data.is_fault = true if soap_response.is_a?(SOAPFault)
176
+ header = call_headers(headerhandler)
177
+ body = SOAPBody.new(soap_response)
178
+ env = SOAPEnvelope.new(header, body)
179
+ marshal(conn_data, env, default_encodingstyle)
180
+ end
181
+
182
+ # Create fault response string.
183
+ def create_fault_response(e)
184
+ env = SOAPEnvelope.new(SOAPHeader.new, SOAPBody.new(fault(e)))
185
+ opt = {}
186
+ opt[:external_content] = nil
187
+ response_string = Processor.marshal(env, opt)
188
+ conn_data = StreamHandler::ConnectionData.new(response_string)
189
+ conn_data.is_fault = true
190
+ if ext = opt[:external_content]
191
+ mimeize(conn_data, ext)
192
+ end
193
+ conn_data
194
+ end
195
+
196
+ private
197
+
198
+ def first_input_part_qname(param_def)
199
+ param_def.each do |inout, paramname, typeinfo|
200
+ if inout == SOAPMethod::IN
201
+ klass, nsdef, namedef = typeinfo
202
+ return XSD::QName.new(nsdef, namedef)
203
+ end
204
+ end
205
+ nil
206
+ end
207
+
208
+ def create_styleuse_option(style, use)
209
+ opt = {}
210
+ opt[:request_style] = opt[:response_style] = style
211
+ opt[:request_use] = opt[:response_use] = use
212
+ opt
213
+ end
214
+
215
+ def ensure_styleuse_option(opt, style, use)
216
+ opt[:request_style] ||= style
217
+ opt[:response_style] ||= style
218
+ opt[:request_use] ||= use
219
+ opt[:response_use] ||= use
220
+ end
221
+
222
+ def assign_operation(soapaction, qname, op)
223
+ assigned = false
224
+ if soapaction and !soapaction.empty?
225
+ @operation_by_soapaction[soapaction] = op
226
+ assigned = true
227
+ end
228
+ if qname
229
+ @operation_by_qname[qname] = op
230
+ assigned = true
231
+ end
232
+ unless assigned
233
+ raise RPCRoutingError.new("cannot assign operation")
234
+ end
235
+ end
236
+
237
+ def lookup_operation(soapaction, body)
238
+ if op = @operation_by_soapaction[soapaction]
239
+ return op
240
+ end
241
+ qname = body.root_node.elename
242
+ if op = @operation_by_qname[qname]
243
+ return op
244
+ end
245
+ if soapaction
246
+ raise RPCRoutingError.new(
247
+ "operation: #{soapaction} #{qname} not supported")
248
+ else
249
+ raise RPCRoutingError.new("operation: #{qname} not supported")
250
+ end
251
+ end
252
+
253
+ def call_headers(headerhandler)
254
+ headers = headerhandler.on_outbound
255
+ if headers.empty?
256
+ nil
257
+ else
258
+ h = ::SOAP::SOAPHeader.new
259
+ headers.each do |header|
260
+ h.add(header.elename.name, header)
261
+ end
262
+ h
263
+ end
264
+ end
265
+
266
+ def receive_headers(headerhandler, headers)
267
+ headerhandler.on_inbound(headers) if headers
268
+ end
269
+
270
+ def unmarshal(conn_data)
271
+ opt = {}
272
+ contenttype = conn_data.receive_contenttype
273
+ if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
274
+ opt[:external_content] = {}
275
+ mime = MIMEMessage.parse("Content-Type: " + contenttype,
276
+ conn_data.receive_string)
277
+ mime.parts.each do |part|
278
+ value = Attachment.new(part.content)
279
+ value.contentid = part.contentid
280
+ obj = SOAPAttachment.new(value)
281
+ opt[:external_content][value.contentid] = obj if value.contentid
282
+ end
283
+ opt[:charset] =
284
+ StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
285
+ env = Processor.unmarshal(mime.root.content, opt)
286
+ else
287
+ opt[:charset] = ::SOAP::StreamHandler.parse_media_type(contenttype)
288
+ env = Processor.unmarshal(conn_data.receive_string, opt)
289
+ end
290
+ charset = opt[:charset]
291
+ conn_data.send_contenttype = "text/xml; charset=\"#{charset}\""
292
+ env
293
+ end
294
+
295
+ def marshal(conn_data, env, default_encodingstyle = nil)
296
+ opt = {}
297
+ opt[:external_content] = nil
298
+ opt[:default_encodingstyle] = default_encodingstyle
299
+ opt[:generate_explicit_type] = @generate_explicit_type
300
+ response_string = Processor.marshal(env, opt)
301
+ conn_data.send_string = response_string
302
+ if ext = opt[:external_content]
303
+ mimeize(conn_data, ext)
304
+ end
305
+ conn_data
306
+ end
307
+
308
+ def mimeize(conn_data, ext)
309
+ mime = MIMEMessage.new
310
+ ext.each do |k, v|
311
+ mime.add_attachment(v.data)
312
+ end
313
+ mime.add_part(conn_data.send_string + "\r\n")
314
+ mime.close
315
+ conn_data.send_string = mime.content_str
316
+ conn_data.send_contenttype = mime.headers['content-type'].str
317
+ conn_data
318
+ end
319
+
320
+ # Create fault response.
321
+ def fault(e)
322
+ detail = Mapping::SOAPException.new(e)
323
+ SOAPFault.new(
324
+ SOAPString.new('Server'),
325
+ SOAPString.new(e.to_s),
326
+ SOAPString.new(@actor),
327
+ Mapping.obj2soap(detail, @mapping_registry))
328
+ end
329
+
330
+ def create_mapping_opt
331
+ { :external_ces => @external_ces }
332
+ end
333
+
334
+ class Operation
335
+ attr_reader :name
336
+ attr_reader :soapaction
337
+ attr_reader :request_style
338
+ attr_reader :response_style
339
+ attr_reader :request_use
340
+ attr_reader :response_use
341
+
342
+ def initialize(soapaction, name, param_def, opt)
343
+ @soapaction = soapaction
344
+ @name = name
345
+ @request_style = opt[:request_style]
346
+ @response_style = opt[:response_style]
347
+ @request_use = opt[:request_use]
348
+ @response_use = opt[:response_use]
349
+ check_style(@request_style)
350
+ check_style(@response_style)
351
+ check_use(@request_use)
352
+ check_use(@response_use)
353
+ if @response_style == :rpc
354
+ request_qname = opt[:request_qname] or raise
355
+ @rpc_method_factory =
356
+ RPC::SOAPMethodRequest.new(request_qname, param_def, @soapaction)
357
+ @rpc_response_qname = opt[:response_qname]
358
+ else
359
+ @doc_request_qnames = []
360
+ @doc_request_qualified = []
361
+ @doc_response_qnames = []
362
+ @doc_response_qualified = []
363
+ param_def.each do |inout, paramname, typeinfo, eleinfo|
364
+ klass, nsdef, namedef = typeinfo
365
+ qualified = eleinfo
366
+ case inout
367
+ when SOAPMethod::IN
368
+ @doc_request_qnames << XSD::QName.new(nsdef, namedef)
369
+ @doc_request_qualified << qualified
370
+ when SOAPMethod::OUT
371
+ @doc_response_qnames << XSD::QName.new(nsdef, namedef)
372
+ @doc_response_qualified << qualified
373
+ else
374
+ raise ArgumentError.new(
375
+ "illegal inout definition for document style: #{inout}")
376
+ end
377
+ end
378
+ end
379
+ end
380
+
381
+ def request_default_encodingstyle
382
+ (@request_use == :encoded) ? EncodingNamespace : LiteralNamespace
383
+ end
384
+
385
+ def response_default_encodingstyle
386
+ (@response_use == :encoded) ? EncodingNamespace : LiteralNamespace
387
+ end
388
+
389
+ def call(body, mapping_registry, literal_mapping_registry, opt)
390
+ if @request_style == :rpc
391
+ values = request_rpc(body, mapping_registry, literal_mapping_registry,
392
+ opt)
393
+ else
394
+ values = request_document(body, mapping_registry,
395
+ literal_mapping_registry, opt)
396
+ end
397
+ result = receiver.method(@name.intern).call(*values)
398
+ return result if result.is_a?(SOAPFault)
399
+ if @response_style == :rpc
400
+ response_rpc(result, mapping_registry, literal_mapping_registry, opt)
401
+ else
402
+ response_doc(result, mapping_registry, literal_mapping_registry, opt)
403
+ end
404
+ end
405
+
406
+ private
407
+
408
+ def receiver
409
+ raise NotImplementedError.new('must be defined in derived class')
410
+ end
411
+
412
+ def request_rpc(body, mapping_registry, literal_mapping_registry, opt)
413
+ request = body.request
414
+ unless request.is_a?(SOAPStruct)
415
+ raise RPCRoutingError.new("not an RPC style")
416
+ end
417
+ if @request_use == :encoded
418
+ request_rpc_enc(request, mapping_registry, opt)
419
+ else
420
+ request_rpc_lit(request, literal_mapping_registry, opt)
421
+ end
422
+ end
423
+
424
+ def request_document(body, mapping_registry, literal_mapping_registry, opt)
425
+ # ToDo: compare names with @doc_request_qnames
426
+ if @request_use == :encoded
427
+ request_doc_enc(body, mapping_registry, opt)
428
+ else
429
+ request_doc_lit(body, literal_mapping_registry, opt)
430
+ end
431
+ end
432
+
433
+ def request_rpc_enc(request, mapping_registry, opt)
434
+ param = Mapping.soap2obj(request, mapping_registry, nil, opt)
435
+ request.collect { |key, value|
436
+ param[key]
437
+ }
438
+ end
439
+
440
+ def request_rpc_lit(request, mapping_registry, opt)
441
+ request.collect { |key, value|
442
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
443
+ }
444
+ end
445
+
446
+ def request_doc_enc(body, mapping_registry, opt)
447
+ body.collect { |key, value|
448
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
449
+ }
450
+ end
451
+
452
+ def request_doc_lit(body, mapping_registry, opt)
453
+ body.collect { |key, value|
454
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
455
+ }
456
+ end
457
+
458
+ def response_rpc(result, mapping_registry, literal_mapping_registry, opt)
459
+ if @response_use == :encoded
460
+ response_rpc_enc(result, mapping_registry, opt)
461
+ else
462
+ response_rpc_lit(result, literal_mapping_registry, opt)
463
+ end
464
+ end
465
+
466
+ def response_doc(result, mapping_registry, literal_mapping_registry, opt)
467
+ if @doc_response_qnames.size == 1 and !result.is_a?(Array)
468
+ result = [result]
469
+ end
470
+ if result.size != @doc_response_qnames.size
471
+ raise "required #{@doc_response_qnames.size} responses " +
472
+ "but #{result.size} given"
473
+ end
474
+ if @response_use == :encoded
475
+ response_doc_enc(result, mapping_registry, opt)
476
+ else
477
+ response_doc_lit(result, literal_mapping_registry, opt)
478
+ end
479
+ end
480
+
481
+ def response_rpc_enc(result, mapping_registry, opt)
482
+ soap_response =
483
+ @rpc_method_factory.create_method_response(@rpc_response_qname)
484
+ if soap_response.have_outparam?
485
+ unless result.is_a?(Array)
486
+ raise RPCRoutingError.new("out parameter was not returned")
487
+ end
488
+ outparams = {}
489
+ i = 1
490
+ soap_response.output_params.each do |outparam|
491
+ outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
492
+ nil, opt)
493
+ i += 1
494
+ end
495
+ soap_response.set_outparam(outparams)
496
+ soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
497
+ nil, opt)
498
+ else
499
+ soap_response.retval = Mapping.obj2soap(result, mapping_registry, nil,
500
+ opt)
501
+ end
502
+ soap_response
503
+ end
504
+
505
+ def response_rpc_lit(result, mapping_registry, opt)
506
+ soap_response =
507
+ @rpc_method_factory.create_method_response(@rpc_response_qname)
508
+ if soap_response.have_outparam?
509
+ unless result.is_a?(Array)
510
+ raise RPCRoutingError.new("out parameter was not returned")
511
+ end
512
+ outparams = {}
513
+ i = 1
514
+ soap_response.output_params.each do |outparam|
515
+ outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
516
+ XSD::QName.new(nil, outparam), opt)
517
+ i += 1
518
+ end
519
+ soap_response.set_outparam(outparams)
520
+ soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
521
+ XSD::QName.new(nil, soap_response.elename), opt)
522
+ else
523
+ soap_response.retval = Mapping.obj2soap(result, mapping_registry,
524
+ XSD::QName.new(nil, soap_response.elename), opt)
525
+ end
526
+ soap_response
527
+ end
528
+
529
+ def response_doc_enc(result, mapping_registry, opt)
530
+ (0...result.size).collect { |idx|
531
+ ele = Mapping.obj2soap(result[idx], mapping_registry, nil, opt)
532
+ ele.elename = @doc_response_qnames[idx]
533
+ ele
534
+ }
535
+ end
536
+
537
+ def response_doc_lit(result, mapping_registry, opt)
538
+ (0...result.size).collect { |idx|
539
+ ele = Mapping.obj2soap(result[idx], mapping_registry,
540
+ @doc_response_qnames[idx])
541
+ ele.encodingstyle = LiteralNamespace
542
+ if ele.respond_to?(:qualified)
543
+ ele.qualified = @doc_response_qualified[idx]
544
+ end
545
+ ele
546
+ }
547
+ end
548
+
549
+ def check_style(style)
550
+ unless [:rpc, :document].include?(style)
551
+ raise ArgumentError.new("unknown style: #{style}")
552
+ end
553
+ end
554
+
555
+ def check_use(use)
556
+ unless [:encoded, :literal].include?(use)
557
+ raise ArgumentError.new("unknown use: #{use}")
558
+ end
559
+ end
560
+ end
561
+
562
+ class ApplicationScopeOperation < Operation
563
+ def initialize(soapaction, receiver, name, param_def, opt)
564
+ super(soapaction, name, param_def, opt)
565
+ @receiver = receiver
566
+ end
567
+
568
+ private
569
+
570
+ def receiver
571
+ @receiver
572
+ end
573
+ end
574
+
575
+ class RequestScopeOperation < Operation
576
+ def initialize(soapaction, receiver_factory, name, param_def, opt)
577
+ super(soapaction, name, param_def, opt)
578
+ unless receiver_factory.respond_to?(:create)
579
+ raise TypeError.new("factory must respond to 'create'")
580
+ end
581
+ @receiver_factory = receiver_factory
582
+ end
583
+
584
+ private
585
+
586
+ def receiver
587
+ @receiver_factory.create
588
+ end
589
+ end
590
+ end
591
+
592
+
593
+ end
594
+ end