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