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