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
@@ -51,9 +51,7 @@ class Object
51
51
  end
52
52
 
53
53
  def [](qname)
54
- unless qname.is_a?(XSD::QName)
55
- qname = XSD::QName.new(nil, qname)
56
- end
54
+ qname = Mapping.to_qname(qname)
57
55
  @__xmlele.each do |k, v|
58
56
  return v if k == qname
59
57
  end
@@ -65,9 +63,7 @@ class Object
65
63
  end
66
64
 
67
65
  def []=(qname, value)
68
- unless qname.is_a?(XSD::QName)
69
- qname = XSD::QName.new(nil, qname)
70
- end
66
+ qname = Mapping.to_qname(qname)
71
67
  found = false
72
68
  @__xmlele.each do |pair|
73
69
  if pair[0] == qname
@@ -110,7 +106,7 @@ private
110
106
  # much memory for each singleton Object. just instance_eval instead of it.
111
107
  def __define_attr_accessor(qname)
112
108
  # untaint depends GenSupport.safemethodname
113
- name = XSD::CodeGen::GenSupport.safemethodname(qname.name).untaint
109
+ name = Mapping.safemethodname(qname.name).untaint
114
110
  # untaint depends on QName#dump
115
111
  qnamedump = qname.dump.untaint
116
112
  singleton = false
@@ -178,6 +174,7 @@ module RegistrySupport
178
174
  def initialize
179
175
  super()
180
176
  @class_schema_definition = {}
177
+ @class_elename_schema_definition = {}
181
178
  @elename_schema_definition = {}
182
179
  @type_schema_definition = {}
183
180
  end
@@ -189,7 +186,8 @@ module RegistrySupport
189
186
  if !@class_schema_definition[obj_class] or definition.type
190
187
  @class_schema_definition[obj_class] = definition
191
188
  end
192
- if definition.elename
189
+ if definition.elename and !definition.is_anonymous?
190
+ @class_elename_schema_definition[obj_class] = definition
193
191
  @elename_schema_definition[definition.elename] = definition
194
192
  end
195
193
  if definition.type
@@ -201,6 +199,10 @@ module RegistrySupport
201
199
  @class_schema_definition[klass] || Mapping.schema_definition_classdef(klass)
202
200
  end
203
201
 
202
+ def elename_schema_definition_from_class(klass)
203
+ @class_elename_schema_definition[klass]
204
+ end
205
+
204
206
  def schema_definition_from_elename(qname)
205
207
  @elename_schema_definition[qname]
206
208
  end
@@ -218,7 +220,7 @@ module RegistrySupport
218
220
 
219
221
  def find_schema_definition(name)
220
222
  return nil unless name
221
- typestr = XSD::CodeGen::GenSupport.safeconstname(name)
223
+ typestr = Mapping.safeconstname(name)
222
224
  obj_class = Mapping.class_from_name(typestr)
223
225
  if obj_class
224
226
  schema_definition_from_class(obj_class)
@@ -226,12 +228,8 @@ module RegistrySupport
226
228
  end
227
229
 
228
230
  def add_attributes2soap(obj, ele)
229
- definition = Mapping.schema_definition_classdef(obj.class)
230
- if definition && attributes = definition.attributes
231
- attributes.each do |qname, param|
232
- at = Mapping.get_attribute(obj, XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name))
233
- ele.extraattr[qname] = at
234
- end
231
+ if definition = Mapping.schema_definition_classdef(obj.class)
232
+ add_definedattributes2soap(obj, ele, definition)
235
233
  elsif obj.respond_to?(:__xmlattr)
236
234
  obj.__xmlattr.each do |key, value|
237
235
  ele.extraattr[key] = value
@@ -239,12 +237,30 @@ module RegistrySupport
239
237
  end
240
238
  end
241
239
 
240
+ def add_definedattributes2soap(obj, ele, typedef)
241
+ if typedef.attributes
242
+ typedef.attributes.each do |qname, param|
243
+ value = get_xmlattr_value(obj, qname)
244
+ ele.extraattr[qname] = value unless value.nil?
245
+ end
246
+ end
247
+ end
248
+
249
+ def get_xmlattr_value(obj, qname)
250
+ attrname = 'xmlattr_' + qname.name
251
+ value = Mapping.get_attribute(obj, attrname)
252
+ if value.nil?
253
+ attrname = Mapping.safemethodname('xmlattr_' + qname.name)
254
+ value = Mapping.get_attribute(obj, attrname)
255
+ end
256
+ value
257
+ end
258
+
242
259
  def base2soap(obj, type, qualified = nil)
243
260
  return SOAPNil.new if obj.nil?
244
261
  soap_obj = nil
245
262
  if type <= XSD::XSDString
246
- str = XSD::Charset.encoding_conv(obj.to_s,
247
- Thread.current[:SOAPMapping][:ExternalCES],
263
+ str = XSD::Charset.encoding_conv(obj.to_s, Mapping.external_ces,
248
264
  XSD::Charset.encoding)
249
265
  soap_obj = type.new(str)
250
266
  else
@@ -265,7 +281,7 @@ module RegistrySupport
265
281
  if value.is_a?(klass)
266
282
  v
267
283
  else
268
- klass.new(v).data
284
+ klass.to_data(v)
269
285
  end
270
286
  end
271
287
 
@@ -141,18 +141,25 @@ class SchemaDefinition
141
141
  attr_reader :class_for
142
142
  attr_reader :elename, :type
143
143
  attr_reader :qualified
144
+ attr_accessor :basetype
144
145
  attr_accessor :attributes
145
146
  attr_accessor :elements
146
147
 
147
- def initialize(class_for, elename, type, qualified)
148
+ def initialize(class_for, elename, type, anonymous, qualified)
148
149
  @class_for = class_for
149
150
  @elename = elename
150
151
  @type = type
152
+ @anonymous = anonymous
151
153
  @qualified = qualified
154
+ @basetype = nil
152
155
  @elements = EMPTY
153
156
  @attributes = nil
154
157
  end
155
158
 
159
+ def is_anonymous?
160
+ @anonymous
161
+ end
162
+
156
163
  def choice?
157
164
  @elements.choice?
158
165
  end
@@ -16,6 +16,15 @@ TypeMap = {
16
16
  XSD::XSDNormalizedString::Type => SOAPNormalizedString,
17
17
  XSD::XSDToken::Type => SOAPToken,
18
18
  XSD::XSDLanguage::Type => SOAPLanguage,
19
+ XSD::XSDNMTOKEN::Type => SOAPNMTOKEN,
20
+ XSD::XSDNMTOKENS::Type => SOAPNMTOKENS,
21
+ XSD::XSDName::Type => SOAPName,
22
+ XSD::XSDNCName::Type => SOAPNCName,
23
+ XSD::XSDID::Type => SOAPID,
24
+ XSD::XSDIDREF::Type => SOAPIDREF,
25
+ XSD::XSDIDREFS::Type => SOAPIDREFS,
26
+ XSD::XSDENTITY::Type => SOAPENTITY,
27
+ XSD::XSDENTITIES::Type => SOAPENTITIES,
19
28
  XSD::XSDBoolean::Type => SOAPBoolean,
20
29
  XSD::XSDDecimal::Type => SOAPDecimal,
21
30
  XSD::XSDFloat::Type => SOAPFloat,
@@ -52,6 +61,15 @@ TypeMap = {
52
61
  SOAP::SOAPNormalizedString::Type => SOAPNormalizedString,
53
62
  SOAP::SOAPToken::Type => SOAPToken,
54
63
  SOAP::SOAPLanguage::Type => SOAPLanguage,
64
+ SOAP::SOAPNMTOKEN::Type => SOAPNMTOKEN,
65
+ SOAP::SOAPNMTOKENS::Type => SOAPNMTOKENS,
66
+ SOAP::SOAPName::Type => SOAPName,
67
+ SOAP::SOAPNCName::Type => SOAPNCName,
68
+ SOAP::SOAPID::Type => SOAPID,
69
+ SOAP::SOAPIDREF::Type => SOAPIDREF,
70
+ SOAP::SOAPIDREFS::Type => SOAPIDREFS,
71
+ SOAP::SOAPENTITY::Type => SOAPENTITY,
72
+ SOAP::SOAPENTITIES::Type => SOAPENTITIES,
55
73
  SOAP::SOAPBoolean::SOAPENCType => SOAPBoolean,
56
74
  SOAP::SOAPDecimal::SOAPENCType => SOAPDecimal,
57
75
  SOAP::SOAPFloat::SOAPENCType => SOAPFloat,
@@ -55,9 +55,15 @@ class WSDLEncodedRegistry < EncodedRegistry
55
55
 
56
56
  # map anything for now: must refer WSDL while mapping. [ToDo]
57
57
  def soap2obj(node, obj_class = nil)
58
+ cause = nil
58
59
  begin
59
- return any2obj(node, obj_class)
60
+ unless obj_class
61
+ typestr = Mapping.safeconstname(node.elename.name)
62
+ obj_class = Mapping.class_from_name(typestr)
63
+ end
64
+ return Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class)
60
65
  rescue MappingError
66
+ cause = $!
61
67
  end
62
68
  if @excn_handler_soap2obj
63
69
  begin
@@ -67,7 +73,7 @@ class WSDLEncodedRegistry < EncodedRegistry
67
73
  rescue Exception
68
74
  end
69
75
  end
70
- raise MappingError.new("cannot map #{node.type.name} to Ruby object")
76
+ raise MappingError.new("cannot map #{node.type.name} to Ruby object", cause)
71
77
  end
72
78
 
73
79
  private
@@ -198,54 +204,6 @@ private
198
204
  Mapping._obj2soap(child_obj, self, element.type || element.name))
199
205
  end
200
206
  end
201
-
202
- def any2obj(node, obj_class)
203
- unless obj_class
204
- typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name)
205
- obj_class = Mapping.class_from_name(typestr)
206
- end
207
- if obj_class and obj_class.class_variables.include?('@@schema_element')
208
- soap2stubobj(node, obj_class)
209
- else
210
- Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class)
211
- end
212
- end
213
-
214
- def soap2stubobj(node, obj_class)
215
- obj = Mapping.create_empty_object(obj_class)
216
- unless node.is_a?(SOAPNil)
217
- add_elements2stubobj(node, obj)
218
- end
219
- obj
220
- end
221
-
222
- def add_elements2stubobj(node, obj)
223
- definition = Mapping.schema_definition_classdef(obj.class)
224
- vars = {}
225
- node.each do |name, value|
226
- item = definition.elements.find { |k, v| k.elename == value.elename }
227
- if item and item.mapped_class
228
- # klass must be a SOAPBasetype or a class
229
- if item.mapped_class.include?(::SOAP::SOAPBasetype)
230
- if value.respond_to?(:data)
231
- child = item.mapped_class.new(value.data).data
232
- else
233
- child = item.mapped_class.new(nil).data
234
- end
235
- else
236
- child = Mapping._soap2obj(value, self, item.mapped_class)
237
- end
238
- else # untyped element is treated as anyType.
239
- child = Mapping._soap2obj(value, self)
240
- end
241
- if item and item.as_array?
242
- (vars[name] ||= []) << child
243
- else
244
- vars[name] = child
245
- end
246
- end
247
- Mapping.set_attributes(obj, vars)
248
- end
249
207
  end
250
208
 
251
209
 
@@ -52,10 +52,11 @@ class WSDLLiteralRegistry < LiteralRegistry
52
52
 
53
53
  # node should be a SOAPElement
54
54
  def soap2obj(node, obj_class = nil)
55
- # obj_class is given when rpc/literal service. but ignored for now.
55
+ cause = nil
56
56
  begin
57
57
  return any2obj(node, obj_class)
58
58
  rescue MappingError
59
+ cause = $!
59
60
  end
60
61
  if @excn_handler_soap2obj
61
62
  begin
@@ -66,9 +67,9 @@ class WSDLLiteralRegistry < LiteralRegistry
66
67
  end
67
68
  end
68
69
  if node.respond_to?(:type)
69
- raise MappingError.new("cannot map #{node.type.name} to Ruby object")
70
+ raise MappingError.new("cannot map #{node.type.name} to Ruby object", cause)
70
71
  else
71
- raise MappingError.new("cannot map #{node.elename.name} to Ruby object")
72
+ raise MappingError.new("cannot map #{node.elename.name} to Ruby object", cause)
72
73
  end
73
74
  end
74
75
 
@@ -103,12 +104,14 @@ private
103
104
  ele = nil
104
105
  if type.is_a?(::WSDL::XMLSchema::SimpleType)
105
106
  ele = simpleobj2soap(obj, type)
106
- elsif type.simplecontent
107
- ele = simpleobj2soap(obj, type.simplecontent)
108
- else
109
- ele = complexobj2soap(obj, type)
107
+ else # complexType
108
+ if type.simplecontent
109
+ ele = simpleobj2soap(obj, type.simplecontent)
110
+ else
111
+ ele = complexobj2soap(obj, type)
112
+ end
113
+ add_definedattributes2soap(obj, ele, type)
110
114
  end
111
- add_attributes2soap(obj, ele)
112
115
  ele
113
116
  end
114
117
 
@@ -128,58 +131,52 @@ private
128
131
 
129
132
  def complexobj2soap(obj, type)
130
133
  ele = SOAPElement.new(type.name)
131
- if type.choice?
132
- complexobj2choicesoap(obj, ele, type)
133
- else
134
- complexobj2sequencesoap(obj, ele, type)
135
- end
134
+ complexobj2sequencesoap(obj, ele, type, type.choice?, type.choice?)
135
+ ele
136
136
  end
137
137
 
138
- def complexobj2sequencesoap(obj, ele, type)
138
+ def complexobj2sequencesoap(obj, soap, type, nillable, is_choice)
139
+ added = false
139
140
  type.elements.each do |child_ele|
140
141
  case child_ele
141
142
  when WSDL::XMLSchema::Any
142
143
  any = Mapping.get_attributes_for_any(obj)
143
144
  SOAPElement.from_objs(any).each do |child|
144
- ele.add(child)
145
+ soap.add(child)
145
146
  end
147
+ ele_added = true
146
148
  when WSDL::XMLSchema::Element
147
- complexobj2soapchildren(obj, ele, child_ele)
149
+ ele_added = complexobj2soapchildren(obj, soap, child_ele, nillable)
148
150
  when WSDL::XMLSchema::Sequence
149
- complexobj2sequencesoap(obj, child_ele, type)
151
+ ele_added = complexobj2sequencesoap(obj, soap, child_ele, nillable, false)
150
152
  when WSDL::XMLSchema::Choice
151
- complexobj2choicesoap(obj, child_ele, type)
153
+ ele_added = complexobj2sequencesoap(obj, soap, child_ele, true, true)
152
154
  else
153
155
  raise MappingError.new("unknown type: #{child_ele}")
154
156
  end
157
+ added = true if ele_added
158
+ break if is_choice and ele_added
155
159
  end
156
- ele
157
- end
158
-
159
- def complexobj2choicesoap(obj, ele, type)
160
- type.elements.each do |child_ele|
161
- break if complexobj2soapchildren(obj, ele, child_ele, true)
162
- end
163
- ele
160
+ added
164
161
  end
165
162
 
166
- def complexobj2soapchildren(obj, ele, child_ele, allow_nil_value = false)
163
+ def complexobj2soapchildren(obj, soap, child_ele, nillable = false)
167
164
  if child_ele.map_as_array?
168
- complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value)
165
+ complexobj2soapchildren_array(obj, soap, child_ele, nillable)
169
166
  else
170
- complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value)
167
+ complexobj2soapchildren_single(obj, soap, child_ele, nillable)
171
168
  end
172
169
  end
173
170
 
174
- def complexobj2soapchildren_array(obj, ele, child_ele, allow_nil_value)
171
+ def complexobj2soapchildren_array(obj, soap, child_ele, nillable)
175
172
  child = Mapping.get_attribute(obj, child_ele.name.name)
176
173
  if child.nil? and obj.is_a?(::Array)
177
174
  child = obj
178
175
  end
179
176
  if child.nil?
180
- return false if allow_nil_value
177
+ return false if nillable
181
178
  if child_soap = nil2soap(child_ele)
182
- ele.add(child_soap)
179
+ soap.add(child_soap)
183
180
  return true
184
181
  else
185
182
  return false
@@ -190,32 +187,32 @@ private
190
187
  end
191
188
  child.each do |item|
192
189
  if item.is_a?(SOAPElement)
193
- ele.add(item)
190
+ soap.add(item)
194
191
  else
195
192
  child_soap = obj2elesoap(item, child_ele)
196
- ele.add(child_soap)
193
+ soap.add(child_soap)
197
194
  end
198
195
  end
199
196
  true
200
197
  end
201
198
 
202
- def complexobj2soapchildren_single(obj, ele, child_ele, allow_nil_value)
199
+ def complexobj2soapchildren_single(obj, soap, child_ele, nillable)
203
200
  child = Mapping.get_attribute(obj, child_ele.name.name)
204
201
  case child
205
202
  when NilClass
206
- return false if allow_nil_value
203
+ return false if nillable
207
204
  if child_soap = nil2soap(child_ele)
208
- ele.add(child_soap)
205
+ soap.add(child_soap)
209
206
  true
210
207
  else
211
208
  false
212
209
  end
213
210
  when SOAPElement
214
- ele.add(child)
211
+ soap.add(child)
215
212
  true
216
213
  else
217
214
  child_soap = obj2elesoap(child, child_ele)
218
- ele.add(child_soap)
215
+ soap.add(child_soap)
219
216
  true
220
217
  end
221
218
  end
@@ -230,6 +227,15 @@ private
230
227
  nil
231
228
  end
232
229
  end
230
+
231
+ def add_definedattributes2soap(obj, ele, typedef)
232
+ if typedef.attributes
233
+ typedef.attributes.each do |at|
234
+ value = get_xmlattr_value(obj, at.name)
235
+ ele.extraattr[at.name] = value unless value.nil?
236
+ end
237
+ end
238
+ end
233
239
  end
234
240
 
235
241
 
@@ -0,0 +1,42 @@
1
+ # SOAP4R - Nested exception implementation
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
+ module SOAP
10
+
11
+
12
+ module NestedException
13
+ attr_reader :cause
14
+ attr_reader :original_backtraace
15
+
16
+ def initialize(msg = nil, cause = nil)
17
+ super(msg)
18
+ @cause = cause
19
+ @original_backtrace = nil
20
+ end
21
+
22
+ def set_backtrace(backtrace)
23
+ if @cause and @cause.respond_to?(:backtrace)
24
+ @original_backtrace = backtrace
25
+ =begin
26
+ # for agressive backtrace abstraction: 'here' only should not be good
27
+ here = @original_backtrace[0]
28
+ backtrace = Array[*@cause.backtrace]
29
+ backtrace[0] = "#{backtrace[0]}: #{@cause} (#{@cause.class})"
30
+ backtrace.unshift(here)
31
+ =end
32
+ # just join the nested backtrace at the tail of backtrace
33
+ caused = Array[*@cause.backtrace]
34
+ caused[0] = "#{caused[0]}: #{@cause} (#{@cause.class}) [NESTED]"
35
+ backtrace += caused
36
+ end
37
+ super(backtrace)
38
+ end
39
+ end
40
+
41
+
42
+ end