railsware-soap4r 1.5.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/README +5 -0
  2. data/TODO +0 -0
  3. data/bin/wsdl2ruby.rb +137 -0
  4. data/bin/xsd2ruby.rb +90 -0
  5. data/lib/soap/XMLSchemaDatatypes.rb +9 -0
  6. data/lib/soap/XMLSchemaDatatypes1999.rb +10 -0
  7. data/lib/soap/attachment.rb +108 -0
  8. data/lib/soap/baseData.rb +1092 -0
  9. data/lib/soap/cgistub.rb +9 -0
  10. data/lib/soap/charset.rb +9 -0
  11. data/lib/soap/compat.rb +182 -0
  12. data/lib/soap/driver.rb +9 -0
  13. data/lib/soap/element.rb +277 -0
  14. data/lib/soap/encodingstyle/aspDotNetHandler.rb +207 -0
  15. data/lib/soap/encodingstyle/handler.rb +120 -0
  16. data/lib/soap/encodingstyle/literalHandler.rb +192 -0
  17. data/lib/soap/encodingstyle/soapHandler.rb +559 -0
  18. data/lib/soap/filter.rb +13 -0
  19. data/lib/soap/filter/filterchain.rb +51 -0
  20. data/lib/soap/filter/handler.rb +31 -0
  21. data/lib/soap/filter/streamhandler.rb +29 -0
  22. data/lib/soap/generator.rb +304 -0
  23. data/lib/soap/header/handler.rb +61 -0
  24. data/lib/soap/header/handlerset.rb +70 -0
  25. data/lib/soap/header/mappinghandler.rb +47 -0
  26. data/lib/soap/header/simplehandler.rb +44 -0
  27. data/lib/soap/httpconfigloader.rb +139 -0
  28. data/lib/soap/mapping.rb +12 -0
  29. data/lib/soap/mapping/encodedregistry.rb +548 -0
  30. data/lib/soap/mapping/factory.rb +388 -0
  31. data/lib/soap/mapping/literalregistry.rb +388 -0
  32. data/lib/soap/mapping/mapping.rb +609 -0
  33. data/lib/soap/mapping/registry.rb +295 -0
  34. data/lib/soap/mapping/rubytypeFactory.rb +478 -0
  35. data/lib/soap/mapping/schemadefinition.rb +170 -0
  36. data/lib/soap/mapping/typeMap.rb +106 -0
  37. data/lib/soap/mapping/wsdlencodedregistry.rb +211 -0
  38. data/lib/soap/mapping/wsdlliteralregistry.rb +243 -0
  39. data/lib/soap/mappingRegistry.rb +9 -0
  40. data/lib/soap/marshal.rb +59 -0
  41. data/lib/soap/mimemessage.rb +241 -0
  42. data/lib/soap/namespace.rb +9 -0
  43. data/lib/soap/nestedexception.rb +42 -0
  44. data/lib/soap/netHttpClient.rb +241 -0
  45. data/lib/soap/ns.rb +34 -0
  46. data/lib/soap/parser.rb +252 -0
  47. data/lib/soap/processor.rb +66 -0
  48. data/lib/soap/property.rb +333 -0
  49. data/lib/soap/proxy.rb +14 -0
  50. data/lib/soap/qname.rb +9 -0
  51. data/lib/soap/rpc/cgistub.rb +247 -0
  52. data/lib/soap/rpc/driver.rb +247 -0
  53. data/lib/soap/rpc/element.rb +369 -0
  54. data/lib/soap/rpc/httpserver.rb +169 -0
  55. data/lib/soap/rpc/proxy.rb +576 -0
  56. data/lib/soap/rpc/router.rb +669 -0
  57. data/lib/soap/rpc/rpc.rb +25 -0
  58. data/lib/soap/rpc/soaplet.rb +210 -0
  59. data/lib/soap/rpc/standaloneServer.rb +43 -0
  60. data/lib/soap/rpcRouter.rb +9 -0
  61. data/lib/soap/rpcUtils.rb +9 -0
  62. data/lib/soap/server.rb +9 -0
  63. data/lib/soap/soap.rb +151 -0
  64. data/lib/soap/standaloneServer.rb +9 -0
  65. data/lib/soap/streamHandler.rb +302 -0
  66. data/lib/soap/wsdlDriver.rb +597 -0
  67. data/lib/tags +5690 -0
  68. data/lib/wsdl/binding.rb +65 -0
  69. data/lib/wsdl/data.rb +64 -0
  70. data/lib/wsdl/definitions.rb +236 -0
  71. data/lib/wsdl/documentation.rb +32 -0
  72. data/lib/wsdl/import.rb +80 -0
  73. data/lib/wsdl/importer.rb +38 -0
  74. data/lib/wsdl/info.rb +50 -0
  75. data/lib/wsdl/message.rb +54 -0
  76. data/lib/wsdl/operation.rb +178 -0
  77. data/lib/wsdl/operationBinding.rb +130 -0
  78. data/lib/wsdl/param.rb +93 -0
  79. data/lib/wsdl/parser.rb +164 -0
  80. data/lib/wsdl/part.rb +52 -0
  81. data/lib/wsdl/port.rb +84 -0
  82. data/lib/wsdl/portType.rb +75 -0
  83. data/lib/wsdl/service.rb +61 -0
  84. data/lib/wsdl/soap/address.rb +40 -0
  85. data/lib/wsdl/soap/binding.rb +49 -0
  86. data/lib/wsdl/soap/body.rb +58 -0
  87. data/lib/wsdl/soap/cgiStubCreator.rb +93 -0
  88. data/lib/wsdl/soap/classDefCreator.rb +433 -0
  89. data/lib/wsdl/soap/classDefCreatorSupport.rb +230 -0
  90. data/lib/wsdl/soap/classNameCreator.rb +54 -0
  91. data/lib/wsdl/soap/clientSkeltonCreator.rb +95 -0
  92. data/lib/wsdl/soap/complexType.rb +172 -0
  93. data/lib/wsdl/soap/data.rb +42 -0
  94. data/lib/wsdl/soap/definitions.rb +200 -0
  95. data/lib/wsdl/soap/driverCreator.rb +118 -0
  96. data/lib/wsdl/soap/element.rb +33 -0
  97. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +73 -0
  98. data/lib/wsdl/soap/fault.rb +56 -0
  99. data/lib/wsdl/soap/header.rb +86 -0
  100. data/lib/wsdl/soap/headerfault.rb +56 -0
  101. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +115 -0
  102. data/lib/wsdl/soap/mappingRegistryCreator.rb +58 -0
  103. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +376 -0
  104. data/lib/wsdl/soap/methodDefCreator.rb +263 -0
  105. data/lib/wsdl/soap/operation.rb +122 -0
  106. data/lib/wsdl/soap/servantSkeltonCreator.rb +80 -0
  107. data/lib/wsdl/soap/servletStubCreator.rb +107 -0
  108. data/lib/wsdl/soap/standaloneServerStubCreator.rb +103 -0
  109. data/lib/wsdl/soap/wsdl2ruby.rb +217 -0
  110. data/lib/wsdl/types.rb +44 -0
  111. data/lib/wsdl/wsdl.rb +24 -0
  112. data/lib/wsdl/xmlSchema/all.rb +24 -0
  113. data/lib/wsdl/xmlSchema/annotation.rb +34 -0
  114. data/lib/wsdl/xmlSchema/any.rb +61 -0
  115. data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
  116. data/lib/wsdl/xmlSchema/attribute.rb +123 -0
  117. data/lib/wsdl/xmlSchema/attributeGroup.rb +86 -0
  118. data/lib/wsdl/xmlSchema/choice.rb +58 -0
  119. data/lib/wsdl/xmlSchema/complexContent.rb +97 -0
  120. data/lib/wsdl/xmlSchema/complexExtension.rb +119 -0
  121. data/lib/wsdl/xmlSchema/complexRestriction.rb +104 -0
  122. data/lib/wsdl/xmlSchema/complexType.rb +193 -0
  123. data/lib/wsdl/xmlSchema/content.rb +95 -0
  124. data/lib/wsdl/xmlSchema/data.rb +116 -0
  125. data/lib/wsdl/xmlSchema/element.rb +173 -0
  126. data/lib/wsdl/xmlSchema/enumeration.rb +36 -0
  127. data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
  128. data/lib/wsdl/xmlSchema/group.rb +118 -0
  129. data/lib/wsdl/xmlSchema/import.rb +53 -0
  130. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  131. data/lib/wsdl/xmlSchema/importer.rb +102 -0
  132. data/lib/wsdl/xmlSchema/include.rb +48 -0
  133. data/lib/wsdl/xmlSchema/length.rb +37 -0
  134. data/lib/wsdl/xmlSchema/list.rb +48 -0
  135. data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
  136. data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
  137. data/lib/wsdl/xmlSchema/maxlength.rb +37 -0
  138. data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
  139. data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
  140. data/lib/wsdl/xmlSchema/minlength.rb +37 -0
  141. data/lib/wsdl/xmlSchema/parser.rb +167 -0
  142. data/lib/wsdl/xmlSchema/pattern.rb +36 -0
  143. data/lib/wsdl/xmlSchema/schema.rb +178 -0
  144. data/lib/wsdl/xmlSchema/sequence.rb +54 -0
  145. data/lib/wsdl/xmlSchema/simpleContent.rb +69 -0
  146. data/lib/wsdl/xmlSchema/simpleExtension.rb +62 -0
  147. data/lib/wsdl/xmlSchema/simpleRestriction.rb +132 -0
  148. data/lib/wsdl/xmlSchema/simpleType.rb +87 -0
  149. data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
  150. data/lib/wsdl/xmlSchema/union.rb +35 -0
  151. data/lib/wsdl/xmlSchema/unique.rb +34 -0
  152. data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
  153. data/lib/wsdl/xmlSchema/xsd2ruby.rb +174 -0
  154. data/lib/xsd/charset.rb +189 -0
  155. data/lib/xsd/codegen.rb +12 -0
  156. data/lib/xsd/codegen/classdef.rb +208 -0
  157. data/lib/xsd/codegen/commentdef.rb +34 -0
  158. data/lib/xsd/codegen/gensupport.rb +273 -0
  159. data/lib/xsd/codegen/methoddef.rb +70 -0
  160. data/lib/xsd/codegen/moduledef.rb +208 -0
  161. data/lib/xsd/datatypes.rb +1466 -0
  162. data/lib/xsd/datatypes1999.rb +20 -0
  163. data/lib/xsd/iconvcharset.rb +33 -0
  164. data/lib/xsd/mapping.rb +67 -0
  165. data/lib/xsd/namedelements.rb +132 -0
  166. data/lib/xsd/ns.rb +182 -0
  167. data/lib/xsd/qname.rb +79 -0
  168. data/lib/xsd/xmlparser.rb +75 -0
  169. data/lib/xsd/xmlparser/parser.rb +100 -0
  170. data/lib/xsd/xmlparser/rexmlparser.rb +58 -0
  171. data/lib/xsd/xmlparser/xmlparser.rb +50 -0
  172. data/lib/xsd/xmlparser/xmlscanner.rb +149 -0
  173. data/soap4r.gemspec +218 -0
  174. metadata +233 -0
@@ -0,0 +1,247 @@
1
+ # SOAP4R - SOAP RPC driver
2
+ # Copyright (C) 2000-2007 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 'soap/soap'
10
+ require 'soap/mapping'
11
+ require 'soap/rpc/rpc'
12
+ require 'soap/rpc/proxy'
13
+ require 'soap/rpc/element'
14
+ require 'soap/streamHandler'
15
+ require 'soap/property'
16
+ require 'soap/header/handlerset'
17
+
18
+
19
+ module SOAP
20
+ module RPC
21
+
22
+
23
+ class Driver
24
+ class << self
25
+ if RUBY_VERSION >= "1.7.0"
26
+ def __attr_proxy(symbol, assignable = false)
27
+ name = symbol.to_s
28
+ define_method(name) {
29
+ @proxy.__send__(name)
30
+ }
31
+ if assignable
32
+ aname = name + '='
33
+ define_method(aname) { |rhs|
34
+ @proxy.__send__(aname, rhs)
35
+ }
36
+ end
37
+ end
38
+ else
39
+ def __attr_proxy(symbol, assignable = false)
40
+ name = symbol.to_s
41
+ module_eval <<-EOS
42
+ def #{name}
43
+ @proxy.#{name}
44
+ end
45
+ EOS
46
+ if assignable
47
+ module_eval <<-EOS
48
+ def #{name}=(value)
49
+ @proxy.#{name} = value
50
+ end
51
+ EOS
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ __attr_proxy :endpoint_url, true
58
+ __attr_proxy :mapping_registry, true
59
+ __attr_proxy :literal_mapping_registry, true
60
+ __attr_proxy :allow_unqualified_element, true
61
+ __attr_proxy :default_encodingstyle, true
62
+ __attr_proxy :generate_explicit_type, true
63
+ __attr_proxy :use_default_namespace, true
64
+ __attr_proxy :return_response_as_xml, true
65
+ __attr_proxy :headerhandler
66
+ __attr_proxy :filterchain
67
+ __attr_proxy :streamhandler
68
+ __attr_proxy :test_loopback_response
69
+ __attr_proxy :reset_stream
70
+
71
+ attr_reader :proxy
72
+ attr_reader :options
73
+ attr_accessor :soapaction
74
+
75
+ def inspect
76
+ "#<#{self.class}:#{@proxy.inspect}>"
77
+ end
78
+
79
+ def httpproxy
80
+ options["protocol.http.proxy"]
81
+ end
82
+
83
+ def httpproxy=(httpproxy)
84
+ options["protocol.http.proxy"] = httpproxy
85
+ end
86
+
87
+ def wiredump_dev
88
+ options["protocol.http.wiredump_dev"]
89
+ end
90
+
91
+ def wiredump_dev=(wiredump_dev)
92
+ options["protocol.http.wiredump_dev"] = wiredump_dev
93
+ end
94
+
95
+ def mandatorycharset
96
+ options["protocol.mandatorycharset"]
97
+ end
98
+
99
+ def mandatorycharset=(mandatorycharset)
100
+ options["protocol.mandatorycharset"] = mandatorycharset
101
+ end
102
+
103
+ def wiredump_file_base
104
+ options["protocol.wiredump_file_base"]
105
+ end
106
+
107
+ def wiredump_file_base=(wiredump_file_base)
108
+ options["protocol.wiredump_file_base"] = wiredump_file_base
109
+ end
110
+
111
+ def initialize(endpoint_url, namespace = nil, soapaction = nil)
112
+ @namespace = namespace
113
+ @soapaction = soapaction
114
+ @options = setup_options
115
+ @wiredump_file_base = nil
116
+ @proxy = Proxy.new(endpoint_url, @soapaction, @options)
117
+ end
118
+
119
+ def loadproperty(propertyname)
120
+ unless options.loadproperty(propertyname)
121
+ raise LoadError.new("No such property to load -- #{propertyname}")
122
+ end
123
+ end
124
+
125
+ def add_rpc_method(name, *params)
126
+ add_rpc_method_with_soapaction_as(name, name, @soapaction, *params)
127
+ end
128
+
129
+ def add_rpc_method_as(name, name_as, *params)
130
+ add_rpc_method_with_soapaction_as(name, name_as, @soapaction, *params)
131
+ end
132
+
133
+ def add_rpc_method_with_soapaction(name, soapaction, *params)
134
+ add_rpc_method_with_soapaction_as(name, name, soapaction, *params)
135
+ end
136
+
137
+ def add_rpc_method_with_soapaction_as(name, name_as, soapaction, *params)
138
+ param_def = SOAPMethod.create_rpc_param_def(params)
139
+ qname = XSD::QName.new(@namespace, name_as)
140
+ @proxy.add_rpc_method(qname, soapaction, name, param_def)
141
+ add_rpc_method_interface(name, param_def)
142
+ end
143
+
144
+ # add_method is for shortcut of typical rpc/encoded method definition.
145
+ alias add_method add_rpc_method
146
+ alias add_method_as add_rpc_method_as
147
+ alias add_method_with_soapaction add_rpc_method_with_soapaction
148
+ alias add_method_with_soapaction_as add_rpc_method_with_soapaction_as
149
+
150
+ def add_document_method(name, soapaction, req_qname, res_qname)
151
+ param_def = SOAPMethod.create_doc_param_def(req_qname, res_qname)
152
+ @proxy.add_document_method(soapaction, name, param_def)
153
+ add_document_method_interface(name, param_def)
154
+ end
155
+
156
+ def add_rpc_operation(qname, soapaction, name, param_def, opt = {})
157
+ @proxy.add_rpc_operation(qname, soapaction, name, param_def, opt)
158
+ add_rpc_method_interface(name, param_def)
159
+ end
160
+
161
+ def add_document_operation(soapaction, name, param_def, opt = {})
162
+ @proxy.add_document_operation(soapaction, name, param_def, opt)
163
+ add_document_method_interface(name, param_def)
164
+ end
165
+
166
+ def invoke(headers, body)
167
+ if headers and !headers.is_a?(SOAPHeader)
168
+ headers = create_header(headers)
169
+ end
170
+ set_wiredump_file_base(body.elename.name)
171
+ env = @proxy.invoke(headers, body)
172
+ if env.nil?
173
+ return nil, nil
174
+ else
175
+ return env.header, env.body
176
+ end
177
+ end
178
+
179
+ def call(name, *params)
180
+ set_wiredump_file_base(name)
181
+ @proxy.call(name, *params)
182
+ end
183
+
184
+ private
185
+
186
+ def set_wiredump_file_base(name)
187
+ if @wiredump_file_base
188
+ @proxy.set_wiredump_file_base("#{@wiredump_file_base}_#{name}")
189
+ end
190
+ end
191
+
192
+ def create_header(headers)
193
+ header = SOAPHeader.new()
194
+ headers.each do |content, mustunderstand, encodingstyle|
195
+ header.add(SOAPHeaderItem.new(content, mustunderstand, encodingstyle))
196
+ end
197
+ header
198
+ end
199
+
200
+ def setup_options
201
+ if opt = Property.loadproperty(::SOAP::PropertyName)
202
+ opt = opt["client"]
203
+ end
204
+ opt ||= Property.new
205
+ opt.add_hook("protocol.mandatorycharset") do |key, value|
206
+ @proxy.mandatorycharset = value
207
+ end
208
+ opt.add_hook("protocol.wiredump_file_base") do |key, value|
209
+ @wiredump_file_base = value
210
+ end
211
+ opt["protocol.http.charset"] ||= XSD::Charset.xml_encoding_label
212
+ opt["protocol.http.proxy"] ||= Env::HTTP_PROXY
213
+ opt["protocol.http.no_proxy"] ||= Env::NO_PROXY
214
+ opt
215
+ end
216
+
217
+ def add_rpc_method_interface(name, param_def)
218
+ param_count = RPC::SOAPMethod.param_count(param_def,
219
+ RPC::SOAPMethod::IN, RPC::SOAPMethod::INOUT)
220
+ add_method_interface(name, param_count)
221
+ end
222
+
223
+ def add_document_method_interface(name, param_def)
224
+ param_count = RPC::SOAPMethod.param_count(param_def, RPC::SOAPMethod::IN)
225
+ add_method_interface(name, param_count)
226
+ end
227
+
228
+ # Mapping.define_singleton_method calls define_method with proc and it
229
+ # exhausts much memory for each singleton Object. just instance_eval instead
230
+ # of it.
231
+ def add_method_interface(name, param_count)
232
+ instance_eval <<-EOS
233
+ def #{name}(*arg)
234
+ unless arg.size == #{param_count}
235
+ raise ArgumentError.new(
236
+ "wrong number of arguments (\#{arg.size} for #{param_count})")
237
+ end
238
+ call(#{name.dump}, *arg)
239
+ end
240
+ EOS
241
+ self.method(name)
242
+ end
243
+ end
244
+
245
+
246
+ end
247
+ end
@@ -0,0 +1,369 @@
1
+ # SOAP4R - RPC element definition.
2
+ # Copyright (C) 2000-2007 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 'soap/baseData'
10
+
11
+
12
+ module SOAP
13
+
14
+ # Add method definitions for RPC to common definition in element.rb
15
+ class SOAPBody < SOAPStruct
16
+ public
17
+
18
+ def request
19
+ root_node
20
+ end
21
+
22
+ def response
23
+ root = root_node
24
+ if !@is_fault
25
+ if root.nil?
26
+ nil
27
+ elsif root.is_a?(SOAPBasetype)
28
+ root
29
+ else
30
+ # Initial element is [retval].
31
+ root[0]
32
+ end
33
+ else
34
+ root
35
+ end
36
+ end
37
+
38
+ def outparams
39
+ root = root_node
40
+ if !@is_fault and !root.nil? and !root.is_a?(SOAPBasetype)
41
+ op = root[1..-1]
42
+ op = nil if op && op.empty?
43
+ op
44
+ else
45
+ nil
46
+ end
47
+ end
48
+
49
+ def fault
50
+ if @is_fault
51
+ self['fault']
52
+ else
53
+ nil
54
+ end
55
+ end
56
+
57
+ def fault=(fault)
58
+ @is_fault = true
59
+ add('fault', fault)
60
+ end
61
+ end
62
+
63
+
64
+ module RPC
65
+
66
+
67
+ class RPCError < Error; end
68
+ class MethodDefinitionError < RPCError; end
69
+ class ParameterError < RPCError; end
70
+
71
+ class SOAPMethod < SOAPStruct
72
+ RETVAL = 'retval'
73
+ IN = 'in'
74
+ OUT = 'out'
75
+ INOUT = 'inout'
76
+
77
+ attr_reader :param_def
78
+ attr_reader :inparam
79
+ attr_reader :outparam
80
+ attr_reader :retval_name
81
+ attr_reader :retval_class_name
82
+
83
+ def initialize(qname, param_def = nil)
84
+ super(nil)
85
+ @elename = qname
86
+ @encodingstyle = nil
87
+
88
+ @param_def = param_def
89
+
90
+ @signature = []
91
+ @inparam_names = []
92
+ @inoutparam_names = []
93
+ @outparam_names = []
94
+
95
+ @inparam = {}
96
+ @outparam = {}
97
+ @retval_name = nil
98
+ @retval_class_name = nil
99
+
100
+ init_param(@param_def) if @param_def
101
+ end
102
+
103
+ def have_member
104
+ true
105
+ end
106
+
107
+ def have_outparam?
108
+ @outparam_names.size > 0
109
+ end
110
+
111
+ def input_params
112
+ collect_params(IN, INOUT)
113
+ end
114
+
115
+ def output_params
116
+ collect_params(OUT, INOUT)
117
+ end
118
+
119
+ def input_param_types
120
+ collect_param_types(IN, INOUT)
121
+ end
122
+
123
+ def output_param_types
124
+ collect_param_types(OUT, INOUT)
125
+ end
126
+
127
+ def set_param(params)
128
+ params.each do |param, data|
129
+ @inparam[param] = data
130
+ data.elename = XSD::QName.new(data.elename.namespace, param)
131
+ data.parent = self
132
+ end
133
+ end
134
+
135
+ def set_outparam(params)
136
+ params.each do |param, data|
137
+ @outparam[param] = data
138
+ data.elename = XSD::QName.new(data.elename.namespace, param)
139
+ end
140
+ end
141
+
142
+ def get_paramtypes(names)
143
+ types = []
144
+ @signature.each do |io_type, name, type_qname|
145
+ if type_qname && idx = names.index(name)
146
+ types[idx] = type_qname
147
+ end
148
+ end
149
+ types
150
+ end
151
+
152
+ def SOAPMethod.param_count(param_def, *type)
153
+ count = 0
154
+ param_def.each do |io_type, name, param_type|
155
+ if type.include?(io_type)
156
+ count += 1
157
+ end
158
+ end
159
+ count
160
+ end
161
+
162
+ def SOAPMethod.derive_rpc_param_def(obj, name, *param)
163
+ if param.size == 1 and param[0].is_a?(Array)
164
+ return param[0]
165
+ end
166
+ if param.empty?
167
+ method = obj.method(name)
168
+ param_names = (1..method.arity.abs).collect { |i| "p#{i}" }
169
+ else
170
+ param_names = param
171
+ end
172
+ create_rpc_param_def(param_names)
173
+ end
174
+
175
+ def SOAPMethod.create_rpc_param_def(param_names)
176
+ param_def = []
177
+ param_names.each do |param_name|
178
+ param_def.push([IN, param_name, nil])
179
+ end
180
+ param_def.push([RETVAL, 'return', nil])
181
+ param_def
182
+ end
183
+
184
+ def SOAPMethod.create_doc_param_def(req_qnames, res_qnames)
185
+ req_qnames = [req_qnames] if req_qnames.is_a?(XSD::QName)
186
+ res_qnames = [res_qnames] if res_qnames.is_a?(XSD::QName)
187
+ param_def = []
188
+ # req_qnames and res_qnames can be nil
189
+ if req_qnames
190
+ req_qnames.each do |qname|
191
+ param_def << [IN, qname.name, [nil, qname.namespace, qname.name]]
192
+ end
193
+ end
194
+ if res_qnames
195
+ res_qnames.each do |qname|
196
+ param_def << [OUT, qname.name, [nil, qname.namespace, qname.name]]
197
+ end
198
+ end
199
+ param_def
200
+ end
201
+
202
+ private
203
+
204
+ def collect_param_types(*type)
205
+ names = []
206
+ @signature.each do |io_type, name, type_qname|
207
+ names << type_qname if type.include?(io_type)
208
+ end
209
+ names
210
+ end
211
+
212
+ def collect_params(*type)
213
+ names = []
214
+ @signature.each do |io_type, name, type_qname|
215
+ names << name if type.include?(io_type)
216
+ end
217
+ names
218
+ end
219
+
220
+ def init_param(param_def)
221
+ param_def.each do |io_type, name, param_type|
222
+ mapped_class, nsdef, namedef = SOAPMethod.parse_param_type(param_type)
223
+ if nsdef && namedef
224
+ type_qname = XSD::QName.new(nsdef, namedef)
225
+ elsif mapped_class
226
+ type_qname = TypeMap.index(mapped_class)
227
+ end
228
+ case io_type
229
+ when IN
230
+ @signature.push([IN, name, type_qname])
231
+ @inparam_names.push(name)
232
+ when OUT
233
+ @signature.push([OUT, name, type_qname])
234
+ @outparam_names.push(name)
235
+ when INOUT
236
+ @signature.push([INOUT, name, type_qname])
237
+ @inoutparam_names.push(name)
238
+ when RETVAL
239
+ if @retval_name
240
+ raise MethodDefinitionError.new('duplicated retval')
241
+ end
242
+ @retval_name = name
243
+ @retval_class_name = mapped_class
244
+ else
245
+ raise MethodDefinitionError.new("unknown type: #{io_type}")
246
+ end
247
+ end
248
+ end
249
+
250
+ def self.parse_param_type(param_type)
251
+ mapped_class, nsdef, namedef = param_type
252
+ # the first element of typedef in param_def can be a String like
253
+ # "::SOAP::SOAPStruct" or "CustomClass[]". turn this String to a class if
254
+ # we can.
255
+ if mapped_class.is_a?(String)
256
+ if /\[\]\Z/ =~ mapped_class
257
+ # when '[]' is added, ignore this.
258
+ mapped_class = nil
259
+ else
260
+ mapped_class = Mapping.class_from_name(mapped_class)
261
+ end
262
+ end
263
+ [mapped_class, nsdef, namedef]
264
+ end
265
+ end
266
+
267
+
268
+ class SOAPMethodRequest < SOAPMethod
269
+ attr_accessor :soapaction
270
+
271
+ def SOAPMethodRequest.create_request(qname, *params)
272
+ param_def = []
273
+ param_value = []
274
+ i = 0
275
+ params.each do |param|
276
+ param_name = "p#{i}"
277
+ i += 1
278
+ param_def << [IN, param_name, nil]
279
+ param_value << [param_name, param]
280
+ end
281
+ param_def << [RETVAL, 'return', nil]
282
+ o = new(qname, param_def)
283
+ o.set_param(param_value)
284
+ o
285
+ end
286
+
287
+ def initialize(qname, param_def = nil, soapaction = nil)
288
+ super(qname, param_def)
289
+ @soapaction = soapaction
290
+ end
291
+
292
+ def each
293
+ input_params.each do |name|
294
+ unless @inparam[name]
295
+ raise ParameterError.new("parameter: #{name} was not given")
296
+ end
297
+ yield(name, @inparam[name])
298
+ end
299
+ end
300
+
301
+ def dup
302
+ req = self.class.new(@elename.dup, @param_def, @soapaction)
303
+ req.encodingstyle = @encodingstyle
304
+ req
305
+ end
306
+
307
+ def create_method_response(response_name = nil)
308
+ response_name ||=
309
+ XSD::QName.new(@elename.namespace, @elename.name + 'Response')
310
+ SOAPMethodResponse.new(response_name, @param_def)
311
+ end
312
+ end
313
+
314
+
315
+ class SOAPMethodResponse < SOAPMethod
316
+
317
+ def initialize(qname, param_def = nil)
318
+ super(qname, param_def)
319
+ @retval = nil
320
+ end
321
+
322
+ def retval
323
+ @retval
324
+ end
325
+
326
+ def retval=(retval)
327
+ @retval = retval
328
+ @retval.elename = @retval.elename.dup_name(@retval_name || 'return')
329
+ retval.parent = self
330
+ retval
331
+ end
332
+
333
+ def each
334
+ if @retval_name and !@retval.is_a?(SOAPVoid)
335
+ yield(@retval_name, @retval)
336
+ end
337
+
338
+ output_params.each do |name|
339
+ unless @outparam[name]
340
+ raise ParameterError.new("parameter: #{name} was not given")
341
+ end
342
+ yield(name, @outparam[name])
343
+ end
344
+ end
345
+ end
346
+
347
+
348
+ # To return(?) void explicitly.
349
+ # def foo(input_var)
350
+ # ...
351
+ # return SOAP::RPC::SOAPVoid.new
352
+ # end
353
+ class SOAPVoid < XSD::XSDAnySimpleType
354
+ include SOAPBasetype
355
+ extend SOAPModuleUtils
356
+ Name = XSD::QName.new(Mapping::RubyCustomTypeNamespace, nil)
357
+
358
+ public
359
+ def initialize()
360
+ @elename = Name
361
+ @id = nil
362
+ @precedents = []
363
+ @parent = nil
364
+ end
365
+ end
366
+
367
+
368
+ end
369
+ end