soap4r 1.5.7 → 1.5.8

Sign up to get free protection for your applications and to get access to all the features.
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