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
@@ -7,6 +7,7 @@
7
7
 
8
8
 
9
9
  require 'soap/encodingstyle/handler'
10
+ require 'soap/mapping/registry'
10
11
 
11
12
 
12
13
  module SOAP
@@ -150,8 +151,8 @@ class SOAPHandler < Handler
150
151
 
151
152
  def decode_tag(ns, elename, attrs, parent)
152
153
  @textbuf.clear
153
- is_nil, type, arytype, root, offset, position, href, id, extraattr =
154
- decode_attrs(ns, attrs)
154
+ is_nil, type, arytype, root, offset, position, href, id =
155
+ extract_attrs(ns, attrs)
155
156
  o = nil
156
157
  if is_nil
157
158
  o = SOAPNil.decode(elename)
@@ -159,9 +160,9 @@ class SOAPHandler < Handler
159
160
  o = SOAPReference.decode(elename, href)
160
161
  @refpool << o
161
162
  elsif @decode_typemap
162
- o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, extraattr)
163
+ o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, attrs)
163
164
  else
164
- o = decode_tag_by_type(ns, elename, type, parent.node, arytype, extraattr)
165
+ o = decode_tag_by_type(ns, elename, type, parent.node, arytype, attrs)
165
166
  end
166
167
 
167
168
  if o.is_a?(SOAPArray)
@@ -268,7 +269,7 @@ private
268
269
 
269
270
  if !parent || parent.encodingstyle != EncodingNamespace
270
271
  if @generate_explicit_type
271
- SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace)
272
+ Generator.assign_ns(attrs, ns, EnvelopeNamespace)
272
273
  attrs[ns.name(AttrEncodingStyleName)] = EncodingNamespace
273
274
  end
274
275
  data.encodingstyle = EncodingNamespace
@@ -278,13 +279,13 @@ private
278
279
  attrs[ns.name(XSD::AttrNilName)] = XSD::NilValue
279
280
  elsif @generate_explicit_type
280
281
  if data.type.namespace
281
- SOAPGenerator.assign_ns(attrs, ns, data.type.namespace)
282
+ Generator.assign_ns(attrs, ns, data.type.namespace)
282
283
  end
283
284
  if data.is_a?(SOAPArray)
284
285
  if data.arytype.namespace
285
- SOAPGenerator.assign_ns(attrs, ns, data.arytype.namespace)
286
+ Generator.assign_ns(attrs, ns, data.arytype.namespace)
286
287
  end
287
- SOAPGenerator.assign_ns(attrs, ns, EncodingNamespace)
288
+ Generator.assign_ns(attrs, ns, EncodingNamespace)
288
289
  attrs[ns.name(AttrArrayTypeName)] = ns.name(create_arytype(ns, data))
289
290
  if data.type.name
290
291
  attrs[ns.name(XSD::AttrTypeName)] = ns.name(data.type)
@@ -300,7 +301,7 @@ private
300
301
  data.extraattr.each do |key, value|
301
302
  keytag = key
302
303
  if key.is_a?(XSD::QName)
303
- keytag = encode_qname(attrs, ns, key)
304
+ keytag = encode_attr_key(attrs, ns, key)
304
305
  end
305
306
  if value.is_a?(XSD::QName)
306
307
  value = encode_qname(attrs, ns, value)
@@ -326,7 +327,7 @@ private
326
327
  end
327
328
  end
328
329
 
329
- def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr)
330
+ def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, attrs)
330
331
  o = nil
331
332
  if parent.class == SOAPBody
332
333
  # root element: should branch by root attribute?
@@ -350,29 +351,25 @@ private
350
351
  return decode_definedtype(elename, typename, typedef, arytypestr)
351
352
  end
352
353
  end
353
- return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
354
- extraattr)
354
+ return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs)
355
355
  end
356
356
 
357
357
  if parent.type == XSD::AnyTypeName
358
- return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
359
- extraattr)
358
+ return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs)
360
359
  end
361
360
 
362
361
  # parent.definedtype == nil means the parent is SOAPUnknown. SOAPUnknown
363
362
  # is generated by decode_tag_by_type when its type is anyType.
364
363
  parenttype = parent.definedtype || @decode_typemap[parent.type]
365
364
  unless parenttype
366
- return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
367
- extraattr)
365
+ return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs)
368
366
  end
369
367
 
370
368
  definedtype_name = parenttype.child_type(elename)
371
369
  if definedtype_name and (klass = TypeMap[definedtype_name])
372
370
  return decode_basetype(klass, elename)
373
371
  elsif definedtype_name == XSD::AnyTypeName
374
- return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
375
- extraattr)
372
+ return decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs)
376
373
  end
377
374
 
378
375
  if definedtype_name
@@ -438,11 +435,11 @@ private
438
435
  nil
439
436
  end
440
437
 
441
- def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, extraattr)
438
+ def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, attrs)
442
439
  if arytypestr
443
440
  type = typestr ? ns.parse(typestr) : ValueArrayName
444
441
  node = SOAPArray.decode(elename, type, ns.parse(arytypestr))
445
- node.extraattr.update(extraattr)
442
+ node.extraattr.update(attrs)
446
443
  return node
447
444
  end
448
445
 
@@ -461,12 +458,12 @@ private
461
458
 
462
459
  if klass = TypeMap[type]
463
460
  node = decode_basetype(klass, elename)
464
- node.extraattr.update(extraattr)
461
+ node.extraattr.update(attrs)
465
462
  return node
466
463
  end
467
464
 
468
465
  # Unknown type... Struct or String
469
- SOAPUnknown.new(self, elename, type, extraattr)
466
+ SOAPUnknown.new(self, elename, type, attrs)
470
467
  end
471
468
 
472
469
  def decode_textbuf(node, textbufstr)
@@ -500,63 +497,23 @@ private
500
497
  '1' => 1,
501
498
  '0' => 0
502
499
  }
503
- def decode_attrs(ns, attrs)
504
- is_nil = false
505
- type = nil
506
- arytype = nil
507
- root = nil
508
- offset = nil
509
- position = nil
510
- href = nil
511
- id = nil
512
- extraattr = {}
513
-
514
- attrs.each do |key, value|
515
- qname = ns.parse(key)
516
- case qname.namespace
517
- when XSD::InstanceNamespace
518
- case qname.name
519
- when XSD::NilLiteral
520
- is_nil = NilLiteralMap[value] or
521
- raise EncodingStyleError.new("cannot accept attribute value: #{value} as the value of xsi:#{XSD::NilLiteral} (expected 'true', 'false', '1', or '0')")
522
- next
523
- when XSD::AttrType
524
- type = value
525
- next
526
- end
527
- when EncodingNamespace
528
- case qname.name
529
- when AttrArrayType
530
- arytype = value
531
- next
532
- when AttrRoot
533
- root = RootLiteralMap[value] or
534
- raise EncodingStyleError.new(
535
- "illegal root attribute value: #{value}")
536
- next
537
- when AttrOffset
538
- offset = value
539
- next
540
- when AttrPosition
541
- position = value
542
- next
543
- end
544
- end
545
- if key == 'href'
546
- href = value
547
- next
548
- elsif key == 'id'
549
- id = value
550
- next
551
- end
552
- qname = ns.parse_local(key)
553
- extraattr[qname] = decode_attr_value(ns, qname, value)
554
- end
555
-
556
- return is_nil, type, arytype, root, offset, position, href, id, extraattr
500
+ def extract_attrs(ns, attrs)
501
+ is_nil = NilLiteralMap[attrs[XSD::AttrNilName]]
502
+ type = attrs[XSD::AttrTypeName]
503
+ arytype = attrs[AttrArrayTypeName]
504
+ root = attrs[AttrRootName]
505
+ offset = attrs[AttrOffsetName]
506
+ position = attrs[AttrPositionName]
507
+ href = attrs[AttrHrefName]
508
+ id = attrs[AttrIdName]
509
+ if attrs.key?(Mapping::RubyIVarName)
510
+ attrs[Mapping::RubyIVarName] =
511
+ decode_ref_value(ns, attrs[Mapping::RubyIVarName])
512
+ end
513
+ return is_nil, type, arytype, root, offset, position, href, id
557
514
  end
558
515
 
559
- def decode_attr_value(ns, qname, value)
516
+ def decode_ref_value(ns, value)
560
517
  if /\A#/ =~ value
561
518
  o = SOAPReference.decode(nil, value)
562
519
  @refpool << o
@@ -6,8 +6,8 @@
6
6
  # either the dual license version in 2003, or any later version.
7
7
 
8
8
 
9
- require 'xsd/ns'
10
9
  require 'soap/soap'
10
+ require 'soap/ns'
11
11
  require 'soap/baseData'
12
12
  require 'soap/encodingstyle/handler'
13
13
  require 'xsd/codegen/gensupport'
@@ -19,7 +19,7 @@ module SOAP
19
19
  ###
20
20
  ## CAUTION: MT-unsafe
21
21
  #
22
- class SOAPGenerator
22
+ class Generator
23
23
  include SOAP
24
24
  include XSD::CodeGen::GenSupport
25
25
 
@@ -31,6 +31,7 @@ public
31
31
  attr_accessor :default_encodingstyle
32
32
  attr_accessor :generate_explicit_type
33
33
  attr_accessor :use_numeric_character_reference
34
+ attr_accessor :use_default_namespace
34
35
 
35
36
  def initialize(opt = {})
36
37
  @reftarget = nil
@@ -39,29 +40,34 @@ public
39
40
  @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace
40
41
  @generate_explicit_type =
41
42
  opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true
42
- # elementformdefault is for default namespace usage controll
43
- # TODO: should be renamed
44
- @elementformdefault = opt[:elementformdefault]
43
+ @use_default_namespace = opt[:use_default_namespace]
45
44
  @attributeformdefault = opt[:attributeformdefault]
46
45
  @use_numeric_character_reference = opt[:use_numeric_character_reference]
47
46
  @indentstr = opt[:no_indent] ? '' : ' '
48
47
  @buf = @indent = @curr = nil
49
48
  @default_ns = opt[:default_ns]
49
+ @default_ns_tag = opt[:default_ns_tag]
50
50
  end
51
51
 
52
52
  def generate(obj, io = nil)
53
53
  @buf = io || ''
54
54
  @indent = ''
55
+ @encode_char_regexp = get_encode_char_regexp()
55
56
 
56
57
  prologue
57
58
  @handlers.each do |uri, handler|
58
59
  handler.encode_prologue
59
60
  end
60
61
 
61
- ns = XSD::NS.new
62
+ ns = SOAP::NS.new
62
63
  if @default_ns
63
64
  @default_ns.each_ns do |default_ns, default_tag|
64
- SOAPGenerator.assign_ns(obj.extraattr, ns, default_ns, default_tag)
65
+ Generator.assign_ns(obj.extraattr, ns, default_ns, default_tag)
66
+ end
67
+ end
68
+ if @default_ns_tag
69
+ @default_ns_tag.each_ns do |default_ns, default_tag|
70
+ ns.known_tag[default_ns] = default_tag
65
71
  end
66
72
  end
67
73
  @buf << xmldecl
@@ -124,7 +130,7 @@ public
124
130
  end
125
131
 
126
132
  def encode_element(ns, obj, parent)
127
- attrs = obj.extraattr.dup
133
+ attrs = obj.extraattr
128
134
  if obj.is_a?(SOAPBody)
129
135
  @reftarget = obj
130
136
  obj.encode(self, ns, attrs) do |child|
@@ -136,10 +142,9 @@ public
136
142
  else
137
143
  if obj.is_a?(SOAPEnvelope)
138
144
  # xsi:nil="true" can appear even if dumping without explicit type.
139
- SOAPGenerator.assign_ns(attrs, ns,
140
- XSD::InstanceNamespace, XSINamespaceTag)
145
+ Generator.assign_ns(attrs, ns, XSD::InstanceNamespace)
141
146
  if @generate_explicit_type
142
- SOAPGenerator.assign_ns(attrs, ns, XSD::Namespace, XSDNamespaceTag)
147
+ Generator.assign_ns(attrs, ns, XSD::Namespace)
143
148
  end
144
149
  end
145
150
  obj.encode(self, ns, attrs) do |child|
@@ -154,10 +159,10 @@ public
154
159
  if element_local?(data)
155
160
  data.elename.name
156
161
  else
157
- if @elementformdefault
158
- SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace, '')
162
+ if @use_default_namespace
163
+ Generator.assign_ns(attrs, ns, data.elename.namespace, '')
159
164
  else
160
- SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace)
165
+ Generator.assign_ns(attrs, ns, data.elename.namespace)
161
166
  end
162
167
  ns.name(data.elename)
163
168
  end
@@ -178,7 +183,7 @@ public
178
183
  end
179
184
  ary = []
180
185
  attrs.each do |key, value|
181
- ary << %Q[#{ key }="#{ value }"] unless value.nil?
186
+ ary << %Q[#{ key }="#{ get_encoded(value.to_s) }"]
182
187
  end
183
188
  case ary.size
184
189
  when 0
@@ -204,28 +209,8 @@ public
204
209
  @buf << str
205
210
  end
206
211
 
207
- EncodeMap = {
208
- '&' => '&amp;',
209
- '<' => '&lt;',
210
- '>' => '&gt;',
211
- '"' => '&quot;',
212
- '\'' => '&apos;',
213
- "\r" => '&#xd;'
214
- }
215
- EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]")
216
212
  def encode_string(str)
217
- if @use_numeric_character_reference and !XSD::Charset.is_us_ascii(str)
218
- str.gsub!(EncodeCharRegexp) { |c| EncodeMap[c] }
219
- @buf << str.unpack("U*").collect { |c|
220
- if c == 0x9 or c == 0xa or c == 0xd or (c >= 0x20 and c <= 0x7f)
221
- c.chr
222
- else
223
- sprintf("&#x%x;", c)
224
- end
225
- }.join
226
- else
227
- @buf << str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] }
228
- end
213
+ @buf << get_encoded(str)
229
214
  end
230
215
 
231
216
  def element_local?(element)
@@ -236,15 +221,20 @@ public
236
221
  if namespace.nil?
237
222
  raise FormatEncodeError.new("empty namespace")
238
223
  end
239
- unless ns.assigned?(namespace)
240
- tag = ns.assign(namespace, tag)
241
- if tag == ''
242
- attr = 'xmlns'
243
- else
244
- attr = "xmlns:#{tag}"
245
- end
246
- attrs[attr] = namespace
224
+ override_default_ns = (tag == '' and namespace != ns.default_namespace)
225
+ if override_default_ns or !ns.assigned?(namespace)
226
+ assign_ns!(attrs, ns, namespace, tag)
227
+ end
228
+ end
229
+
230
+ def self.assign_ns!(attrs, ns, namespace, tag = nil)
231
+ tag = ns.assign(namespace, tag)
232
+ if tag == ''
233
+ attr = 'xmlns'
234
+ else
235
+ attr = "xmlns:#{tag}"
247
236
  end
237
+ attrs[attr] = namespace
248
238
  end
249
239
 
250
240
  private
@@ -255,12 +245,46 @@ private
255
245
  def epilogue
256
246
  end
257
247
 
248
+ ENCODE_CHAR_REGEXP = {}
249
+
250
+ EncodeMap = {
251
+ '&' => '&amp;',
252
+ '<' => '&lt;',
253
+ '>' => '&gt;',
254
+ '"' => '&quot;',
255
+ '\'' => '&apos;',
256
+ "\r" => '&#xd;'
257
+ }
258
+
259
+ def get_encoded(str)
260
+ if @use_numeric_character_reference and !XSD::Charset.is_us_ascii(str)
261
+ str.gsub!(@encode_char_regexp) { |c| EncodeMap[c] }
262
+ str.unpack("U*").collect { |c|
263
+ if c == 0x9 or c == 0xa or c == 0xd or (c >= 0x20 and c <= 0x7f)
264
+ c.chr
265
+ else
266
+ sprintf("&#x%x;", c)
267
+ end
268
+ }.join
269
+ else
270
+ str.gsub(@encode_char_regexp) { |c| EncodeMap[c] }
271
+ end
272
+ end
273
+
274
+ def get_encode_char_regexp
275
+ ENCODE_CHAR_REGEXP[XSD::Charset.encoding] ||=
276
+ Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding)
277
+ end
278
+
258
279
  def find_handler(encodingstyle)
259
280
  unless @handlers.key?(encodingstyle)
260
- handler = SOAP::EncodingStyle::Handler.handler(encodingstyle).new(@charset)
261
- handler.generate_explicit_type = @generate_explicit_type
262
- handler.encode_prologue
263
- @handlers[encodingstyle] = handler
281
+ factory = SOAP::EncodingStyle::Handler.handler(encodingstyle)
282
+ if factory
283
+ handler = factory.new(@charset)
284
+ handler.generate_explicit_type = @generate_explicit_type
285
+ handler.encode_prologue
286
+ @handlers[encodingstyle] = handler
287
+ end
264
288
  end
265
289
  @handlers[encodingstyle]
266
290
  end
@@ -274,5 +298,7 @@ private
274
298
  end
275
299
  end
276
300
 
301
+ SOAPGenerator = Generator # for backward compatibility
302
+
277
303
 
278
304
  end
@@ -15,7 +15,7 @@ module Header
15
15
 
16
16
  class Handler
17
17
  attr_reader :elename
18
- attr_reader :mustunderstand
18
+ attr_accessor :mustunderstand
19
19
  attr_reader :encodingstyle
20
20
  attr_reader :target_actor
21
21
 
@@ -0,0 +1,47 @@
1
+ # SOAP4R - SOAP Mapping header item handler
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
+ require 'soap/header/handler'
10
+ require 'soap/mapping/mapping'
11
+
12
+
13
+ module SOAP
14
+ module Header
15
+
16
+
17
+ class MappingHandler < SOAP::Header::Handler
18
+ attr_accessor :registry
19
+
20
+ def initialize(elename, registry = nil)
21
+ super(elename)
22
+ @registry = registry
23
+ end
24
+
25
+ # Should return an Object for mapping
26
+ def on_mapping_outbound
27
+ nil
28
+ end
29
+
30
+ # Given header is a mapped Object
31
+ def on_mapping_inbound(obj, mustunderstand)
32
+ end
33
+
34
+ def on_outbound
35
+ obj = on_mapping_outbound
36
+ obj ? SOAP::Mapping.obj2soap(obj, @registry, @elename) : nil
37
+ end
38
+
39
+ def on_inbound(header, mustunderstand)
40
+ obj = SOAP::Mapping.soap2obj(header, @registry)
41
+ on_mapping_inbound(obj, mustunderstand)
42
+ end
43
+ end
44
+
45
+
46
+ end
47
+ end