soap4r_es 0.0.1

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 (165) hide show
  1. checksums.yaml +7 -0
  2. data/bin/wsdl2ruby.rb +140 -0
  3. data/bin/wsdl2ruby_rails.rb +140 -0
  4. data/bin/xsd2ruby.rb +92 -0
  5. data/lib/soap/attachment.rb +109 -0
  6. data/lib/soap/attrproxy.rb +35 -0
  7. data/lib/soap/baseData.rb +1095 -0
  8. data/lib/soap/element.rb +278 -0
  9. data/lib/soap/encodingstyle/aspDotNetHandler.rb +208 -0
  10. data/lib/soap/encodingstyle/handler.rb +121 -0
  11. data/lib/soap/encodingstyle/literalHandler.rb +196 -0
  12. data/lib/soap/encodingstyle/soapHandler.rb +560 -0
  13. data/lib/soap/filter/filterchain.rb +52 -0
  14. data/lib/soap/filter/handler.rb +32 -0
  15. data/lib/soap/filter/streamhandler.rb +30 -0
  16. data/lib/soap/filter.rb +14 -0
  17. data/lib/soap/generator.rb +299 -0
  18. data/lib/soap/header/handler.rb +64 -0
  19. data/lib/soap/header/handlerset.rb +78 -0
  20. data/lib/soap/header/mappinghandler.rb +48 -0
  21. data/lib/soap/header/simplehandler.rb +45 -0
  22. data/lib/soap/httpconfigloader.rb +140 -0
  23. data/lib/soap/mapping/encodedregistry.rb +541 -0
  24. data/lib/soap/mapping/factory.rb +389 -0
  25. data/lib/soap/mapping/literalregistry.rb +392 -0
  26. data/lib/soap/mapping/mapping.rb +577 -0
  27. data/lib/soap/mapping/registry.rb +297 -0
  28. data/lib/soap/mapping/rubytypeFactory.rb +446 -0
  29. data/lib/soap/mapping/schemadefinition.rb +171 -0
  30. data/lib/soap/mapping/typeMap.rb +107 -0
  31. data/lib/soap/mapping/wsdlencodedregistry.rb +212 -0
  32. data/lib/soap/mapping/wsdlliteralregistry.rb +249 -0
  33. data/lib/soap/mapping.rb +13 -0
  34. data/lib/soap/marshal.rb +60 -0
  35. data/lib/soap/mimemessage.rb +243 -0
  36. data/lib/soap/nestedexception.rb +43 -0
  37. data/lib/soap/netHttpClient.rb +242 -0
  38. data/lib/soap/ns.rb +39 -0
  39. data/lib/soap/parser.rb +253 -0
  40. data/lib/soap/processor.rb +67 -0
  41. data/lib/soap/property.rb +330 -0
  42. data/lib/soap/proxy.rb +15 -0
  43. data/lib/soap/rpc/cgistub.rb +249 -0
  44. data/lib/soap/rpc/driver.rb +222 -0
  45. data/lib/soap/rpc/element.rb +375 -0
  46. data/lib/soap/rpc/httpserver.rb +144 -0
  47. data/lib/soap/rpc/methodDef.rb +69 -0
  48. data/lib/soap/rpc/proxy.rb +573 -0
  49. data/lib/soap/rpc/router.rb +672 -0
  50. data/lib/soap/rpc/rpc.rb +26 -0
  51. data/lib/soap/rpc/soaplet.rb +201 -0
  52. data/lib/soap/rpc/standaloneServer.rb +44 -0
  53. data/lib/soap/soap.rb +163 -0
  54. data/lib/soap/streamHandler.rb +302 -0
  55. data/lib/soap/version.rb +12 -0
  56. data/lib/soap/wsdlDriver.rb +165 -0
  57. data/lib/wsdl/binding.rb +66 -0
  58. data/lib/wsdl/data.rb +65 -0
  59. data/lib/wsdl/definitions.rb +237 -0
  60. data/lib/wsdl/documentation.rb +33 -0
  61. data/lib/wsdl/import.rb +81 -0
  62. data/lib/wsdl/importer.rb +39 -0
  63. data/lib/wsdl/info.rb +51 -0
  64. data/lib/wsdl/message.rb +55 -0
  65. data/lib/wsdl/operation.rb +152 -0
  66. data/lib/wsdl/operationBinding.rb +241 -0
  67. data/lib/wsdl/param.rb +94 -0
  68. data/lib/wsdl/parser.rb +180 -0
  69. data/lib/wsdl/part.rb +53 -0
  70. data/lib/wsdl/port.rb +67 -0
  71. data/lib/wsdl/portType.rb +76 -0
  72. data/lib/wsdl/service.rb +62 -0
  73. data/lib/wsdl/soap/address.rb +41 -0
  74. data/lib/wsdl/soap/binding.rb +50 -0
  75. data/lib/wsdl/soap/body.rb +59 -0
  76. data/lib/wsdl/soap/cgiStubCreator.rb +93 -0
  77. data/lib/wsdl/soap/classDefCreator.rb +529 -0
  78. data/lib/wsdl/soap/classDefCreatorSupport.rb +242 -0
  79. data/lib/wsdl/soap/classNameCreator.rb +57 -0
  80. data/lib/wsdl/soap/clientSkeltonCreator.rb +107 -0
  81. data/lib/wsdl/soap/complexType.rb +174 -0
  82. data/lib/wsdl/soap/data.rb +43 -0
  83. data/lib/wsdl/soap/definitions.rb +201 -0
  84. data/lib/wsdl/soap/driverCreator.rb +121 -0
  85. data/lib/wsdl/soap/element.rb +34 -0
  86. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +74 -0
  87. data/lib/wsdl/soap/fault.rb +57 -0
  88. data/lib/wsdl/soap/header.rb +87 -0
  89. data/lib/wsdl/soap/headerfault.rb +57 -0
  90. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +116 -0
  91. data/lib/wsdl/soap/mappingRegistryCreator.rb +59 -0
  92. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +380 -0
  93. data/lib/wsdl/soap/methodDefCreator.rb +200 -0
  94. data/lib/wsdl/soap/operation.rb +113 -0
  95. data/lib/wsdl/soap/servantSkeltonCreator.rb +92 -0
  96. data/lib/wsdl/soap/servletStubCreator.rb +105 -0
  97. data/lib/wsdl/soap/standaloneServerStubCreator.rb +101 -0
  98. data/lib/wsdl/soap/wsdl2ruby.rb +249 -0
  99. data/lib/wsdl/types.rb +45 -0
  100. data/lib/wsdl/wsdl.rb +25 -0
  101. data/lib/wsdl/xmlSchema/all.rb +25 -0
  102. data/lib/wsdl/xmlSchema/annotation.rb +35 -0
  103. data/lib/wsdl/xmlSchema/any.rb +62 -0
  104. data/lib/wsdl/xmlSchema/anyAttribute.rb +49 -0
  105. data/lib/wsdl/xmlSchema/attribute.rb +105 -0
  106. data/lib/wsdl/xmlSchema/attributeGroup.rb +69 -0
  107. data/lib/wsdl/xmlSchema/choice.rb +59 -0
  108. data/lib/wsdl/xmlSchema/complexContent.rb +98 -0
  109. data/lib/wsdl/xmlSchema/complexExtension.rb +120 -0
  110. data/lib/wsdl/xmlSchema/complexRestriction.rb +105 -0
  111. data/lib/wsdl/xmlSchema/complexType.rb +194 -0
  112. data/lib/wsdl/xmlSchema/content.rb +96 -0
  113. data/lib/wsdl/xmlSchema/data.rb +117 -0
  114. data/lib/wsdl/xmlSchema/element.rb +154 -0
  115. data/lib/wsdl/xmlSchema/enumeration.rb +37 -0
  116. data/lib/wsdl/xmlSchema/fractiondigits.rb +38 -0
  117. data/lib/wsdl/xmlSchema/group.rb +101 -0
  118. data/lib/wsdl/xmlSchema/import.rb +53 -0
  119. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  120. data/lib/wsdl/xmlSchema/importer.rb +103 -0
  121. data/lib/wsdl/xmlSchema/include.rb +48 -0
  122. data/lib/wsdl/xmlSchema/length.rb +38 -0
  123. data/lib/wsdl/xmlSchema/list.rb +49 -0
  124. data/lib/wsdl/xmlSchema/maxexclusive.rb +38 -0
  125. data/lib/wsdl/xmlSchema/maxinclusive.rb +38 -0
  126. data/lib/wsdl/xmlSchema/maxlength.rb +38 -0
  127. data/lib/wsdl/xmlSchema/minexclusive.rb +38 -0
  128. data/lib/wsdl/xmlSchema/mininclusive.rb +38 -0
  129. data/lib/wsdl/xmlSchema/minlength.rb +38 -0
  130. data/lib/wsdl/xmlSchema/parser.rb +168 -0
  131. data/lib/wsdl/xmlSchema/pattern.rb +37 -0
  132. data/lib/wsdl/xmlSchema/ref.rb +34 -0
  133. data/lib/wsdl/xmlSchema/schema.rb +179 -0
  134. data/lib/wsdl/xmlSchema/sequence.rb +55 -0
  135. data/lib/wsdl/xmlSchema/simpleContent.rb +70 -0
  136. data/lib/wsdl/xmlSchema/simpleExtension.rb +63 -0
  137. data/lib/wsdl/xmlSchema/simpleRestriction.rb +133 -0
  138. data/lib/wsdl/xmlSchema/simpleType.rb +88 -0
  139. data/lib/wsdl/xmlSchema/totaldigits.rb +38 -0
  140. data/lib/wsdl/xmlSchema/union.rb +36 -0
  141. data/lib/wsdl/xmlSchema/unique.rb +35 -0
  142. data/lib/wsdl/xmlSchema/whitespace.rb +38 -0
  143. data/lib/wsdl/xmlSchema/xsd2ruby.rb +177 -0
  144. data/lib/xsd/charset.rb +190 -0
  145. data/lib/xsd/codegen/classdef.rb +230 -0
  146. data/lib/xsd/codegen/commentdef.rb +35 -0
  147. data/lib/xsd/codegen/gensupport.rb +277 -0
  148. data/lib/xsd/codegen/methoddef.rb +71 -0
  149. data/lib/xsd/codegen/moduledef.rb +209 -0
  150. data/lib/xsd/codegen.rb +13 -0
  151. data/lib/xsd/datatypes.rb +1465 -0
  152. data/lib/xsd/datatypes1999.rb +21 -0
  153. data/lib/xsd/iconvcharset.rb +33 -0
  154. data/lib/xsd/mapping.rb +69 -0
  155. data/lib/xsd/namedelements.rb +133 -0
  156. data/lib/xsd/ns.rb +183 -0
  157. data/lib/xsd/qname.rb +80 -0
  158. data/lib/xsd/xmlparser/libxmlparser.rb +136 -0
  159. data/lib/xsd/xmlparser/nokogiriparser.rb +63 -0
  160. data/lib/xsd/xmlparser/ogaparser.rb +53 -0
  161. data/lib/xsd/xmlparser/oxparser.rb +97 -0
  162. data/lib/xsd/xmlparser/parser.rb +101 -0
  163. data/lib/xsd/xmlparser/rexmlparser.rb +54 -0
  164. data/lib/xsd/xmlparser.rb +81 -0
  165. metadata +240 -0
@@ -0,0 +1,672 @@
1
+ # encoding: UTF-8
2
+ # SOAP4R - RPC Routing library
3
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
+
5
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
6
+ # redistribute it and/or modify it under the same terms of Ruby's license;
7
+ # either the dual license version in 2003, or any later version.
8
+
9
+ require 'soap/soap'
10
+ require 'soap/processor'
11
+ require 'soap/mapping'
12
+ require 'soap/mapping/literalregistry'
13
+ require 'soap/rpc/rpc'
14
+ require 'soap/rpc/element'
15
+ require 'soap/header/handlerset'
16
+ require 'soap/filter'
17
+ require 'soap/streamHandler'
18
+ require 'soap/mimemessage'
19
+ require 'soap/header/handlerset'
20
+
21
+
22
+ module SOAP
23
+ module RPC
24
+
25
+
26
+ class Router
27
+ include SOAP
28
+
29
+ attr_reader :actor
30
+ attr_accessor :mapping_registry
31
+ attr_accessor :literal_mapping_registry
32
+ attr_accessor :generate_explicit_type
33
+ attr_accessor :use_default_namespace
34
+ attr_accessor :external_ces
35
+ attr_reader :filterchain
36
+
37
+ def initialize(actor)
38
+ @actor = actor
39
+ @mapping_registry = nil
40
+ @headerhandler = Header::HandlerSet.new
41
+ @literal_mapping_registry = ::SOAP::Mapping::LiteralRegistry.new
42
+ @generate_explicit_type = true
43
+ @use_default_namespace = false
44
+ @external_ces = nil
45
+ @operation_by_soapaction = {}
46
+ @operation_by_qname = {}
47
+ @headerhandlerfactory = []
48
+ @filterchain = Filter::FilterChain.new
49
+ end
50
+
51
+ ###
52
+ ## header handler interface
53
+ #
54
+ def add_request_headerhandler(factory)
55
+ unless factory.respond_to?(:create)
56
+ raise TypeError.new("factory must respond to 'create'")
57
+ end
58
+ @headerhandlerfactory << factory
59
+ end
60
+
61
+ def add_headerhandler(handler)
62
+ @headerhandler.add(handler)
63
+ end
64
+
65
+ ###
66
+ ## servant definition interface
67
+ #
68
+ def add_rpc_request_servant(factory, namespace)
69
+ unless factory.respond_to?(:create)
70
+ raise TypeError.new("factory must respond to 'create'")
71
+ end
72
+ obj = factory.create # a dummy instance for introspection
73
+ ::SOAP::RPC.defined_methods(obj).each do |name|
74
+ begin
75
+ qname = XSD::QName.new(namespace, name)
76
+ param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
77
+ opt = create_styleuse_option(:rpc, :encoded)
78
+ add_rpc_request_operation(factory, qname, nil, name, param_def, opt)
79
+ rescue SOAP::RPC::MethodDefinitionError => e
80
+ p e if $DEBUG
81
+ end
82
+ end
83
+ end
84
+
85
+ def add_rpc_servant(obj, namespace)
86
+ ::SOAP::RPC.defined_methods(obj).each do |name|
87
+ begin
88
+ qname = XSD::QName.new(namespace, name)
89
+ param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
90
+ opt = create_styleuse_option(:rpc, :encoded)
91
+ add_rpc_operation(obj, qname, nil, name, param_def, opt)
92
+ rescue SOAP::RPC::MethodDefinitionError => e
93
+ p e if $DEBUG
94
+ end
95
+ end
96
+ end
97
+ alias add_servant add_rpc_servant
98
+
99
+ ###
100
+ ## operation definition interface
101
+ #
102
+ def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
103
+ ensure_styleuse_option(opt, :rpc, :encoded)
104
+ opt[:request_qname] = qname
105
+ op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
106
+ opt)
107
+ if opt[:request_style] != :rpc
108
+ raise RPCRoutingError.new("illegal request_style given")
109
+ end
110
+ assign_operation(soapaction, qname, op)
111
+ end
112
+ alias add_method add_rpc_operation
113
+ alias add_rpc_method add_rpc_operation
114
+
115
+ def add_rpc_request_operation(factory, qname, soapaction, name, param_def, opt = {})
116
+ ensure_styleuse_option(opt, :rpc, :encoded)
117
+ opt[:request_qname] = qname
118
+ op = RequestScopeOperation.new(soapaction, factory, name, param_def, opt)
119
+ if opt[:request_style] != :rpc
120
+ raise RPCRoutingError.new("illegal request_style given")
121
+ end
122
+ assign_operation(soapaction, qname, op)
123
+ end
124
+
125
+ def add_document_operation(receiver, soapaction, name, param_def, opt = {})
126
+ #
127
+ # adopt workaround for doc/lit wrapper method
128
+ # (you should consider to simply use rpc/lit service)
129
+ #
130
+ #unless soapaction
131
+ # raise RPCRoutingError.new("soapaction is a must for document method")
132
+ #end
133
+ ensure_styleuse_option(opt, :document, :literal)
134
+ op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
135
+ opt)
136
+ if opt[:request_style] != :document
137
+ raise RPCRoutingError.new("illegal request_style given")
138
+ end
139
+ assign_operation(soapaction, first_input_part_qname(param_def), op)
140
+ end
141
+ alias add_document_method add_document_operation
142
+
143
+ def add_document_request_operation(factory, soapaction, name, param_def, opt = {})
144
+ #
145
+ # adopt workaround for doc/lit wrapper method
146
+ # (you should consider to simply use rpc/lit service)
147
+ #
148
+ #unless soapaction
149
+ # raise RPCRoutingError.new("soapaction is a must for document method")
150
+ #end
151
+ ensure_styleuse_option(opt, :document, :literal)
152
+ op = RequestScopeOperation.new(soapaction, receiver, name, param_def, opt)
153
+ if opt[:request_style] != :document
154
+ raise RPCRoutingError.new("illegal request_style given")
155
+ end
156
+ assign_operation(soapaction, first_input_part_qname(param_def), op)
157
+ end
158
+ require 'soap/mapping/mapping'
159
+ def route(conn_data)
160
+ # we cannot set request_default_encodingsyle before parsing the content.
161
+
162
+ env = unmarshal(conn_data)
163
+ if env.nil?
164
+ raise ArgumentError.new("illegal SOAP marshal format")
165
+ end
166
+ op = lookup_operation(conn_data.soapaction, env)
167
+ #add_request_headerhandler(ServerAuthHeaderHandler)
168
+
169
+ headerhandler = @headerhandler.dup
170
+ @headerhandlerfactory.each do |f|
171
+ headerhandler.add(f.create)
172
+ end
173
+ soap_response = default_encodingstyle = nil
174
+ begin
175
+ receive_headers(headerhandler, env.header)
176
+ header = call_headers(headerhandler)
177
+ #ricavo l'handler configurato
178
+ my_handler = headerhandler.get_handler(@headerhandlerfactory[0])
179
+ #chiamo il metodo che mi ritorna l'oggetto
180
+ header_soap = my_handler.on_mapping_outbound
181
+ soap_response = op.call(env, header_soap, @mapping_registry, @literal_mapping_registry,
182
+ create_mapping_opt)
183
+ conn_data.is_fault = true if soap_response.is_a?(SOAPFault)
184
+ default_encodingstyle = op.response_default_encodingstyle
185
+ rescue Exception => e
186
+ # If a wsdl fault was raised by service, the fault declaration details
187
+ # is kept in wsdl_fault. Otherwise (exception is a program fault)
188
+ # wsdl_fault is nil
189
+ wsdl_fault_details = op.faults && op.faults[e.class.name]
190
+ soap_response = fault(e, wsdl_fault_details)
191
+ conn_data.is_fault = true
192
+ default_encodingstyle = nil
193
+ end
194
+
195
+ if op.response_use.nil?
196
+ conn_data.send_string = ''
197
+ conn_data.is_nocontent = true
198
+ conn_data
199
+ else
200
+ body = SOAPBody.new(soap_response, conn_data.is_fault)
201
+ env = SOAPEnvelope.new(header, body)
202
+ marshal(conn_data, env, default_encodingstyle)
203
+ end
204
+ end
205
+
206
+ # Create fault response string.
207
+ def create_fault_response(e)
208
+ env = SOAPEnvelope.new(SOAPHeader.new, SOAPBody.new(fault(e, nil), true))
209
+ opt = {}
210
+ opt[:external_content] = nil
211
+ @filterchain.reverse_each do |filter|
212
+ env = filter.on_outbound(env, opt)
213
+ break unless env
214
+ end
215
+ response_string = Processor.marshal(env, opt)
216
+ conn_data = StreamHandler::ConnectionData.new(response_string)
217
+ conn_data.is_fault = true
218
+ if ext = opt[:external_content]
219
+ mimeize(conn_data, ext)
220
+ end
221
+ conn_data
222
+ end
223
+
224
+ private
225
+
226
+ def first_input_part_qname(param_def)
227
+ param_def.each do |param|
228
+ param = MethodDef.to_param(param)
229
+ if param.io_type == SOAPMethod::IN
230
+ return param.qname
231
+ end
232
+ end
233
+ nil
234
+ end
235
+
236
+ def create_styleuse_option(style, use)
237
+ opt = {}
238
+ opt[:request_style] = opt[:response_style] = style
239
+ opt[:request_use] = opt[:response_use] = use
240
+ opt
241
+ end
242
+
243
+ def ensure_styleuse_option(opt, style, use)
244
+ if opt[:request_style] || opt[:response_style] || opt[:request_use] || opt[:response_use]
245
+ # do not edit
246
+ else
247
+ opt[:request_style] ||= style
248
+ opt[:response_style] ||= style
249
+ opt[:request_use] ||= use
250
+ opt[:response_use] ||= use
251
+ end
252
+ end
253
+
254
+ def assign_operation(soapaction, qname, op)
255
+ assigned = false
256
+ if soapaction and !soapaction.empty?
257
+ @operation_by_soapaction[soapaction] = op
258
+ assigned = true
259
+ end
260
+ if qname
261
+ @operation_by_qname[qname] = op
262
+ assigned = true
263
+ end
264
+ unless assigned
265
+ raise RPCRoutingError.new("cannot assign operation")
266
+ end
267
+ end
268
+
269
+ def lookup_operation(soapaction, body)
270
+ if op = @operation_by_soapaction[soapaction]
271
+ return op
272
+ end
273
+ qname = body.root_node.elename
274
+ if op = @operation_by_qname[qname]
275
+ return op
276
+ end
277
+ if soapaction
278
+ raise RPCRoutingError.new(
279
+ "operation: #{soapaction} #{qname} not supported")
280
+ else
281
+ raise RPCRoutingError.new("operation: #{qname} not supported")
282
+ end
283
+ end
284
+
285
+ def call_headers(headerhandler)
286
+ header = ::SOAP::SOAPHeader.new
287
+ items = headerhandler.on_outbound(header)
288
+ items.each do |item|
289
+ header.add(item.elename.name, item)
290
+ end
291
+ header
292
+ end
293
+
294
+ def receive_headers(headerhandler, header)
295
+ headerhandler.on_inbound(header) if header
296
+ end
297
+
298
+ def unmarshal(conn_data)
299
+ xml = nil
300
+ opt = {}
301
+ contenttype = conn_data.receive_contenttype
302
+ if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
303
+ opt[:external_content] = {}
304
+ mime = MIMEMessage.parse("Content-Type: " + contenttype,
305
+ conn_data.receive_string)
306
+ mime.parts.each do |part|
307
+ value = Attachment.new(part.content)
308
+ value.contentid = part.contentid
309
+ obj = SOAPAttachment.new(value)
310
+ opt[:external_content][value.contentid] = obj if value.contentid
311
+ end
312
+ opt[:charset] =
313
+ StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
314
+ xml = mime.root.content
315
+ else
316
+ opt[:charset] = ::SOAP::StreamHandler.parse_media_type(contenttype)
317
+ xml = conn_data.receive_string
318
+ end
319
+ @filterchain.each do |filter|
320
+ xml = filter.on_inbound(xml, opt)
321
+ break unless xml
322
+ end
323
+ env = Processor.unmarshal(xml, opt)
324
+ charset = opt[:charset]
325
+ conn_data.send_contenttype = "text/xml; charset=\"#{charset}\""
326
+ env
327
+ end
328
+
329
+ def marshal(conn_data, env, default_encodingstyle = nil)
330
+ opt = {}
331
+ opt[:external_content] = nil
332
+ opt[:default_encodingstyle] = default_encodingstyle
333
+ opt[:generate_explicit_type] = @generate_explicit_type
334
+ opt[:use_default_namespace] = @use_default_namespace
335
+ @filterchain.reverse_each do |filter|
336
+ env = filter.on_outbound(env, opt)
337
+ break unless env
338
+ end
339
+ response_string = Processor.marshal(env, opt)
340
+ conn_data.send_string = response_string
341
+ if ext = opt[:external_content]
342
+ mimeize(conn_data, ext)
343
+ end
344
+ conn_data
345
+ end
346
+
347
+ def mimeize(conn_data, ext)
348
+ mime = MIMEMessage.new
349
+ ext.each do |k, v|
350
+ mime.add_attachment(v.data)
351
+ end
352
+ mime.add_part(conn_data.send_string + "\r\n")
353
+ mime.close
354
+ conn_data.send_string = mime.content_str
355
+ conn_data.send_contenttype = mime.headers['content-type'].str
356
+ conn_data
357
+ end
358
+
359
+ # Create fault response.
360
+ def fault(e, wsdl_fault_details)
361
+ if e.is_a?(UnhandledMustUnderstandHeaderError)
362
+ faultcode = FaultCode::MustUnderstand
363
+ else
364
+ faultcode = FaultCode::Server
365
+ end
366
+
367
+ # If the exception represents a WSDL fault, the fault element should
368
+ # be added as the SOAP fault <detail> element. If the exception is a
369
+ # normal program exception, it is wrapped inside a custom SOAP4R
370
+ # SOAP exception element.
371
+ detail = nil
372
+ begin
373
+ if (wsdl_fault_details)
374
+ registry = wsdl_fault_details[:use] == "literal" ?
375
+ @literal_mapping_registry : @mapping_registry
376
+ faultQName = XSD::QName.new(
377
+ wsdl_fault_details[:ns], wsdl_fault_details[:name]
378
+ )
379
+ detail = Mapping.obj2soap(e, registry, faultQName)
380
+ # wrap fault element (SOAPFault swallows top-level element)
381
+ wrapper = SOAP::SOAPElement.new(faultQName)
382
+ wrapper.add(detail)
383
+ detail = wrapper
384
+ else
385
+ # Exception is a normal program exception. Wrap it.
386
+ detail = Mapping.obj2soap(Mapping::SOAPException.new(e),
387
+ @mapping_registry)
388
+ detail.elename ||= XSD::QName::EMPTY # for literal mappingregstry
389
+ end
390
+ rescue
391
+ detail = SOAPString.new("failed to serialize detail object: #{$!}")
392
+ end
393
+
394
+ SOAPFault.new(
395
+ SOAPElement.new(nil, faultcode),
396
+ SOAPString.new(e.to_s),
397
+ SOAPString.new(@actor),
398
+ detail)
399
+ end
400
+
401
+ def create_mapping_opt
402
+ { :external_ces => @external_ces }
403
+ end
404
+
405
+ class Operation
406
+ attr_reader :name
407
+ attr_reader :soapaction
408
+ attr_reader :request_style
409
+ attr_reader :response_style
410
+ attr_reader :request_use
411
+ attr_reader :response_use
412
+ attr_reader :faults
413
+
414
+ def initialize(soapaction, name, param_def, opt)
415
+ @soapaction = soapaction
416
+ @name = name
417
+ @request_style = opt[:request_style]
418
+ @response_style = opt[:response_style]
419
+ @request_use = opt[:request_use]
420
+ @response_use = opt[:response_use]
421
+ @faults = opt[:faults]
422
+ check_style(@request_style)
423
+ check_style(@response_style)
424
+ check_use(@request_use)
425
+ check_use(@response_use)
426
+ if @response_style == :rpc
427
+ request_qname = opt[:request_qname] or raise
428
+ @rpc_method_factory =
429
+ RPC::SOAPMethodRequest.new(request_qname, param_def, @soapaction)
430
+ @rpc_response_qname = opt[:response_qname]
431
+ else
432
+ @doc_request_qnames = []
433
+ @doc_response_qnames = []
434
+ param_def.each do |param|
435
+ param = MethodDef.to_param(param)
436
+ case param.io_type
437
+ when SOAPMethod::IN
438
+ @doc_request_qnames << param.qname
439
+ when SOAPMethod::OUT
440
+ @doc_response_qnames << param.qname
441
+ else
442
+ raise ArgumentError.new(
443
+ "illegal inout definition for document style: #{param.io_type}")
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ def request_default_encodingstyle
450
+ (@request_use == :encoded) ? EncodingNamespace : LiteralNamespace
451
+ end
452
+
453
+ def response_default_encodingstyle
454
+ (@response_use == :encoded) ? EncodingNamespace : LiteralNamespace
455
+ end
456
+
457
+ def call(env, soap_header, mapping_registry, literal_mapping_registry, opt)
458
+ if @request_style == :rpc
459
+ values = request_rpc(env.body, mapping_registry, literal_mapping_registry,
460
+ opt)
461
+ else
462
+ values = request_document(env.body, mapping_registry,
463
+ literal_mapping_registry, opt)
464
+ end
465
+ values << soap_header unless soap_header.blank?
466
+ obj = receiver.method(@name.intern)
467
+ #receiver.paaAttivaRPT(*values)
468
+ result = obj.call(*values)
469
+ return result if result.is_a?(SOAPFault)
470
+ if @response_style == :rpc
471
+ response_rpc(result, mapping_registry, literal_mapping_registry, opt)
472
+ elsif @doc_response_qnames.empty?
473
+ # nothing to do
474
+ else
475
+ response_doc(result, mapping_registry, literal_mapping_registry, opt)
476
+ end
477
+ end
478
+
479
+ private
480
+
481
+ def receiver
482
+ raise NotImplementedError.new('must be defined in derived class')
483
+ end
484
+
485
+ def request_rpc(body, mapping_registry, literal_mapping_registry, opt)
486
+ request = body.request
487
+ unless request.is_a?(SOAPNameAccessible)
488
+ if request.is_a?(SOAPNil)
489
+ # SOAP::Lite/0.69 seems to send xsi:nil="true" element as a request.
490
+ request = SOAPStruct.new(request.elename)
491
+ else
492
+ raise RPCRoutingError.new("not an RPC style")
493
+ end
494
+ end
495
+ if @request_use == :encoded
496
+ request_rpc_enc(request, mapping_registry, opt)
497
+ else
498
+ request_rpc_lit(request, literal_mapping_registry, opt)
499
+ end
500
+ end
501
+
502
+ def request_document(body, mapping_registry, literal_mapping_registry, opt)
503
+ # ToDo: compare names with @doc_request_qnames
504
+ if @request_use == :encoded
505
+ request_doc_enc(body, mapping_registry, opt)
506
+ else
507
+ request_doc_lit(body, literal_mapping_registry, opt)
508
+ end
509
+ end
510
+
511
+ def request_rpc_enc(request, mapping_registry, opt)
512
+ param = Mapping.soap2obj(request, mapping_registry, nil, opt)
513
+ request.collect { |key, value|
514
+ param[key]
515
+ }
516
+ end
517
+
518
+ def request_rpc_lit(request, mapping_registry, opt)
519
+ request.collect { |key, value|
520
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
521
+ }
522
+ end
523
+
524
+ def request_doc_enc(body, mapping_registry, opt)
525
+ body.collect { |key, value|
526
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
527
+ }
528
+ end
529
+
530
+ def request_doc_lit(body, mapping_registry, opt)
531
+ body.collect { |key, value|
532
+ Mapping.soap2obj(value, mapping_registry, nil, opt)
533
+ }
534
+ end
535
+
536
+ def response_rpc(result, mapping_registry, literal_mapping_registry, opt)
537
+ if @response_use == :encoded
538
+ response_rpc_enc(result, mapping_registry, opt)
539
+ else
540
+ response_rpc_lit(result, literal_mapping_registry, opt)
541
+ end
542
+ end
543
+
544
+ def response_doc(result, mapping_registry, literal_mapping_registry, opt)
545
+ if @doc_response_qnames.size == 0
546
+ result = []
547
+ elsif @doc_response_qnames.size == 1
548
+ result = [result]
549
+ end
550
+ if result.size != @doc_response_qnames.size
551
+ raise "required #{@doc_response_qnames.size} responses " +
552
+ "but #{result.size} given"
553
+ end
554
+ if @response_use == :encoded
555
+ response_doc_enc(result, mapping_registry, opt)
556
+ else
557
+ response_doc_lit(result, literal_mapping_registry, opt)
558
+ end
559
+ end
560
+
561
+ def response_rpc_enc(result, mapping_registry, opt)
562
+ soap_response =
563
+ @rpc_method_factory.create_method_response(@rpc_response_qname)
564
+ if soap_response.have_outparam?
565
+ unless result.is_a?(Array)
566
+ raise RPCRoutingError.new("out parameter was not returned")
567
+ end
568
+ outparams = {}
569
+ i = 1
570
+ soap_response.output_params.each do |outparam|
571
+ outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
572
+ nil, opt)
573
+ i += 1
574
+ end
575
+ soap_response.set_outparam(outparams)
576
+ soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
577
+ nil, opt)
578
+ else
579
+ soap_response.retval = Mapping.obj2soap(result, mapping_registry, nil,
580
+ opt)
581
+ end
582
+ soap_response
583
+ end
584
+
585
+ def response_rpc_lit(result, mapping_registry, opt)
586
+ soap_response =
587
+ @rpc_method_factory.create_method_response(@rpc_response_qname)
588
+ if soap_response.have_outparam?
589
+ unless result.is_a?(Array)
590
+ raise RPCRoutingError.new("out parameter was not returned")
591
+ end
592
+ outparams = {}
593
+ i = 1
594
+ soap_response.output_params.each do |outparam|
595
+ outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
596
+ XSD::QName.new(nil, outparam), opt)
597
+ i += 1
598
+ end
599
+ soap_response.set_outparam(outparams)
600
+ soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
601
+ soap_response.elename, opt)
602
+ else
603
+ soap_response.retval = Mapping.obj2soap(result, mapping_registry,
604
+ soap_response.elename, opt)
605
+ end
606
+ soap_response
607
+ end
608
+
609
+ def response_doc_enc(result, mapping_registry, opt)
610
+ (0...result.size).collect { |idx|
611
+ ele = Mapping.obj2soap(result[idx], mapping_registry, nil, opt)
612
+ ele.elename = @doc_response_qnames[idx]
613
+ ele
614
+ }
615
+ end
616
+
617
+ def response_doc_lit(result, mapping_registry, opt)
618
+ (0...result.size).collect { |idx|
619
+ ele = Mapping.obj2soap(result[idx], mapping_registry,
620
+ @doc_response_qnames[idx])
621
+ ele.encodingstyle = LiteralNamespace
622
+ ele
623
+ }
624
+ end
625
+
626
+ def check_style(style)
627
+ unless [:rpc, :document].include?(style)
628
+ raise ArgumentError.new("unknown style: #{style}")
629
+ end
630
+ end
631
+
632
+ # nil means oneway
633
+ def check_use(use)
634
+ unless [:encoded, :literal, nil].include?(use)
635
+ raise ArgumentError.new("unknown use: #{use}")
636
+ end
637
+ end
638
+ end
639
+
640
+ class ApplicationScopeOperation < Operation
641
+ def initialize(soapaction, receiver, name, param_def, opt)
642
+ super(soapaction, name, param_def, opt)
643
+ @receiver = receiver
644
+ end
645
+
646
+ private
647
+
648
+ def receiver
649
+ @receiver
650
+ end
651
+ end
652
+
653
+ class RequestScopeOperation < Operation
654
+ def initialize(soapaction, receiver_factory, name, param_def, opt)
655
+ super(soapaction, name, param_def, opt)
656
+ unless receiver_factory.respond_to?(:create)
657
+ raise TypeError.new("factory must respond to 'create'")
658
+ end
659
+ @receiver_factory = receiver_factory
660
+ end
661
+
662
+ private
663
+
664
+ def receiver
665
+ @receiver_factory.create
666
+ end
667
+ end
668
+ end
669
+
670
+
671
+ end
672
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+ # SOAP4R - RPC utility.
3
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
+
5
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
6
+ # redistribute it and/or modify it under the same terms of Ruby's license;
7
+ # either the dual license version in 2003, or any later version.
8
+
9
+
10
+ module SOAP
11
+
12
+
13
+ module RPC
14
+ ServerException = Mapping::MappedException
15
+
16
+ def self.defined_methods(obj)
17
+ if obj.is_a?(Module)
18
+ obj.methods - Module.methods
19
+ else
20
+ obj.methods - Object.instance_methods(true)
21
+ end
22
+ end
23
+ end
24
+
25
+
26
+ end