soap2r 1.5.8

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