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
@@ -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