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,577 @@
1
+ # encoding: UTF-8
2
+ # SOAP4R - Ruby type mapping 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
+ require 'xsd/codegen/gensupport'
11
+ require 'soap/mapping/schemadefinition'
12
+
13
+
14
+ module SOAP
15
+
16
+
17
+ module Mapping
18
+ RubyTypeNamespace = 'http://www.ruby-lang.org/xmlns/ruby/type/1.6'
19
+ RubyTypeInstanceNamespace =
20
+ 'http://www.ruby-lang.org/xmlns/ruby/type-instance'
21
+ RubyCustomTypeNamespace = 'http://www.ruby-lang.org/xmlns/ruby/type/custom'
22
+ ApacheSOAPTypeNamespace = 'http://xml.apache.org/xml-soap'
23
+
24
+
25
+ module TraverseSupport
26
+ def mark_marshalled_obj(obj, soap_obj)
27
+ raise if obj.nil?
28
+ Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] = soap_obj
29
+ end
30
+
31
+ def mark_unmarshalled_obj(node, obj)
32
+ return if obj.nil?
33
+ # node.id is not Object#id but SOAPReference#id
34
+ Thread.current[:SOAPMapping][:MarshalKey][node.id] = obj
35
+ end
36
+ end
37
+
38
+
39
+ EMPTY_OPT = {}.freeze
40
+ def self.obj2soap(obj, registry = nil, type = nil, opt = EMPTY_OPT)
41
+ registry ||= Mapping::DefaultRegistry
42
+ soap_obj = nil
43
+ protect_mapping(opt) do
44
+ soap_obj = _obj2soap(obj, registry, type)
45
+ end
46
+ soap_obj
47
+ end
48
+
49
+ def self.objs2soap(objs, registry = nil, types = nil, opt = EMPTY_OPT)
50
+ registry ||= Mapping::DefaultRegistry
51
+ ary = []
52
+ protect_mapping(opt) do
53
+ 0.upto(objs.length - 1) do |idx|
54
+ type = types ? types[idx] : nil
55
+ soap = _obj2soap(objs[idx], registry, type)
56
+ ary << soap
57
+ end
58
+ end
59
+ ary
60
+ end
61
+
62
+ def self.soap2obj(node, registry = nil, klass = nil, opt = EMPTY_OPT)
63
+ registry ||= Mapping::DefaultRegistry
64
+ obj = nil
65
+ protect_mapping(opt) do
66
+ obj = _soap2obj(node, registry, klass)
67
+ end
68
+ obj
69
+ end
70
+
71
+ def self.ary2soap(ary, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
72
+ registry ||= Mapping::DefaultRegistry
73
+ type = XSD::QName.new(type_ns, typename)
74
+ soap_ary = SOAPArray.new(ValueArrayName, 1, type)
75
+ protect_mapping(opt) do
76
+ ary.each do |ele|
77
+ soap_ary.add(_obj2soap(ele, registry, type))
78
+ end
79
+ end
80
+ soap_ary
81
+ end
82
+
83
+ def self.ary2md(ary, rank, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
84
+ registry ||= Mapping::DefaultRegistry
85
+ type = XSD::QName.new(type_ns, typename)
86
+ md_ary = SOAPArray.new(ValueArrayName, rank, type)
87
+ protect_mapping(opt) do
88
+ add_md_ary(md_ary, ary, [], registry)
89
+ end
90
+ md_ary
91
+ end
92
+
93
+ def self.fault2exception(fault, registry = nil)
94
+ registry ||= Mapping::DefaultRegistry
95
+ detail = ""
96
+ if fault.detail
97
+ begin
98
+ fault.detail.type ||= XSD::QName::EMPTY
99
+ detail = soap2obj(fault.detail, registry) || ""
100
+ rescue MappingError
101
+ detail = fault.detail
102
+ end
103
+ end
104
+ if detail.is_a?(Mapping::SOAPException)
105
+ begin
106
+ e = detail.to_e
107
+ remote_backtrace = e.backtrace
108
+ e.set_backtrace(nil)
109
+ raise e # ruby sets current caller as local backtrace of e => e2.
110
+ rescue Exception => e
111
+ e.set_backtrace(remote_backtrace + e.backtrace[1..-1])
112
+ raise
113
+ end
114
+ else
115
+ fault.detail = detail
116
+ fault.set_backtrace(
117
+ if detail.is_a?(Array)
118
+ detail
119
+ else
120
+ [detail.to_s]
121
+ end
122
+ )
123
+ raise
124
+ end
125
+ end
126
+
127
+ def self._obj2soap(obj, registry, type = nil)
128
+ if obj.respond_to?(:to_xmlpart)
129
+ SOAPRawData.new(obj)
130
+ elsif defined?(::REXML) && defined?(::REXML::Element) && obj.is_a?(::REXML::Element)
131
+ SOAPRawData.new(SOAPREXMLElementWrap.new(obj))
132
+ elsif referent = Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] and
133
+ !Thread.current[:SOAPMapping][:NoReference]
134
+ SOAPReference.new(referent)
135
+ elsif registry
136
+ registry.obj2soap(obj, type)
137
+ else
138
+ raise MappingError.new("no mapping registry given")
139
+ end
140
+ end
141
+
142
+ def self._soap2obj(node, registry, klass = nil)
143
+ if node.nil?
144
+ return nil
145
+ elsif node.is_a?(SOAPReference)
146
+ target = node.__getobj__
147
+ # target.id is not Object#id but SOAPReference#id
148
+ if referent = Thread.current[:SOAPMapping][:MarshalKey][target.id] and
149
+ !Thread.current[:SOAPMapping][:NoReference]
150
+ return referent
151
+ else
152
+ return _soap2obj(target, registry, klass)
153
+ end
154
+ end
155
+ return registry.soap2obj(node, klass)
156
+ end
157
+
158
+ def self.create_empty_object(klass)
159
+ klass.allocate
160
+ end
161
+
162
+ # Allow only (Letter | '_') (Letter | Digit | '-' | '_')* here.
163
+ # Caution: '.' is not allowed here.
164
+ # To follow XML spec., it should be NCName.
165
+ # (denied chars) => .[0-F][0-F]
166
+ # ex. a.b => a.2eb
167
+ #
168
+ def self.name2elename(name)
169
+ name.to_s.gsub(/([^a-zA-Z0-9:_\-]+)/n) {
170
+ '.' << $1.unpack('H2' * $1.size).join('.')
171
+ }.gsub(/::/n, '..')
172
+ end
173
+
174
+ def self.elename2name(name)
175
+ name.gsub(/\.\./n, '::').gsub(/((?:\.[0-9a-fA-F]{2})+)/n) {
176
+ [$1.delete('.')].pack('H*')
177
+ }
178
+ end
179
+
180
+ def self.const_from_name(name, lenient = false)
181
+ const = ::Object
182
+ name.sub(/\A::/, '').split('::').each do |const_str|
183
+ if /\A[A-Z]/ =~ const_str
184
+ begin
185
+ if const.const_defined?(const_str)
186
+ const = const.const_get(const_str)
187
+ next
188
+ end
189
+ rescue NameError
190
+ end
191
+ end
192
+ if lenient
193
+ const_str = Mapping.safeconstname(const_str)
194
+ if const.const_defined?(const_str)
195
+ const = const.const_get(const_str)
196
+ next
197
+ end
198
+ end
199
+ return nil
200
+ end
201
+ const
202
+ end
203
+
204
+ def self.class_from_name(name, lenient = false)
205
+ unless lenient
206
+ const = const_from_name_nonlenient(name)
207
+ else
208
+ const = const_from_name(name, true)
209
+ end
210
+ if const.is_a?(::Class)
211
+ const
212
+ else
213
+ nil
214
+ end
215
+ end
216
+
217
+ def self.module_from_name(name, lenient = false)
218
+ unless lenient
219
+ const = const_from_name_nonlenient(name)
220
+ else
221
+ const = const_from_name(name, true)
222
+ end
223
+ if const.is_a?(::Module)
224
+ const
225
+ else
226
+ nil
227
+ end
228
+ end
229
+
230
+ def self.const_from_name_nonlenient(name)
231
+ if Thread.current[:SOAPMapping]
232
+ Thread.current[:SOAPMapping][:ConstFromName][name] ||=
233
+ const_from_name(name)
234
+ else
235
+ const_from_name(name)
236
+ end
237
+ end
238
+
239
+ def self.class2qname(klass)
240
+ name = schema_type_definition(klass)
241
+ namespace = schema_ns_definition(klass)
242
+ XSD::QName.new(namespace, name)
243
+ end
244
+
245
+ def self.class2element(klass)
246
+ name = schema_type_definition(klass) ||
247
+ Mapping.name2elename(klass.name)
248
+ namespace = schema_ns_definition(klass) || RubyCustomTypeNamespace
249
+ XSD::QName.new(namespace, name)
250
+ end
251
+
252
+ def self.obj2element(obj)
253
+ name = namespace = nil
254
+ if obj.instance_variable_defined?('@schema_type')
255
+ name = obj.instance_variable_get('@schema_type')
256
+ end
257
+ if obj.instance_variable_defined?('@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_ns
459
+ default_ns ||= schema_name.namespace if schema_name
460
+ default_ns ||= schema_type.namespace if schema_type
461
+ definition.elements = parse_schema_definition(schema_element, default_ns)
462
+ if klass < ::Array
463
+ definition.elements.set_array
464
+ end
465
+ end
466
+ end
467
+ definition
468
+ end
469
+
470
+ # returns SchemaComplexTypeDefinition
471
+ def self.parse_schema_definition(schema_element, default_ns)
472
+ definition = nil
473
+ if schema_element[0] == :choice
474
+ schema_element.shift
475
+ definition = SchemaChoiceDefinition.new
476
+ else
477
+ definition = SchemaSequenceDefinition.new
478
+ end
479
+ schema_element.each do |ele|
480
+ element_definition = parse_schema_element_definition(ele, default_ns)
481
+ definition << element_definition
482
+ end
483
+ definition
484
+ end
485
+
486
+ # returns SchemaElementDefinition
487
+ def self.parse_schema_element_definition(schema_element, default_ns)
488
+ if schema_element[0] == :choice
489
+ parse_schema_definition(schema_element, default_ns)
490
+ elsif schema_element[0].is_a?(Array)
491
+ parse_schema_definition(schema_element, default_ns)
492
+ else
493
+ varname, info, occurrence = schema_element
494
+ mapped_class_str, elename = info
495
+ if occurrence
496
+ minoccurs, maxoccurs = occurrence
497
+ else
498
+ minoccurs, maxoccurs = 1, 1
499
+ end
500
+ as_any = as_array = false
501
+ if /\[\]$/ =~ mapped_class_str
502
+ mapped_class_str = mapped_class_str.sub(/\[\]$/, '')
503
+ if mapped_class_str.empty?
504
+ mapped_class_str = nil
505
+ end
506
+ as_array = true
507
+ end
508
+ if mapped_class_str
509
+ mapped_class = Mapping.class_from_name(mapped_class_str)
510
+ if mapped_class.nil?
511
+ warn("cannot find mapped class: #{mapped_class_str}")
512
+ end
513
+ end
514
+ if elename == XSD::AnyTypeName
515
+ as_any = true
516
+ elsif elename.nil?
517
+ elename = XSD::QName.new(default_ns, varname)
518
+ end
519
+ SchemaElementDefinition.new(
520
+ varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array)
521
+ end
522
+ end
523
+
524
+ class << Mapping
525
+ public
526
+
527
+ def protect_threadvars(*symbols)
528
+ backup = {}
529
+ begin
530
+ symbols.each do |sym|
531
+ backup[sym] = Thread.current[sym]
532
+ end
533
+ yield
534
+ ensure
535
+ symbols.each do |sym|
536
+ Thread.current[sym] = backup[sym]
537
+ end
538
+ end
539
+ end
540
+
541
+ private
542
+
543
+ def class_schema_variable(sym, klass)
544
+ var = "@@#{sym}"
545
+ klass.class_variable_defined?(var) ? klass.class_eval(var) : nil
546
+ end
547
+
548
+ def protect_mapping(opt)
549
+ protect_threadvars(:SOAPMapping) do
550
+ data = Thread.current[:SOAPMapping] = {}
551
+ data[:MarshalKey] = {}
552
+ data[:ExternalCES] = opt[:external_ces] || XSD::Charset.encoding
553
+ data[:NoReference] = opt[:no_reference]
554
+ data[:RootTypeHint] = opt[:root_type_hint]
555
+ data[:SchemaDefinition] = {}
556
+ data[:SafeConstName] = {}
557
+ data[:SafeMethodName] = {}
558
+ data[:SafeVarName] = {}
559
+ data[:ConstFromName] = {}
560
+ yield
561
+ end
562
+ end
563
+
564
+ def add_md_ary(md_ary, ary, indices, registry)
565
+ for idx in 0..(ary.size - 1)
566
+ if ary[idx].is_a?(Array)
567
+ add_md_ary(md_ary, ary[idx], indices + [idx], registry)
568
+ else
569
+ md_ary[*(indices + [idx])] = _obj2soap(ary[idx], registry)
570
+ end
571
+ end
572
+ end
573
+ end
574
+ end
575
+
576
+
577
+ end