soap4r 1.5.7 → 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 (199) hide show
  1. data/bin/wsdl2ruby.rb +8 -2
  2. data/lib/soap/baseData.rb +93 -43
  3. data/lib/soap/element.rb +11 -8
  4. data/lib/soap/encodingstyle/handler.rb +15 -4
  5. data/lib/soap/encodingstyle/literalHandler.rb +18 -24
  6. data/lib/soap/encodingstyle/soapHandler.rb +34 -77
  7. data/lib/soap/generator.rb +74 -48
  8. data/lib/soap/header/handler.rb +1 -1
  9. data/lib/soap/header/mappinghandler.rb +47 -0
  10. data/lib/soap/mapping/encodedregistry.rb +19 -13
  11. data/lib/soap/mapping/factory.rb +19 -3
  12. data/lib/soap/mapping/literalregistry.rb +47 -35
  13. data/lib/soap/mapping/mapping.rb +92 -24
  14. data/lib/soap/mapping/registry.rb +34 -18
  15. data/lib/soap/mapping/schemadefinition.rb +8 -1
  16. data/lib/soap/mapping/typeMap.rb +18 -0
  17. data/lib/soap/mapping/wsdlencodedregistry.rb +8 -50
  18. data/lib/soap/mapping/wsdlliteralregistry.rb +45 -39
  19. data/lib/soap/nestedexception.rb +42 -0
  20. data/lib/soap/netHttpClient.rb +1 -0
  21. data/lib/soap/ns.rb +34 -0
  22. data/lib/soap/parser.rb +32 -29
  23. data/lib/soap/processor.rb +1 -1
  24. data/lib/soap/rpc/driver.rb +1 -0
  25. data/lib/soap/rpc/element.rb +18 -6
  26. data/lib/soap/rpc/httpserver.rb +38 -24
  27. data/lib/soap/rpc/proxy.rb +14 -11
  28. data/lib/soap/rpc/router.rb +4 -1
  29. data/lib/soap/soap.rb +7 -6
  30. data/lib/soap/wsdlDriver.rb +29 -8
  31. data/lib/tags +5690 -0
  32. data/lib/wsdl/definitions.rb +26 -40
  33. data/lib/wsdl/info.rb +11 -0
  34. data/lib/wsdl/parser.rb +2 -2
  35. data/lib/wsdl/soap/cgiStubCreator.rb +10 -5
  36. data/lib/wsdl/soap/classDefCreator.rb +140 -113
  37. data/lib/wsdl/soap/classDefCreatorSupport.rb +94 -12
  38. data/lib/wsdl/soap/classNameCreator.rb +54 -0
  39. data/lib/wsdl/soap/clientSkeltonCreator.rb +6 -5
  40. data/lib/wsdl/soap/complexType.rb +10 -1
  41. data/lib/wsdl/soap/definitions.rb +4 -0
  42. data/lib/wsdl/soap/driverCreator.rb +14 -6
  43. data/lib/wsdl/soap/element.rb +4 -0
  44. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +11 -55
  45. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +28 -126
  46. data/lib/wsdl/soap/mappingRegistryCreator.rb +9 -3
  47. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +209 -94
  48. data/lib/wsdl/soap/methodDefCreator.rb +12 -16
  49. data/lib/wsdl/soap/servantSkeltonCreator.rb +3 -2
  50. data/lib/wsdl/soap/servletStubCreator.rb +107 -0
  51. data/lib/wsdl/soap/standaloneServerStubCreator.rb +10 -5
  52. data/lib/wsdl/soap/wsdl2ruby.rb +28 -13
  53. data/lib/wsdl/wsdl.rb +2 -1
  54. data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
  55. data/lib/wsdl/xmlSchema/attributeGroup.rb +86 -0
  56. data/lib/wsdl/xmlSchema/choice.rb +4 -1
  57. data/lib/wsdl/xmlSchema/complexContent.rb +1 -1
  58. data/lib/wsdl/xmlSchema/complexExtension.rb +9 -1
  59. data/lib/wsdl/xmlSchema/complexRestriction.rb +8 -0
  60. data/lib/wsdl/xmlSchema/complexType.rb +38 -5
  61. data/lib/wsdl/xmlSchema/data.rb +30 -7
  62. data/lib/wsdl/xmlSchema/element.rb +10 -2
  63. data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
  64. data/lib/wsdl/xmlSchema/group.rb +118 -0
  65. data/lib/wsdl/xmlSchema/import.rb +11 -23
  66. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  67. data/lib/wsdl/xmlSchema/include.rb +11 -17
  68. data/lib/wsdl/xmlSchema/length.rb +3 -1
  69. data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
  70. data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
  71. data/lib/wsdl/xmlSchema/maxlength.rb +3 -1
  72. data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
  73. data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
  74. data/lib/wsdl/xmlSchema/minlength.rb +3 -1
  75. data/lib/wsdl/xmlSchema/schema.rb +34 -0
  76. data/lib/wsdl/xmlSchema/sequence.rb +4 -1
  77. data/lib/wsdl/xmlSchema/simpleExtension.rb +8 -0
  78. data/lib/wsdl/xmlSchema/simpleRestriction.rb +49 -8
  79. data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
  80. data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
  81. data/lib/wsdl/xmlSchema/xsd2ruby.rb +13 -4
  82. data/lib/xsd/charset.rb +8 -6
  83. data/lib/xsd/codegen/classdef.rb +5 -0
  84. data/lib/xsd/codegen/moduledef.rb +17 -0
  85. data/lib/xsd/datatypes.rb +165 -20
  86. data/lib/xsd/mapping.rb +13 -5
  87. data/lib/xsd/namedelements.rb +8 -0
  88. data/lib/xsd/ns.rb +50 -14
  89. data/lib/xsd/qname.rb +3 -2
  90. data/lib/xsd/xmlparser.rb +4 -3
  91. data/test/soap/asp.net/test_aspdotnet.rb +1 -1
  92. data/test/soap/auth/test_basic.rb +4 -3
  93. data/test/soap/auth/test_digest.rb +4 -3
  94. data/test/soap/calc/test_calc.rb +6 -4
  95. data/test/soap/calc/test_calc2.rb +6 -4
  96. data/test/soap/calc/test_calc_cgi.rb +6 -4
  97. data/test/soap/fault/test_customfault.rb +6 -4
  98. data/test/soap/fault/test_soaparray.rb +35 -0
  99. data/test/soap/filter/test_filter.rb +2 -2
  100. data/test/soap/header/test_authheader.rb +2 -2
  101. data/test/soap/header/test_authheader_cgi.rb +3 -3
  102. data/test/soap/header/test_simplehandler.rb +2 -2
  103. data/test/soap/helloworld/test_helloworld.rb +6 -4
  104. data/test/soap/ssl/test_ssl.rb +1 -1
  105. data/test/soap/struct/test_struct.rb +2 -2
  106. data/test/soap/swa/test_file.rb +6 -4
  107. data/test/soap/test_basetype.rb +4 -4
  108. data/test/soap/test_cookie.rb +2 -2
  109. data/test/soap/test_custom_ns.rb +50 -8
  110. data/test/soap/test_custommap.rb +6 -4
  111. data/test/soap/test_empty.rb +6 -4
  112. data/test/soap/test_envelopenamespace.rb +2 -2
  113. data/test/soap/test_extraattr.rb +6 -7
  114. data/test/soap/test_generator.rb +27 -0
  115. data/test/soap/test_mapping.rb +10 -0
  116. data/test/soap/test_nestedexception.rb +56 -0
  117. data/test/soap/test_nil.rb +6 -4
  118. data/test/soap/test_no_indent.rb +6 -4
  119. data/test/soap/test_response_as_xml.rb +2 -2
  120. data/test/soap/test_streamhandler.rb +6 -3
  121. data/test/soap/test_styleuse.rb +2 -2
  122. data/test/soap/wsdlDriver/test_calc.rb +2 -2
  123. data/test/soap/wsdlDriver/test_document.rb +2 -2
  124. data/test/soap/wsdlDriver/test_simpletype.rb +2 -2
  125. data/test/wsdl/abstract/test_abstract.rb +1 -1
  126. data/test/wsdl/anonymous/expectedClassDef.rb +128 -0
  127. data/test/wsdl/anonymous/expectedDriver.rb +59 -0
  128. data/test/wsdl/anonymous/expectedMappingRegistry.rb +176 -0
  129. data/test/wsdl/anonymous/lp.wsdl +147 -0
  130. data/test/wsdl/anonymous/test_anonymous.rb +130 -0
  131. data/test/wsdl/any/expectedDriver.rb +3 -2
  132. data/test/wsdl/any/expectedEcho.rb +22 -2
  133. data/test/wsdl/any/expectedMappingRegistry.rb +63 -0
  134. data/test/wsdl/any/expectedService.rb +3 -1
  135. data/test/wsdl/any/test_any.rb +2 -7
  136. data/test/wsdl/axisArray/axisArray.wsdl +31 -4
  137. data/test/wsdl/axisArray/test_axisarray.rb +58 -3
  138. data/test/wsdl/choice/choice.wsdl +39 -0
  139. data/test/wsdl/choice/test_choice.rb +134 -7
  140. data/test/wsdl/complexcontent/test_echo.rb +1 -1
  141. data/test/wsdl/datetime/test_datetime.rb +2 -2
  142. data/test/wsdl/document/array/double.wsdl +45 -6
  143. data/test/wsdl/document/array/test_array.rb +68 -1
  144. data/test/wsdl/document/document.wsdl +2 -0
  145. data/test/wsdl/document/test_nosoapaction.rb +1 -1
  146. data/test/wsdl/document/test_number.rb +1 -1
  147. data/test/wsdl/document/test_rpc.rb +78 -9
  148. data/test/wsdl/fault/test_fault.rb +1 -1
  149. data/test/wsdl/fault/test_multifault.rb +1 -1
  150. data/test/wsdl/group/expectedClassdef.rb +58 -0
  151. data/test/wsdl/group/expectedDriver.rb +51 -0
  152. data/test/wsdl/group/expectedMappingRegistry.rb +67 -0
  153. data/test/wsdl/group/group.wsdl +88 -0
  154. data/test/wsdl/group/test_rpc.rb +145 -0
  155. data/test/wsdl/list/test_list.rb +1 -1
  156. data/test/wsdl/map/test_map.rb +2 -2
  157. data/test/wsdl/marshal/person_org.rb +5 -0
  158. data/test/wsdl/multiplefault.wsdl +11 -4
  159. data/test/wsdl/oneway/test_oneway.rb +1 -1
  160. data/test/wsdl/overload/test_overload.rb +1 -1
  161. data/test/wsdl/qualified/test_qualified.rb +1 -1
  162. data/test/wsdl/qualified/test_unqualified.rb +1 -1
  163. data/test/wsdl/raa/RAAService.rb +62 -57
  164. data/test/wsdl/raa/expectedClassDef.rb +100 -0
  165. data/test/wsdl/raa/expectedDriver.rb +96 -0
  166. data/test/wsdl/raa/expectedMappingRegistry.rb +121 -0
  167. data/test/wsdl/raa/test_raa.rb +54 -19
  168. data/test/wsdl/ref/expectedDriver.rb +1 -1
  169. data/test/wsdl/ref/expectedProduct.rb +101 -16
  170. data/test/wsdl/ref/test_ref.rb +2 -1
  171. data/test/wsdl/rpc/test_rpc.rb +1 -2
  172. data/test/wsdl/rpc/test_rpc_lit.rb +13 -13
  173. data/test/wsdl/simplecontent/test_simplecontent.rb +5 -5
  174. data/test/wsdl/simpletype/rpc/expectedDriver.rb +3 -2
  175. data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +2 -0
  176. data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +10 -17
  177. data/test/wsdl/simpletype/rpc/expectedService.rb +4 -2
  178. data/test/wsdl/simpletype/test_simpletype.rb +2 -2
  179. data/test/wsdl/soap/test_soapbodyparts.rb +2 -2
  180. data/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb +2 -0
  181. data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +3 -2
  182. data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +5 -9
  183. data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +4 -2
  184. data/test/wsdl/soap/wsdl2ruby/expectedService.rb +4 -2
  185. data/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb +6 -0
  186. data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +1 -1
  187. data/test/wsdl/soaptype/test_soaptype.rb +1 -1
  188. data/test/wsdl/test_multiplefault.rb +3 -1
  189. data/test/xsd/codegen/test_classdef.rb +30 -0
  190. data/test/xsd/test_ns.rb +21 -0
  191. data/test/xsd/test_xsd.rb +5 -4
  192. data/test/xsd/xsd2ruby/expected_mysample.rb +13 -2
  193. data/test/xsd/xsd2ruby/expected_mysample_mapping_registry.rb +5 -11
  194. data/test/xsd/xsd2ruby/section.xsd +8 -0
  195. metadata +40 -8
  196. data/test/wsdl/axisArray/itemList.rb +0 -14
  197. data/test/wsdl/raa/RAA.rb +0 -120
  198. data/test/wsdl/raa/RAAServant.rb +0 -107
  199. data/test/wsdl/raa/server.rb +0 -103
@@ -65,12 +65,9 @@ class EncodedRegistry
65
65
  return ret if ret
66
66
  end
67
67
  end
68
- ancestors = klass.ancestors
69
- ancestors.delete(klass)
70
- ancestors.delete(::Object)
71
- ancestors.delete(::Kernel)
72
- ancestors.each do |klass|
73
- if map = @obj2soap[klass]
68
+ klass.ancestors.each do |baseclass|
69
+ next if baseclass == klass
70
+ if map = @obj2soap[baseclass]
74
71
  map.each do |soap_class, factory, info|
75
72
  if info[:derived_class]
76
73
  ret = factory.obj2soap(soap_class, obj, info, @registry)
@@ -126,6 +123,7 @@ class EncodedRegistry
126
123
 
127
124
  StringFactory = StringFactory_.new
128
125
  BasetypeFactory = BasetypeFactory_.new
126
+ FixnumFactory = FixnumFactory_.new
129
127
  DateTimeFactory = DateTimeFactory_.new
130
128
  ArrayFactory = ArrayFactory_.new
131
129
  Base64Factory = Base64Factory_.new
@@ -149,6 +147,7 @@ class EncodedRegistry
149
147
  {:derived_class => true}],
150
148
  [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
151
149
  {:derived_class => true}],
150
+ [::Fixnum, ::SOAP::SOAPInt, FixnumFactory],
152
151
  [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
153
152
  {:derived_class => true}],
154
153
  [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
@@ -188,8 +187,10 @@ class EncodedRegistry
188
187
  [::String, ::SOAP::SOAPGMonth, BasetypeFactory],
189
188
  [::String, ::SOAP::SOAPQName, BasetypeFactory],
190
189
 
191
- [::Hash, ::SOAP::SOAPArray, HashFactory],
192
- [::Hash, ::SOAP::SOAPStruct, HashFactory],
190
+ [::Hash, ::SOAP::SOAPArray, HashFactory,
191
+ {:derived_class => true}],
192
+ [::Hash, ::SOAP::SOAPStruct, HashFactory,
193
+ {:derived_class => true}],
193
194
 
194
195
  [::Array, ::SOAP::SOAPArray, ArrayFactory,
195
196
  {:derived_class => true}],
@@ -212,6 +213,7 @@ class EncodedRegistry
212
213
  {:derived_class => true}],
213
214
  [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
214
215
  {:derived_class => true}],
216
+ [::Fixnum, ::SOAP::SOAPInt, FixnumFactory],
215
217
  [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
216
218
  {:derived_class => true}],
217
219
  [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
@@ -324,7 +326,7 @@ private
324
326
 
325
327
  def _obj2soap(obj, type_qname = nil)
326
328
  ret = nil
327
- if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray)
329
+ if obj.is_a?(SOAPCompoundtype)
328
330
  obj.replace do |ele|
329
331
  Mapping._obj2soap(ele, self)
330
332
  end
@@ -334,6 +336,7 @@ private
334
336
  elsif type_qname && type = TypeMap[type_qname]
335
337
  return base2soap(obj, type)
336
338
  end
339
+ cause = nil
337
340
  begin
338
341
  if definition = schema_definition_from_class(obj.class)
339
342
  return stubobj2soap(obj, definition)
@@ -342,6 +345,7 @@ private
342
345
  @default_factory.obj2soap(nil, obj, nil, self)
343
346
  return ret if ret
344
347
  rescue MappingError
348
+ cause = $!
345
349
  end
346
350
  if @excn_handler_obj2soap
347
351
  ret = @excn_handler_obj2soap.call(obj) { |yield_obj|
@@ -349,7 +353,7 @@ private
349
353
  }
350
354
  return ret if ret
351
355
  end
352
- raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.")
356
+ raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.", cause)
353
357
  end
354
358
 
355
359
  # Might return nil as a mapping result.
@@ -365,7 +369,7 @@ private
365
369
  else
366
370
  klass = definition.class_for if definition
367
371
  end
368
- if definition and node.is_a?(::SOAP::SOAPStruct)
372
+ if definition and node.is_a?(::SOAP::SOAPNameAccessible)
369
373
  return elesoap2stubobj(node, klass, definition)
370
374
  end
371
375
  if node.extraattr.key?(RubyTypeName)
@@ -376,15 +380,17 @@ private
376
380
  return obj if conv
377
381
  conv, obj = @default_factory.soap2obj(nil, node, nil, self)
378
382
  return obj if conv
383
+ cause = nil
379
384
  if @excn_handler_soap2obj
380
385
  begin
381
386
  return @excn_handler_soap2obj.call(node) { |yield_node|
382
387
  Mapping._soap2obj(yield_node, self)
383
388
  }
384
389
  rescue Exception
390
+ cause = $!
385
391
  end
386
392
  end
387
- raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.")
393
+ raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.", cause)
388
394
  end
389
395
 
390
396
  def addiv2obj(obj, attr)
@@ -513,7 +519,7 @@ private
513
519
  end
514
520
  end
515
521
  if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
516
- obj.replace(vars.values[0])
522
+ Array.instance_method(:replace).bind(obj).call(vars.values[0])
517
523
  else
518
524
  Mapping.set_attributes(obj, vars)
519
525
  end
@@ -105,8 +105,7 @@ class StringFactory_ < Factory
105
105
  return nil
106
106
  end
107
107
  begin
108
- externalces = Thread.current[:SOAPMapping][:ExternalCES]
109
- encoded = XSD::Charset.encoding_conv(obj, externalces,
108
+ encoded = XSD::Charset.encoding_conv(obj, Mapping.external_ces,
110
109
  XSD::Charset.encoding)
111
110
  soap_obj = soap_class.new(encoded)
112
111
  rescue XSD::ValueSpaceError
@@ -119,13 +118,30 @@ class StringFactory_ < Factory
119
118
  def soap2obj(obj_class, node, info, map)
120
119
  obj = Mapping.create_empty_object(obj_class)
121
120
  decoded = XSD::Charset.encoding_conv(node.data, XSD::Charset.encoding,
122
- Thread.current[:SOAPMapping][:ExternalCES])
121
+ Mapping.external_ces)
123
122
  obj.replace(decoded)
124
123
  mark_unmarshalled_obj(node, obj)
125
124
  return true, obj
126
125
  end
127
126
  end
128
127
 
128
+ class FixnumFactory_ < Factory
129
+ def obj2soap(soap_class, obj, info, map)
130
+ soap_obj = nil
131
+ begin
132
+ soap_obj = soap_class.new(obj)
133
+ rescue XSD::ValueSpaceError
134
+ return nil
135
+ end
136
+ soap_obj
137
+ end
138
+
139
+ def soap2obj(obj_class, node, info, map)
140
+ obj = node.data
141
+ return true, obj
142
+ end
143
+ end
144
+
129
145
  class BasetypeFactory_ < Factory
130
146
  def initialize(allow_original_mapping = false)
131
147
  super()
@@ -48,9 +48,11 @@ class LiteralRegistry
48
48
 
49
49
  # node should be a SOAPElement
50
50
  def soap2obj(node, obj_class = nil)
51
+ cause = nil
51
52
  begin
52
53
  return any2obj(node, obj_class)
53
54
  rescue MappingError
55
+ cause = $!
54
56
  end
55
57
  if @excn_handler_soap2obj
56
58
  begin
@@ -60,7 +62,7 @@ class LiteralRegistry
60
62
  rescue Exception
61
63
  end
62
64
  end
63
- raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object")
65
+ raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object", cause)
64
66
  end
65
67
 
66
68
  private
@@ -76,7 +78,10 @@ private
76
78
  if obj.is_a?(SOAP::Mapping::Object)
77
79
  return mappingobj2soap(obj, qname)
78
80
  end
79
- class_definition = schema_definition_from_class(obj_class || obj.class)
81
+ class_definition = schema_definition_from_class(obj.class)
82
+ if class_definition.nil? and obj_class
83
+ class_definition = schema_definition_from_class(obj_class)
84
+ end
80
85
  elename_definition = schema_definition_from_elename(qname)
81
86
  if !class_definition and !elename_definition
82
87
  # no definition found
@@ -122,25 +127,25 @@ private
122
127
  end
123
128
 
124
129
  def stubobj2soap(obj, qname, definition)
125
- if obj.is_a?(::String)
130
+ if obj.nil?
131
+ ele = SOAPNil.new
132
+ ele.elename = qname
133
+ elsif obj.is_a?(::String)
126
134
  ele = SOAPElement.new(qname, obj)
127
135
  else
128
136
  ele = SOAPElement.new(qname)
129
137
  end
130
138
  ele.qualified = definition.qualified
131
- if definition.type
139
+ if definition.type and (definition.basetype or Mapping.root_type_hint)
140
+ Mapping.reset_root_type_hint
132
141
  ele.extraattr[XSD::AttrTypeName] = definition.type
133
142
  end
134
143
  if qname.nil? and definition.elename
135
144
  ele.elename = definition.elename
136
145
  end
146
+ return ele if obj.nil?
137
147
  stubobj2soap_elements(obj, ele, definition.elements)
138
- if definition.attributes
139
- definition.attributes.each do |qname, param|
140
- at = Mapping.get_attribute(obj, XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name))
141
- ele.extraattr[qname] = at
142
- end
143
- end
148
+ add_definedattributes2soap(obj, ele, definition)
144
149
  ele
145
150
  end
146
151
 
@@ -174,8 +179,12 @@ private
174
179
  added = false
175
180
  else
176
181
  if child.respond_to?(:each) and definition.as_array?
177
- child.each do |item|
178
- ele.add(definedobj2soap(item, definition))
182
+ if child.empty?
183
+ added = false
184
+ else
185
+ child.each do |item|
186
+ ele.add(definedobj2soap(item, definition))
187
+ end
179
188
  end
180
189
  else
181
190
  ele.add(definedobj2soap(child, definition))
@@ -197,7 +206,9 @@ private
197
206
  ele.add(obj2soap(value, key))
198
207
  end
199
208
  end
200
- add_attributes2soap(obj, ele)
209
+ obj.__xmlattr.each do |key, value|
210
+ ele.extraattr[key] = value
211
+ end
201
212
  ele
202
213
  end
203
214
 
@@ -219,7 +230,7 @@ private
219
230
  if is_compound
220
231
  if definition
221
232
  return elesoap2stubobj(node, obj_class, definition)
222
- else
233
+ elsif node.is_a?(::SOAP::SOAPNameAccessible)
223
234
  return elesoap2plainobj(node)
224
235
  end
225
236
  end
@@ -230,8 +241,10 @@ private
230
241
 
231
242
  def elesoap2stubobj(node, obj_class, definition)
232
243
  obj = nil
233
- if obj_class < ::String
244
+ if obj_class == ::String
234
245
  obj = node.text
246
+ elsif obj_class < ::String
247
+ obj = obj_class.new(node.text)
235
248
  else
236
249
  obj = Mapping.create_empty_object(obj_class)
237
250
  add_elesoap2stubobj(node, obj, definition)
@@ -242,7 +255,7 @@ private
242
255
 
243
256
  def elesoap2plainobj(node)
244
257
  obj = nil
245
- if node.members.empty?
258
+ if !node.have_member
246
259
  obj = base2obj(node, ::SOAP::SOAPString)
247
260
  else
248
261
  obj = anytype2obj(node)
@@ -256,9 +269,7 @@ private
256
269
  if node.is_a?(::SOAP::SOAPBasetype)
257
270
  return node.data
258
271
  end
259
- klass = ::SOAP::Mapping::Object
260
- obj = klass.new
261
- obj
272
+ ::SOAP::Mapping::Object.new
262
273
  end
263
274
 
264
275
  def add_elesoap2stubobj(node, obj, definition)
@@ -280,7 +291,7 @@ private
280
291
  end
281
292
  end
282
293
  if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
283
- obj.replace(vars.values[0])
294
+ Array.instance_method(:replace).bind(obj).call(vars.values[0])
284
295
  else
285
296
  Mapping.set_attributes(obj, vars)
286
297
  end
@@ -309,13 +320,12 @@ private
309
320
  if attributes = definition.attributes
310
321
  define_xmlattr(obj)
311
322
  attributes.each do |qname, class_name|
312
- attr = node.extraattr[qname]
313
- next if attr.nil? or attr.empty?
314
- child = attr
323
+ child = node.extraattr[qname]
324
+ next if child.nil?
315
325
  if class_name
316
326
  klass = Mapping.class_from_name(class_name)
317
327
  if klass.include?(::SOAP::SOAPBasetype)
318
- child = klass.new(attr).data
328
+ child = klass.to_data(child)
319
329
  end
320
330
  end
321
331
  obj.__xmlattr[qname] = child
@@ -343,18 +353,20 @@ private
343
353
  # much memory for each singleton Object. just instance_eval instead of it.
344
354
  def define_xmlattr_accessor(obj, qname)
345
355
  # untaint depends GenSupport.safemethodname
346
- name = XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name).untaint
347
- # untaint depends QName#dump
348
- qnamedump = qname.dump.untaint
349
- obj.instance_eval <<-EOS
350
- def #{name}
351
- @__xmlattr[#{qnamedump}]
352
- end
356
+ name = Mapping.safemethodname('xmlattr_' + qname.name).untaint
357
+ unless obj.respond_to?(name)
358
+ # untaint depends QName#dump
359
+ qnamedump = qname.dump.untaint
360
+ obj.instance_eval <<-EOS
361
+ def #{name}
362
+ @__xmlattr[#{qnamedump}]
363
+ end
353
364
 
354
- def #{name}=(value)
355
- @__xmlattr[#{qnamedump}] = value
356
- end
357
- EOS
365
+ def #{name}=(value)
366
+ @__xmlattr[#{qnamedump}] = value
367
+ end
368
+ EOS
369
+ end
358
370
  end
359
371
 
360
372
  # Mapping.define_attr_accessor calls define_method with proc and it exhausts
@@ -204,18 +204,20 @@ module Mapping
204
204
  def self.const_from_name(name, lenient = false)
205
205
  const = ::Object
206
206
  name.sub(/\A::/, '').split('::').each do |const_str|
207
- begin
208
- if const.const_defined?(const_str)
209
- const = const.const_get(const_str)
210
- next
211
- end
212
- rescue NameError
213
- if lenient
214
- const_str = XSD::CodeGen::GenSupport.safeconstname(const_str)
207
+ if /\A[A-Z]/ =~ const_str
208
+ begin
215
209
  if const.const_defined?(const_str)
216
210
  const = const.const_get(const_str)
217
211
  next
218
212
  end
213
+ rescue NameError
214
+ end
215
+ end
216
+ if lenient
217
+ const_str = Mapping.safeconstname(const_str)
218
+ if const.const_defined?(const_str)
219
+ const = const.const_get(const_str)
220
+ next
219
221
  end
220
222
  end
221
223
  return nil
@@ -224,7 +226,11 @@ module Mapping
224
226
  end
225
227
 
226
228
  def self.class_from_name(name, lenient = false)
227
- const = const_from_name(name, lenient)
229
+ unless lenient
230
+ const = const_from_name_nonlenient(name)
231
+ else
232
+ const = const_from_name(name, true)
233
+ end
228
234
  if const.is_a?(::Class)
229
235
  const
230
236
  else
@@ -233,7 +239,11 @@ module Mapping
233
239
  end
234
240
 
235
241
  def self.module_from_name(name, lenient = false)
236
- const = const_from_name(name, lenient)
242
+ unless lenient
243
+ const = const_from_name_nonlenient(name)
244
+ else
245
+ const = const_from_name(name, true)
246
+ end
237
247
  if const.is_a?(::Module)
238
248
  const
239
249
  else
@@ -241,6 +251,15 @@ module Mapping
241
251
  end
242
252
  end
243
253
 
254
+ def self.const_from_name_nonlenient(name)
255
+ if Thread.current[:SOAPMapping]
256
+ Thread.current[:SOAPMapping][:ConstFromName][name] ||=
257
+ const_from_name(name)
258
+ else
259
+ const_from_name(name)
260
+ end
261
+ end
262
+
244
263
  def self.class2qname(klass)
245
264
  name = schema_type_definition(klass)
246
265
  namespace = schema_ns_definition(klass)
@@ -270,6 +289,14 @@ module Mapping
270
289
  end
271
290
  end
272
291
 
292
+ def self.to_qname(obj, ns = nil)
293
+ if obj.is_a?(XSD::QName)
294
+ obj
295
+ else
296
+ XSD::QName.new(ns, obj)
297
+ end
298
+ end
299
+
273
300
  def self.define_singleton_method(obj, name, &block)
274
301
  sclass = (class << obj; self; end)
275
302
  sclass.class_eval {
@@ -309,7 +336,7 @@ module Mapping
309
336
  return obj.__send__(attr_name)
310
337
  end
311
338
  iv = obj.instance_variables
312
- name = XSD::CodeGen::GenSupport.safevarname(attr_name)
339
+ name = Mapping.safevarname(attr_name)
313
340
  if iv.include?("@#{name}")
314
341
  return obj.instance_variable_get("@#{name}")
315
342
  elsif iv.include?("@#{attr_name}")
@@ -331,7 +358,7 @@ module Mapping
331
358
  else
332
359
  values.each do |attr_name, value|
333
360
  # untaint depends GenSupport.safevarname
334
- name = XSD::CodeGen::GenSupport.safevarname(attr_name).untaint
361
+ name = Mapping.safevarname(attr_name).untaint
335
362
  setter = name + "="
336
363
  if obj.respond_to?(setter)
337
364
  obj.__send__(setter, value)
@@ -360,6 +387,33 @@ module Mapping
360
387
  end
361
388
  end
362
389
 
390
+ def self.safeconstname(name)
391
+ Thread.current[:SOAPMapping][:SafeConstName][name] ||=
392
+ XSD::CodeGen::GenSupport.safeconstname(name)
393
+ end
394
+
395
+ def self.safemethodname(name)
396
+ Thread.current[:SOAPMapping][:SafeMethodName][name] ||=
397
+ XSD::CodeGen::GenSupport.safemethodname(name)
398
+ end
399
+
400
+ def self.safevarname(name)
401
+ Thread.current[:SOAPMapping][:SafeVarName][name] ||=
402
+ XSD::CodeGen::GenSupport.safevarname(name)
403
+ end
404
+
405
+ def self.root_type_hint
406
+ Thread.current[:SOAPMapping][:RootTypeHint]
407
+ end
408
+
409
+ def self.reset_root_type_hint
410
+ Thread.current[:SOAPMapping][:RootTypeHint] = false
411
+ end
412
+
413
+ def self.external_ces
414
+ Thread.current[:SOAPMapping][:ExternalCES]
415
+ end
416
+
363
417
  def self.schema_ns_definition(klass)
364
418
  class_schema_variable(:schema_ns, klass)
365
419
  end
@@ -388,17 +442,19 @@ module Mapping
388
442
  if Thread.current[:SOAPMapping][:SchemaDefinition].key?(klass)
389
443
  return Thread.current[:SOAPMapping][:SchemaDefinition][klass]
390
444
  end
391
- ns = schema_ns_definition(klass)
392
- name = schema_name_definition(klass)
393
- type = schema_type_definition(klass)
445
+ schema_ns = schema_ns_definition(klass)
446
+ schema_name = schema_name_definition(klass)
447
+ schema_type = schema_type_definition(klass)
394
448
  qualified = schema_qualified_definition(klass)
395
449
  elements = schema_element_definition(klass)
396
450
  attributes = schema_attribute_definition(klass)
397
- return nil if ns.nil? and name.nil? and type.nil? and elements.nil? and attributes.nil?
451
+ return nil if schema_name.nil? and schema_type.nil?
452
+ schema_name = Mapping.to_qname(schema_name, schema_ns) if schema_name
453
+ schema_type = Mapping.to_qname(schema_type, schema_ns) if schema_type
398
454
  definition = create_schema_definition(klass,
399
- :schema_ns => ns,
400
- :schema_name => name,
401
- :schema_type => type,
455
+ :schema_name => schema_name,
456
+ :schema_type => schema_type,
457
+ :is_anonymous => false,
402
458
  :schema_qualified => qualified,
403
459
  :schema_element => elements,
404
460
  :schema_attribute => attributes
@@ -411,20 +467,27 @@ module Mapping
411
467
  schema_ns = definition[:schema_ns]
412
468
  schema_name = definition[:schema_name]
413
469
  schema_type = definition[:schema_type]
470
+ is_anonymous = definition[:is_anonymous]
471
+ schema_basetype = definition[:schema_basetype]
472
+ # wrap if needed for backward compatibility
473
+ if schema_ns
474
+ schema_name = Mapping.to_qname(schema_name, schema_ns) if schema_name
475
+ schema_type = Mapping.to_qname(schema_type, schema_ns) if schema_type
476
+ # no need for schema_basetype bacause it's introduced later
477
+ end
414
478
  schema_qualified = definition[:schema_qualified]
415
479
  schema_element = definition[:schema_element]
416
480
  schema_attributes = definition[:schema_attribute]
417
- elename = schema_name ? XSD::QName.new(schema_ns, schema_name) : nil
418
- type = schema_type ? XSD::QName.new(schema_ns, schema_type) : nil
419
- definition = SchemaDefinition.new(klass, elename, type, schema_qualified)
481
+ definition = SchemaDefinition.new(klass, schema_name, schema_type, is_anonymous, schema_qualified)
482
+ definition.basetype = schema_basetype
420
483
  definition.attributes = schema_attributes
421
484
  if schema_element
422
485
  if schema_element.respond_to?(:is_concrete_definition) and
423
486
  schema_element.is_concrete_definition
424
487
  definition.elements = schema_element
425
488
  else
426
- default_ns = elename.namespace if elename
427
- default_ns ||= type.namespace if type
489
+ default_ns = schema_name.namespace if schema_name
490
+ default_ns ||= schema_type.namespace if schema_type
428
491
  definition.elements = parse_schema_definition(schema_element, default_ns)
429
492
  if klass < ::Array
430
493
  definition.elements.set_array
@@ -520,7 +583,12 @@ module Mapping
520
583
  data[:MarshalKey] = {}
521
584
  data[:ExternalCES] = opt[:external_ces] || XSD::Charset.encoding
522
585
  data[:NoReference] = opt[:no_reference]
586
+ data[:RootTypeHint] = opt[:root_type_hint]
523
587
  data[:SchemaDefinition] = {}
588
+ data[:SafeConstName] = {}
589
+ data[:SafeMethodName] = {}
590
+ data[:SafeVarName] = {}
591
+ data[:ConstFromName] = {}
524
592
  yield
525
593
  end
526
594
  end