soap2r 1.5.8

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 (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,576 @@
1
+ # SOAP4R - Ruby type mapping utility.
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 'xsd/codegen/gensupport'
10
+ require 'soap/mapping/schemadefinition'
11
+
12
+
13
+ module SOAP
14
+
15
+
16
+ module Mapping
17
+ RubyTypeNamespace = 'http://www.ruby-lang.org/xmlns/ruby/type/1.6'
18
+ RubyTypeInstanceNamespace =
19
+ 'http://www.ruby-lang.org/xmlns/ruby/type-instance'
20
+ RubyCustomTypeNamespace = 'http://www.ruby-lang.org/xmlns/ruby/type/custom'
21
+ ApacheSOAPTypeNamespace = 'http://xml.apache.org/xml-soap'
22
+
23
+
24
+ module TraverseSupport
25
+ def mark_marshalled_obj(obj, soap_obj)
26
+ raise if obj.nil?
27
+ Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] = soap_obj
28
+ end
29
+
30
+ def mark_unmarshalled_obj(node, obj)
31
+ return if obj.nil?
32
+ # node.id is not Object#id but SOAPReference#id
33
+ Thread.current[:SOAPMapping][:MarshalKey][node.id] = obj
34
+ end
35
+ end
36
+
37
+
38
+ EMPTY_OPT = {}.freeze
39
+ def self.obj2soap(obj, registry = nil, type = nil, opt = EMPTY_OPT)
40
+ registry ||= Mapping::DefaultRegistry
41
+ soap_obj = nil
42
+ protect_mapping(opt) do
43
+ soap_obj = _obj2soap(obj, registry, type)
44
+ end
45
+ soap_obj
46
+ end
47
+
48
+ def self.objs2soap(objs, registry = nil, types = nil, opt = EMPTY_OPT)
49
+ registry ||= Mapping::DefaultRegistry
50
+ ary = []
51
+ protect_mapping(opt) do
52
+ 0.upto(objs.length - 1) do |idx|
53
+ type = types ? types[idx] : nil
54
+ soap = _obj2soap(objs[idx], registry, type)
55
+ ary << soap
56
+ end
57
+ end
58
+ ary
59
+ end
60
+
61
+ def self.soap2obj(node, registry = nil, klass = nil, opt = EMPTY_OPT)
62
+ registry ||= Mapping::DefaultRegistry
63
+ obj = nil
64
+ protect_mapping(opt) do
65
+ obj = _soap2obj(node, registry, klass)
66
+ end
67
+ obj
68
+ end
69
+
70
+ def self.ary2soap(ary, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
71
+ registry ||= Mapping::DefaultRegistry
72
+ type = XSD::QName.new(type_ns, typename)
73
+ soap_ary = SOAPArray.new(ValueArrayName, 1, type)
74
+ protect_mapping(opt) do
75
+ ary.each do |ele|
76
+ soap_ary.add(_obj2soap(ele, registry, type))
77
+ end
78
+ end
79
+ soap_ary
80
+ end
81
+
82
+ def self.ary2md(ary, rank, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
83
+ registry ||= Mapping::DefaultRegistry
84
+ type = XSD::QName.new(type_ns, typename)
85
+ md_ary = SOAPArray.new(ValueArrayName, rank, type)
86
+ protect_mapping(opt) do
87
+ add_md_ary(md_ary, ary, [], registry)
88
+ end
89
+ md_ary
90
+ end
91
+
92
+ def self.fault2exception(fault, registry = nil)
93
+ registry ||= Mapping::DefaultRegistry
94
+ detail = ""
95
+ if fault.detail
96
+ begin
97
+ fault.detail.type ||= XSD::QName::EMPTY
98
+ detail = soap2obj(fault.detail, registry) || ""
99
+ rescue MappingError
100
+ detail = fault.detail
101
+ end
102
+ end
103
+ if detail.is_a?(Mapping::SOAPException)
104
+ begin
105
+ e = detail.to_e
106
+ remote_backtrace = e.backtrace
107
+ e.set_backtrace(nil)
108
+ raise e # ruby sets current caller as local backtrace of e => e2.
109
+ rescue Exception => e
110
+ e.set_backtrace(remote_backtrace + e.backtrace[1..-1])
111
+ raise
112
+ end
113
+ else
114
+ fault.detail = detail
115
+ fault.set_backtrace(
116
+ if detail.is_a?(Array)
117
+ detail
118
+ else
119
+ [detail.to_s]
120
+ end
121
+ )
122
+ raise
123
+ end
124
+ end
125
+
126
+ def self._obj2soap(obj, registry, type = nil)
127
+ if obj.respond_to?(:to_xmlpart)
128
+ SOAPRawData.new(obj)
129
+ elsif defined?(::REXML) and obj.is_a?(::REXML::Element)
130
+ SOAPRawData.new(SOAPREXMLElementWrap.new(obj))
131
+ elsif referent = Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] and
132
+ !Thread.current[:SOAPMapping][:NoReference]
133
+ SOAPReference.new(referent)
134
+ elsif registry
135
+ registry.obj2soap(obj, type)
136
+ else
137
+ raise MappingError.new("no mapping registry given")
138
+ end
139
+ end
140
+
141
+ def self._soap2obj(node, registry, klass = nil)
142
+ if node.nil?
143
+ return nil
144
+ elsif node.is_a?(SOAPReference)
145
+ target = node.__getobj__
146
+ # target.id is not Object#id but SOAPReference#id
147
+ if referent = Thread.current[:SOAPMapping][:MarshalKey][target.id] and
148
+ !Thread.current[:SOAPMapping][:NoReference]
149
+ return referent
150
+ else
151
+ return _soap2obj(target, registry, klass)
152
+ end
153
+ end
154
+ return registry.soap2obj(node, klass)
155
+ end
156
+
157
+ def self.create_empty_object(klass)
158
+ klass.allocate
159
+ end
160
+
161
+ # Allow only (Letter | '_') (Letter | Digit | '-' | '_')* here.
162
+ # Caution: '.' is not allowed here.
163
+ # To follow XML spec., it should be NCName.
164
+ # (denied chars) => .[0-F][0-F]
165
+ # ex. a.b => a.2eb
166
+ #
167
+ def self.name2elename(name)
168
+ name.gsub(/([^a-zA-Z0-9:_\-]+)/n) {
169
+ '.' << $1.unpack('H2' * $1.size).join('.')
170
+ }.gsub(/::/n, '..')
171
+ end
172
+
173
+ def self.elename2name(name)
174
+ name.gsub(/\.\./n, '::').gsub(/((?:\.[0-9a-fA-F]{2})+)/n) {
175
+ [$1.delete('.')].pack('H*')
176
+ }
177
+ end
178
+
179
+ def self.const_from_name(name, lenient = false)
180
+ const = ::Object
181
+ name.sub(/\A::/, '').split('::').each do |const_str|
182
+ if /\A[A-Z]/ =~ const_str
183
+ begin
184
+ if const.const_defined?(const_str)
185
+ const = const.const_get(const_str)
186
+ next
187
+ end
188
+ rescue NameError
189
+ end
190
+ end
191
+ if lenient
192
+ const_str = Mapping.safeconstname(const_str)
193
+ if const.const_defined?(const_str)
194
+ const = const.const_get(const_str)
195
+ next
196
+ end
197
+ end
198
+ return nil
199
+ end
200
+ const
201
+ end
202
+
203
+ def self.class_from_name(name, lenient = false)
204
+ unless lenient
205
+ const = const_from_name_nonlenient(name)
206
+ else
207
+ const = const_from_name(name, true)
208
+ end
209
+ if const.is_a?(::Class)
210
+ const
211
+ else
212
+ nil
213
+ end
214
+ end
215
+
216
+ def self.module_from_name(name, lenient = false)
217
+ unless lenient
218
+ const = const_from_name_nonlenient(name)
219
+ else
220
+ const = const_from_name(name, true)
221
+ end
222
+ if const.is_a?(::Module)
223
+ const
224
+ else
225
+ nil
226
+ end
227
+ end
228
+
229
+ def self.const_from_name_nonlenient(name)
230
+ if Thread.current[:SOAPMapping]
231
+ Thread.current[:SOAPMapping][:ConstFromName][name] ||=
232
+ const_from_name(name)
233
+ else
234
+ const_from_name(name)
235
+ end
236
+ end
237
+
238
+ def self.class2qname(klass)
239
+ name = schema_type_definition(klass)
240
+ namespace = schema_ns_definition(klass)
241
+ XSD::QName.new(namespace, name)
242
+ end
243
+
244
+ def self.class2element(klass)
245
+ name = schema_type_definition(klass) ||
246
+ Mapping.name2elename(klass.name)
247
+ namespace = schema_ns_definition(klass) || RubyCustomTypeNamespace
248
+ XSD::QName.new(namespace, name)
249
+ end
250
+
251
+ def self.obj2element(obj)
252
+ name = namespace = nil
253
+ ivars = obj.instance_variables
254
+ if ivars.include?('@schema_type')
255
+ name = obj.instance_variable_get('@schema_type')
256
+ end
257
+ if ivars.include?('@schema_ns')
258
+ namespace = obj.instance_variable_get('@schema_ns')
259
+ end
260
+ if !name or !namespace
261
+ class2qname(obj.class)
262
+ else
263
+ XSD::QName.new(namespace, name)
264
+ end
265
+ end
266
+
267
+ def self.to_qname(obj, ns = nil)
268
+ if obj.is_a?(XSD::QName)
269
+ obj
270
+ else
271
+ XSD::QName.new(ns, obj)
272
+ end
273
+ end
274
+
275
+ def self.define_singleton_method(obj, name, &block)
276
+ sclass = (class << obj; self; end)
277
+ sclass.class_eval {
278
+ define_method(name, &block)
279
+ }
280
+ end
281
+
282
+ def self.get_attributes(obj)
283
+ if obj.is_a?(::Hash)
284
+ obj
285
+ else
286
+ rs = {}
287
+ obj.instance_variables.each do |ele|
288
+ rs[ele.sub(/^@/, '')] = obj.instance_variable_get(ele)
289
+ end
290
+ rs
291
+ end
292
+ end
293
+
294
+ EMPTY_ATTRIBUTES = {}.freeze
295
+ def self.get_attributes_for_any(obj)
296
+ if obj.respond_to?(:__xmlele_any)
297
+ obj.__xmlele_any || EMPTY_ATTRIBUTES
298
+ else
299
+ get_attributes(obj)
300
+ end
301
+ end
302
+
303
+ def self.get_attribute(obj, attr_name)
304
+ case obj
305
+ when ::SOAP::Mapping::Object
306
+ return obj[attr_name]
307
+ when ::Hash
308
+ return obj[attr_name] || obj[attr_name.intern]
309
+ else
310
+ if obj.respond_to?(attr_name)
311
+ return obj.__send__(attr_name)
312
+ end
313
+ iv = obj.instance_variables
314
+ name = Mapping.safevarname(attr_name)
315
+ if iv.include?("@#{name}")
316
+ return obj.instance_variable_get("@#{name}")
317
+ elsif iv.include?("@#{attr_name}")
318
+ return obj.instance_variable_get("@#{attr_name}")
319
+ end
320
+ if obj.respond_to?(name)
321
+ return obj.__send__(name)
322
+ end
323
+ nil
324
+ end
325
+ end
326
+
327
+ def self.set_attributes(obj, values)
328
+ case obj
329
+ when ::SOAP::Mapping::Object
330
+ values.each do |attr_name, value|
331
+ obj.__add_xmlele_value(attr_name, value)
332
+ end
333
+ else
334
+ values.each do |attr_name, value|
335
+ # untaint depends GenSupport.safevarname
336
+ name = Mapping.safevarname(attr_name).untaint
337
+ setter = name + "="
338
+ if obj.respond_to?(setter)
339
+ obj.__send__(setter, value)
340
+ else
341
+ obj.instance_variable_set('@' + name, value)
342
+ begin
343
+ unless obj.respond_to?(name)
344
+ obj.instance_eval <<-EOS
345
+ def #{name}
346
+ @#{name}
347
+ end
348
+ EOS
349
+ end
350
+ unless self.respond_to?(name + "=")
351
+ obj.instance_eval <<-EOS
352
+ def #{name}=(value)
353
+ @#{name} = value
354
+ end
355
+ EOS
356
+ end
357
+ rescue TypeError
358
+ # singleton class may not exist (e.g. Float)
359
+ end
360
+ end
361
+ end
362
+ end
363
+ end
364
+
365
+ def self.safeconstname(name)
366
+ Thread.current[:SOAPMapping][:SafeConstName][name] ||=
367
+ XSD::CodeGen::GenSupport.safeconstname(name)
368
+ end
369
+
370
+ def self.safemethodname(name)
371
+ Thread.current[:SOAPMapping][:SafeMethodName][name] ||=
372
+ XSD::CodeGen::GenSupport.safemethodname(name)
373
+ end
374
+
375
+ def self.safevarname(name)
376
+ Thread.current[:SOAPMapping][:SafeVarName][name] ||=
377
+ XSD::CodeGen::GenSupport.safevarname(name)
378
+ end
379
+
380
+ def self.root_type_hint
381
+ Thread.current[:SOAPMapping][:RootTypeHint]
382
+ end
383
+
384
+ def self.reset_root_type_hint
385
+ Thread.current[:SOAPMapping][:RootTypeHint] = false
386
+ end
387
+
388
+ def self.external_ces
389
+ Thread.current[:SOAPMapping][:ExternalCES]
390
+ end
391
+
392
+ def self.schema_ns_definition(klass)
393
+ class_schema_variable(:schema_ns, klass)
394
+ end
395
+
396
+ def self.schema_name_definition(klass)
397
+ class_schema_variable(:schema_name, klass)
398
+ end
399
+
400
+ def self.schema_type_definition(klass)
401
+ class_schema_variable(:schema_type, klass)
402
+ end
403
+
404
+ def self.schema_qualified_definition(klass)
405
+ class_schema_variable(:schema_qualified, klass)
406
+ end
407
+
408
+ def self.schema_element_definition(klass)
409
+ class_schema_variable(:schema_element, klass)
410
+ end
411
+
412
+ def self.schema_attribute_definition(klass)
413
+ class_schema_variable(:schema_attribute, klass)
414
+ end
415
+
416
+ def self.schema_definition_classdef(klass)
417
+ if Thread.current[:SOAPMapping][:SchemaDefinition].key?(klass)
418
+ return Thread.current[:SOAPMapping][:SchemaDefinition][klass]
419
+ end
420
+ schema_ns = schema_ns_definition(klass)
421
+ schema_name = schema_name_definition(klass)
422
+ schema_type = schema_type_definition(klass)
423
+ qualified = schema_qualified_definition(klass)
424
+ elements = schema_element_definition(klass)
425
+ attributes = schema_attribute_definition(klass)
426
+ return nil if schema_name.nil? and schema_type.nil?
427
+ schema_name = Mapping.to_qname(schema_name, schema_ns) if schema_name
428
+ schema_type = Mapping.to_qname(schema_type, schema_ns) if schema_type
429
+ definition = create_schema_definition(klass,
430
+ :schema_name => schema_name,
431
+ :schema_type => schema_type,
432
+ :is_anonymous => false,
433
+ :schema_qualified => qualified,
434
+ :schema_element => elements,
435
+ :schema_attribute => attributes
436
+ )
437
+ Thread.current[:SOAPMapping][:SchemaDefinition][klass] = definition
438
+ definition
439
+ end
440
+
441
+ def self.create_schema_definition(klass, definition)
442
+ schema_ns = definition[:schema_ns]
443
+ schema_name = definition[:schema_name]
444
+ schema_type = definition[:schema_type]
445
+ is_anonymous = definition[:is_anonymous]
446
+ schema_basetype = definition[:schema_basetype]
447
+ schema_qualified = definition[:schema_qualified]
448
+ schema_element = definition[:schema_element]
449
+ schema_attributes = definition[:schema_attribute]
450
+ definition = SchemaDefinition.new(klass, schema_name, schema_type, is_anonymous, schema_qualified)
451
+ definition.basetype = schema_basetype
452
+ definition.attributes = schema_attributes
453
+ if schema_element
454
+ if schema_element.respond_to?(:is_concrete_definition) and
455
+ schema_element.is_concrete_definition
456
+ definition.elements = schema_element
457
+ else
458
+ default_ns = schema_name.namespace if schema_name
459
+ default_ns ||= schema_type.namespace if schema_type
460
+ definition.elements = parse_schema_definition(schema_element, default_ns)
461
+ if klass < ::Array
462
+ definition.elements.set_array
463
+ end
464
+ end
465
+ end
466
+ definition
467
+ end
468
+
469
+ # returns SchemaComplexTypeDefinition
470
+ def self.parse_schema_definition(schema_element, default_ns)
471
+ definition = nil
472
+ if schema_element[0] == :choice
473
+ schema_element.shift
474
+ definition = SchemaChoiceDefinition.new
475
+ else
476
+ definition = SchemaSequenceDefinition.new
477
+ end
478
+ schema_element.each do |ele|
479
+ element_definition = parse_schema_element_definition(ele, default_ns)
480
+ definition << element_definition
481
+ end
482
+ definition
483
+ end
484
+
485
+ # returns SchemaElementDefinition
486
+ def self.parse_schema_element_definition(schema_element, default_ns)
487
+ if schema_element[0] == :choice
488
+ parse_schema_definition(schema_element, default_ns)
489
+ elsif schema_element[0].is_a?(Array)
490
+ parse_schema_definition(schema_element, default_ns)
491
+ else
492
+ varname, info, occurrence = schema_element
493
+ mapped_class_str, elename = info
494
+ if occurrence
495
+ minoccurs, maxoccurs = occurrence
496
+ else
497
+ minoccurs, maxoccurs = 1, 1
498
+ end
499
+ as_any = as_array = false
500
+ if /\[\]$/ =~ mapped_class_str
501
+ mapped_class_str = mapped_class_str.sub(/\[\]$/, '')
502
+ if mapped_class_str.empty?
503
+ mapped_class_str = nil
504
+ end
505
+ as_array = true
506
+ end
507
+ if mapped_class_str
508
+ mapped_class = Mapping.class_from_name(mapped_class_str)
509
+ if mapped_class.nil?
510
+ warn("cannot find mapped class: #{mapped_class_str}")
511
+ end
512
+ end
513
+ if elename == XSD::AnyTypeName
514
+ as_any = true
515
+ elsif elename.nil?
516
+ elename = XSD::QName.new(default_ns, varname)
517
+ end
518
+ SchemaElementDefinition.new(
519
+ varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array)
520
+ end
521
+ end
522
+
523
+ class << Mapping
524
+ public
525
+
526
+ def protect_threadvars(*symbols)
527
+ backup = {}
528
+ begin
529
+ symbols.each do |sym|
530
+ backup[sym] = Thread.current[sym]
531
+ end
532
+ yield
533
+ ensure
534
+ symbols.each do |sym|
535
+ Thread.current[sym] = backup[sym]
536
+ end
537
+ end
538
+ end
539
+
540
+ private
541
+
542
+ def class_schema_variable(sym, klass)
543
+ var = "@@#{sym}"
544
+ klass.class_variables.include?(var) ? klass.class_eval(var) : nil
545
+ end
546
+
547
+ def protect_mapping(opt)
548
+ protect_threadvars(:SOAPMapping) do
549
+ data = Thread.current[:SOAPMapping] = {}
550
+ data[:MarshalKey] = {}
551
+ data[:ExternalCES] = opt[:external_ces] || XSD::Charset.encoding
552
+ data[:NoReference] = opt[:no_reference]
553
+ data[:RootTypeHint] = opt[:root_type_hint]
554
+ data[:SchemaDefinition] = {}
555
+ data[:SafeConstName] = {}
556
+ data[:SafeMethodName] = {}
557
+ data[:SafeVarName] = {}
558
+ data[:ConstFromName] = {}
559
+ yield
560
+ end
561
+ end
562
+
563
+ def add_md_ary(md_ary, ary, indices, registry)
564
+ for idx in 0..(ary.size - 1)
565
+ if ary[idx].is_a?(Array)
566
+ add_md_ary(md_ary, ary[idx], indices + [idx], registry)
567
+ else
568
+ md_ary[*(indices + [idx])] = _obj2soap(ary[idx], registry)
569
+ end
570
+ end
571
+ end
572
+ end
573
+ end
574
+
575
+
576
+ end