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
@@ -17,8 +17,10 @@ private
17
17
  ['--client_skelton','-c', GetoptLong::OPTIONAL_ARGUMENT],
18
18
  ['--servant_skelton','-s', GetoptLong::OPTIONAL_ARGUMENT],
19
19
  ['--cgi_stub','-g', GetoptLong::OPTIONAL_ARGUMENT],
20
+ ['--servlet_stub','-l', GetoptLong::OPTIONAL_ARGUMENT],
20
21
  ['--standalone_server_stub','-a', GetoptLong::OPTIONAL_ARGUMENT],
21
22
  ['--driver','-d', GetoptLong::OPTIONAL_ARGUMENT],
23
+ ['--drivername_postfix','-n', GetoptLong::REQUIRED_ARGUMENT],
22
24
  ['--force','-f', GetoptLong::NO_ARGUMENT],
23
25
  ['--quiet','-q', GetoptLong::NO_ARGUMENT],
24
26
  ]
@@ -68,9 +70,11 @@ Options:
68
70
  --client_skelton [servicename]
69
71
  --servant_skelton [porttypename]
70
72
  --cgi_stub [servicename]
73
+ --servlet_stub [servicename]
71
74
  --standalone_server_stub [servicename]
72
75
  --driver [porttypename]
73
- --module_path [Module::Path::Name]
76
+ --drivername_postfix driver_classname_postfix
77
+ --module_path Module::Path::Name
74
78
  --force
75
79
  --quiet
76
80
 
@@ -110,9 +114,11 @@ __EOU__
110
114
  end
111
115
  when "--classdef", "--mapping_registry",
112
116
  "--client_skelton", "--servant_skelton",
113
- "--cgi_stub", "--standalone_server_stub",
117
+ "--cgi_stub", "--servlet_stub", "--standalone_server_stub",
114
118
  "--driver"
115
119
  opt[name.sub(/^--/, '')] = arg.empty? ? nil : arg
120
+ when "--drivername_postfix"
121
+ opt['drivername_postfix'] = arg
116
122
  when "--force"
117
123
  opt['force'] = true
118
124
  when "--quiet"
@@ -9,6 +9,7 @@
9
9
  require 'xsd/datatypes'
10
10
  require 'soap/soap'
11
11
  require 'xsd/codegen/gensupport'
12
+ require 'soap/mapping/mapping'
12
13
 
13
14
 
14
15
  module SOAP
@@ -27,6 +28,10 @@ public
27
28
  d.elename = elename
28
29
  d
29
30
  end
31
+
32
+ def to_data(str)
33
+ new(str).data
34
+ end
30
35
  end
31
36
 
32
37
 
@@ -106,6 +111,10 @@ module SOAPCompoundtype
106
111
  end
107
112
  end
108
113
 
114
+ # marker for compound types which have named accessor
115
+ module SOAPNameAccessible
116
+ end
117
+
109
118
 
110
119
  ###
111
120
  ## Convenience datatypes.
@@ -156,6 +165,14 @@ public
156
165
  end
157
166
  end
158
167
 
168
+ # for referenced base type such as a long value from Axis.
169
+ # base2obj requires a node to respond to :data
170
+ def data
171
+ if @obj.respond_to?(:data)
172
+ @obj.data
173
+ end
174
+ end
175
+
159
176
  def refidstr
160
177
  '#' + @refid
161
178
  end
@@ -257,6 +274,60 @@ class SOAPLanguage < XSD::XSDLanguage
257
274
  SOAPENCType = QName.new(EncodingNamespace, LanguageLiteral)
258
275
  end
259
276
 
277
+ class SOAPNMTOKEN < XSD::XSDNMTOKEN
278
+ include SOAPBasetype
279
+ extend SOAPModuleUtils
280
+ SOAPENCType = QName.new(EncodingNamespace, NMTOKENLiteral)
281
+ end
282
+
283
+ class SOAPNMTOKENS < XSD::XSDNMTOKENS
284
+ include SOAPBasetype
285
+ extend SOAPModuleUtils
286
+ SOAPENCType = QName.new(EncodingNamespace, NMTOKENSLiteral)
287
+ end
288
+
289
+ class SOAPName < XSD::XSDName
290
+ include SOAPBasetype
291
+ extend SOAPModuleUtils
292
+ SOAPENCType = QName.new(EncodingNamespace, NameLiteral)
293
+ end
294
+
295
+ class SOAPNCName < XSD::XSDNCName
296
+ include SOAPBasetype
297
+ extend SOAPModuleUtils
298
+ SOAPENCType = QName.new(EncodingNamespace, NCNameLiteral)
299
+ end
300
+
301
+ class SOAPID < XSD::XSDID
302
+ include SOAPBasetype
303
+ extend SOAPModuleUtils
304
+ SOAPENCType = QName.new(EncodingNamespace, IDLiteral)
305
+ end
306
+
307
+ class SOAPIDREF < XSD::XSDIDREF
308
+ include SOAPBasetype
309
+ extend SOAPModuleUtils
310
+ SOAPENCType = QName.new(EncodingNamespace, IDREFLiteral)
311
+ end
312
+
313
+ class SOAPIDREFS < XSD::XSDIDREFS
314
+ include SOAPBasetype
315
+ extend SOAPModuleUtils
316
+ SOAPENCType = QName.new(EncodingNamespace, IDREFSLiteral)
317
+ end
318
+
319
+ class SOAPENTITY < XSD::XSDENTITY
320
+ include SOAPBasetype
321
+ extend SOAPModuleUtils
322
+ SOAPENCType = QName.new(EncodingNamespace, ENTITYLiteral)
323
+ end
324
+
325
+ class SOAPENTITIES < XSD::XSDENTITIES
326
+ include SOAPBasetype
327
+ extend SOAPModuleUtils
328
+ SOAPENCType = QName.new(EncodingNamespace, ENTITIESLiteral)
329
+ end
330
+
260
331
  class SOAPBoolean < XSD::XSDBoolean
261
332
  include SOAPBasetype
262
333
  extend SOAPModuleUtils
@@ -454,8 +525,9 @@ end
454
525
  ## Compound datatypes.
455
526
  #
456
527
  class SOAPStruct < XSD::NSDBase
457
- include SOAPCompoundtype
458
528
  include Enumerable
529
+ include SOAPCompoundtype
530
+ include SOAPNameAccessible
459
531
 
460
532
  public
461
533
 
@@ -466,7 +538,7 @@ public
466
538
  @data = []
467
539
  end
468
540
 
469
- def to_s()
541
+ def to_s
470
542
  str = ''
471
543
  self.each do |key, data|
472
544
  str << "#{key}: #{data}\n"
@@ -475,7 +547,12 @@ public
475
547
  end
476
548
 
477
549
  def add(name, value)
478
- add_member(name, value)
550
+ value = SOAPNil.new if value.nil?
551
+ @array.push(name)
552
+ value.elename = value.elename.dup_name(name)
553
+ @data.push(value)
554
+ value.parent = self if value.respond_to?(:parent=)
555
+ value
479
556
  end
480
557
 
481
558
  def [](idx)
@@ -554,17 +631,6 @@ public
554
631
  s.elename = elename
555
632
  s
556
633
  end
557
-
558
- private
559
-
560
- def add_member(name, value = nil)
561
- value = SOAPNil.new if value.nil?
562
- @array.push(name)
563
- value.elename = value.elename.dup_name(name)
564
- @data.push(value)
565
- value.parent = self if value.respond_to?(:parent=)
566
- value
567
- end
568
634
  end
569
635
 
570
636
 
@@ -572,6 +638,7 @@ end
572
638
  class SOAPElement
573
639
  include Enumerable
574
640
  include SOAPCompoundtype
641
+ include SOAPNameAccessible
575
642
 
576
643
  attr_accessor :type
577
644
  # Text interface.
@@ -582,8 +649,8 @@ class SOAPElement
582
649
  super()
583
650
  if elename.nil?
584
651
  elename = XSD::QName::EMPTY
585
- elsif !elename.is_a?(XSD::QName)
586
- elename = XSD::QName.new(nil, elename)
652
+ else
653
+ elename = Mapping.to_qname(elename)
587
654
  end
588
655
  @encodingstyle = LiteralNamespace
589
656
  @elename = elename
@@ -606,7 +673,11 @@ class SOAPElement
606
673
 
607
674
  # Element interfaces.
608
675
  def add(value)
609
- add_member(value.elename.name, value)
676
+ name = value.elename.name
677
+ @array.push(name)
678
+ @data.push(value)
679
+ value.parent = self if value.respond_to?(:parent=)
680
+ value
610
681
  end
611
682
 
612
683
  def [](idx)
@@ -639,7 +710,7 @@ class SOAPElement
639
710
  end
640
711
 
641
712
  def to_obj
642
- if members.empty?
713
+ if !have_member
643
714
  @text
644
715
  else
645
716
  hash = {}
@@ -697,6 +768,7 @@ class SOAPElement
697
768
  # if else:
698
769
  # value is added as an XML element with the key name.
699
770
  def self.from_obj(obj, namespace = nil)
771
+ return obj if obj.is_a?(SOAPElement)
700
772
  o = SOAPElement.new(nil)
701
773
  case obj
702
774
  when nil
@@ -752,15 +824,6 @@ class SOAPElement
752
824
  XSD::QName.new(namespace, obj.to_s)
753
825
  end
754
826
  end
755
-
756
- private
757
-
758
- def add_member(name, value)
759
- @array.push(name)
760
- @data.push(value)
761
- value.parent = self if value.respond_to?(:parent=)
762
- value
763
- end
764
827
  end
765
828
 
766
829
 
@@ -829,18 +892,14 @@ public
829
892
  if idxary.size != @rank
830
893
  raise ArgumentError.new("given #{idxary.size} params does not match rank: #{@rank}")
831
894
  end
832
-
833
895
  retrieve(idxary)
834
896
  end
835
897
 
836
898
  def []=(*idxary)
837
899
  value = idxary.slice!(-1)
838
-
839
900
  if idxary.size != @rank
840
- raise ArgumentError.new("given #{idxary.size} params(#{idxary})" +
841
- " does not match rank: #{@rank}")
901
+ raise ArgumentError.new("given #{idxary.size} params(#{idxary}) does not match rank: #{@rank}")
842
902
  end
843
-
844
903
  idx = 0
845
904
  while idx < idxary.size
846
905
  if idxary[idx] + 1 > @size[idx]
@@ -848,10 +907,8 @@ public
848
907
  end
849
908
  idx += 1
850
909
  end
851
-
852
910
  data = retrieve(idxary[0, idxary.size - 1])
853
911
  data[idxary.last] = value
854
-
855
912
  if value.is_a?(SOAPType)
856
913
  value.elename = ITEM_NAME
857
914
  # Sync type
@@ -861,7 +918,6 @@ public
861
918
  end
862
919
  value.type ||= @type
863
920
  end
864
-
865
921
  @offset = idxary
866
922
  value.parent = self if value.respond_to?(:parent=)
867
923
  offsetnext
@@ -961,7 +1017,7 @@ private
961
1017
  def traverse_data(data, rank = 1)
962
1018
  idx = 0
963
1019
  while idx < ranksize(rank)
964
- if rank < @rank
1020
+ if rank < @rank and data[idx]
965
1021
  traverse_data(data[idx], rank + 1) do |*v|
966
1022
  v[1, 0] = idx
967
1023
  yield(*v)
@@ -995,10 +1051,6 @@ private
995
1051
  end
996
1052
  end
997
1053
 
998
- # Module function
999
-
1000
- public
1001
-
1002
1054
  def self.decode(elename, type, arytype)
1003
1055
  typestr, nofary = parse_type(arytype.name)
1004
1056
  rank = nofary.count(',') + 1
@@ -1021,13 +1073,11 @@ public
1021
1073
  o
1022
1074
  end
1023
1075
 
1024
- private
1025
-
1026
1076
  def self.create_arytype(typename, rank)
1027
1077
  "#{typename}[" << ',' * (rank - 1) << ']'
1028
1078
  end
1029
1079
 
1030
- TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$')
1080
+ TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$', nil, 'NONE')
1031
1081
 
1032
1082
  def self.parse_type(string)
1033
1083
  TypeParseRegexp =~ string
@@ -60,7 +60,6 @@ public
60
60
  super(EleFaultName)
61
61
  @elename = EleFaultName
62
62
  @encodingstyle = EncodingNamespace
63
-
64
63
  if faultcode
65
64
  self.faultcode = faultcode
66
65
  self.faultstring = faultstring
@@ -78,8 +77,8 @@ public
78
77
  end
79
78
 
80
79
  def encode(generator, ns, attrs = {})
81
- SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace)
82
- SOAPGenerator.assign_ns(attrs, ns, EncodingNamespace)
80
+ Generator.assign_ns(attrs, ns, EnvelopeNamespace)
81
+ Generator.assign_ns(attrs, ns, EncodingNamespace)
83
82
  attrs[ns.name(AttrEncodingStyleName)] = EncodingNamespace
84
83
  name = ns.name(@elename)
85
84
  generator.encode_tag(name, attrs)
@@ -139,7 +138,6 @@ class SOAPBody < SOAPStruct
139
138
  return node
140
139
  end
141
140
  end
142
-
143
141
  raise Parser::FormatDecodeError.new('no root element')
144
142
  end
145
143
  end
@@ -171,7 +169,10 @@ public
171
169
  attrs.each do |key, value|
172
170
  @element.extraattr[key] = value
173
171
  end
174
- @element.extraattr[AttrMustUnderstandName] = (@mustunderstand ? '1' : '0')
172
+ # to remove mustUnderstand attribute, set it to nil
173
+ unless @mustunderstand.nil?
174
+ @element.extraattr[AttrMustUnderstandName] = (@mustunderstand ? '1' : '0')
175
+ end
175
176
  if @encodingstyle
176
177
  @element.extraattr[AttrEncodingStyleName] = @encodingstyle
177
178
  end
@@ -209,9 +210,11 @@ class SOAPHeader < SOAPStruct
209
210
 
210
211
  def add(name, value)
211
212
  actor = value.extraattr[AttrActorName]
212
- mu = (value.extraattr[AttrMustUnderstandName] == '1')
213
+ mu = value.extraattr[AttrMustUnderstandName]
213
214
  encstyle = value.extraattr[AttrEncodingStyleName]
214
- item = SOAPHeaderItem.new(value, mu, encstyle, actor)
215
+ mu_value = mu.nil? ? nil : (mu == '1')
216
+ # to remove mustUnderstand attribute, set it to nil
217
+ item = SOAPHeaderItem.new(value, mu_value, encstyle, actor)
215
218
  super(name, item)
216
219
  end
217
220
 
@@ -257,7 +260,7 @@ class SOAPEnvelope < XSD::NSDBase
257
260
  end
258
261
 
259
262
  def encode(generator, ns, attrs = {})
260
- SOAPGenerator.assign_ns(attrs, ns, elename.namespace, SOAPNamespaceTag)
263
+ Generator.assign_ns(attrs, ns, elename.namespace)
261
264
  name = ns.name(@elename)
262
265
  generator.encode_tag(name, attrs)
263
266
  yield(@header) if @header and @header.encode?
@@ -94,12 +94,23 @@ class Handler
94
94
  def decode_epilogue
95
95
  end
96
96
 
97
- def encode_qname(attrs, ns, qname)
98
- unless qname.namespace.nil?
99
- SOAPGenerator.assign_ns(attrs, ns, qname.namespace)
100
- ns.name(qname)
97
+ def encode_attr_key(attrs, ns, qname)
98
+ if qname.namespace.nil?
99
+ qname.name
101
100
  else
101
+ unless ns.assigned_as_tagged?(qname.namespace)
102
+ Generator.assign_ns!(attrs, ns, qname.namespace)
103
+ end
104
+ ns.name_attr(qname)
105
+ end
106
+ end
107
+
108
+ def encode_qname(attrs, ns, qname)
109
+ if qname.namespace.nil?
102
110
  qname.name
111
+ else
112
+ Generator.assign_ns(attrs, ns, qname.namespace)
113
+ ns.name(qname)
103
114
  end
104
115
  end
105
116
  end
@@ -31,10 +31,9 @@ class LiteralHandler < Handler
31
31
  name = generator.encode_name(ns, data, attrs)
32
32
  data.extraattr.each do |key, value|
33
33
  next if !@generate_explicit_type and key == XSD::AttrTypeName
34
- # ToDo: check generator.attributeformdefault here
35
34
  keytag = key
36
35
  if key.is_a?(XSD::QName)
37
- keytag = encode_qname(attrs, ns, key)
36
+ keytag = encode_attr_key(attrs, ns, key)
38
37
  end
39
38
  if value.is_a?(XSD::QName)
40
39
  value = encode_qname(attrs, ns, value)
@@ -51,8 +50,7 @@ class LiteralHandler < Handler
51
50
  generator.encode_rawstring(data.to_s)
52
51
  when XSD::XSDString
53
52
  generator.encode_tag(name, attrs)
54
- str = data.to_s
55
- str = XSD::Charset.encoding_to_xml(str, @charset) if @charset
53
+ str = decode_str(data.to_s)
56
54
  generator.encode_string(str)
57
55
  when XSD::XSDAnySimpleType
58
56
  generator.encode_tag(name, attrs)
@@ -69,14 +67,16 @@ class LiteralHandler < Handler
69
67
  generator.encode_child(ns, child, data)
70
68
  end
71
69
  when SOAPElement
72
- # passes 2 times for simplifying namespace definition
73
- data.each do |key, value|
74
- if value.elename.namespace
75
- SOAPGenerator.assign_ns(attrs, ns, value.elename.namespace)
70
+ unless generator.use_default_namespace
71
+ # passes 2 times for simplifying namespace definition
72
+ data.each do |key, value|
73
+ if value.elename.namespace
74
+ Generator.assign_ns(attrs, ns, value.elename.namespace)
75
+ end
76
76
  end
77
77
  end
78
78
  if data.text and data.text.is_a?(XSD::QName)
79
- SOAPGenerator.assign_ns(attrs, ns, data.text.namespace)
79
+ Generator.assign_ns(attrs, ns, data.text.namespace)
80
80
  end
81
81
  generator.encode_tag(name, attrs)
82
82
  if data.text
@@ -85,7 +85,7 @@ class LiteralHandler < Handler
85
85
  else
86
86
  text = data.text
87
87
  end
88
- generator.encode_rawstring(text)
88
+ generator.encode_string(text)
89
89
  end
90
90
  data.each do |key, value|
91
91
  generator.encode_child(ns, value, data)
@@ -111,17 +111,16 @@ class LiteralHandler < Handler
111
111
  #
112
112
  def decode_tag(ns, elename, attrs, parent)
113
113
  @textbuf.clear
114
- extraattrs = decode_attrs(ns, attrs)
115
- if extraattrs[XSD::AttrNilName] == 'true'
114
+ if attrs[XSD::AttrNilName] == 'true'
116
115
  o = SOAPNil.decode(elename)
117
116
  else
118
117
  o = SOAPElement.decode(elename)
119
118
  end
120
- if definedtype = extraattrs[XSD::AttrTypeName]
119
+ if definedtype = attrs[XSD::AttrTypeName]
121
120
  o.type = ns.parse(definedtype)
122
121
  end
123
122
  o.parent = parent
124
- o.extraattr.update(extraattrs)
123
+ o.extraattr.update(attrs)
125
124
  decode_parent(parent, o)
126
125
  o
127
126
  end
@@ -138,15 +137,6 @@ class LiteralHandler < Handler
138
137
  @textbuf << text
139
138
  end
140
139
 
141
- def decode_attrs(ns, attrs)
142
- extraattr = {}
143
- attrs.each do |key, value|
144
- qname = ns.parse_local(key)
145
- extraattr[qname] = value
146
- end
147
- extraattr
148
- end
149
-
150
140
  def decode_prologue
151
141
  end
152
142
 
@@ -181,7 +171,7 @@ private
181
171
  case node
182
172
  when XSD::XSDString, SOAPElement
183
173
  if @charset
184
- node.set(XSD::Charset.encoding_from_xml(textbufstr, @charset))
174
+ node.set(decode_str(textbufstr))
185
175
  else
186
176
  node.set(textbufstr)
187
177
  end
@@ -189,6 +179,10 @@ private
189
179
  # Nothing to do...
190
180
  end
191
181
  end
182
+
183
+ def decode_str(str)
184
+ @charset ? XSD::Charset.encoding_from_xml(str, @charset) : str
185
+ end
192
186
  end
193
187
 
194
188
  LiteralHandler.new