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.
- data/bin/wsdl2ruby.rb +8 -2
- data/lib/soap/baseData.rb +93 -43
- data/lib/soap/element.rb +11 -8
- data/lib/soap/encodingstyle/handler.rb +15 -4
- data/lib/soap/encodingstyle/literalHandler.rb +18 -24
- data/lib/soap/encodingstyle/soapHandler.rb +34 -77
- data/lib/soap/generator.rb +74 -48
- data/lib/soap/header/handler.rb +1 -1
- data/lib/soap/header/mappinghandler.rb +47 -0
- data/lib/soap/mapping/encodedregistry.rb +19 -13
- data/lib/soap/mapping/factory.rb +19 -3
- data/lib/soap/mapping/literalregistry.rb +47 -35
- data/lib/soap/mapping/mapping.rb +92 -24
- data/lib/soap/mapping/registry.rb +34 -18
- data/lib/soap/mapping/schemadefinition.rb +8 -1
- data/lib/soap/mapping/typeMap.rb +18 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +8 -50
- data/lib/soap/mapping/wsdlliteralregistry.rb +45 -39
- data/lib/soap/nestedexception.rb +42 -0
- data/lib/soap/netHttpClient.rb +1 -0
- data/lib/soap/ns.rb +34 -0
- data/lib/soap/parser.rb +32 -29
- data/lib/soap/processor.rb +1 -1
- data/lib/soap/rpc/driver.rb +1 -0
- data/lib/soap/rpc/element.rb +18 -6
- data/lib/soap/rpc/httpserver.rb +38 -24
- data/lib/soap/rpc/proxy.rb +14 -11
- data/lib/soap/rpc/router.rb +4 -1
- data/lib/soap/soap.rb +7 -6
- data/lib/soap/wsdlDriver.rb +29 -8
- data/lib/tags +5690 -0
- data/lib/wsdl/definitions.rb +26 -40
- data/lib/wsdl/info.rb +11 -0
- data/lib/wsdl/parser.rb +2 -2
- data/lib/wsdl/soap/cgiStubCreator.rb +10 -5
- data/lib/wsdl/soap/classDefCreator.rb +140 -113
- data/lib/wsdl/soap/classDefCreatorSupport.rb +94 -12
- data/lib/wsdl/soap/classNameCreator.rb +54 -0
- data/lib/wsdl/soap/clientSkeltonCreator.rb +6 -5
- data/lib/wsdl/soap/complexType.rb +10 -1
- data/lib/wsdl/soap/definitions.rb +4 -0
- data/lib/wsdl/soap/driverCreator.rb +14 -6
- data/lib/wsdl/soap/element.rb +4 -0
- data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +11 -55
- data/lib/wsdl/soap/literalMappingRegistryCreator.rb +28 -126
- data/lib/wsdl/soap/mappingRegistryCreator.rb +9 -3
- data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +209 -94
- data/lib/wsdl/soap/methodDefCreator.rb +12 -16
- data/lib/wsdl/soap/servantSkeltonCreator.rb +3 -2
- data/lib/wsdl/soap/servletStubCreator.rb +107 -0
- data/lib/wsdl/soap/standaloneServerStubCreator.rb +10 -5
- data/lib/wsdl/soap/wsdl2ruby.rb +28 -13
- data/lib/wsdl/wsdl.rb +2 -1
- data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
- data/lib/wsdl/xmlSchema/attributeGroup.rb +86 -0
- data/lib/wsdl/xmlSchema/choice.rb +4 -1
- data/lib/wsdl/xmlSchema/complexContent.rb +1 -1
- data/lib/wsdl/xmlSchema/complexExtension.rb +9 -1
- data/lib/wsdl/xmlSchema/complexRestriction.rb +8 -0
- data/lib/wsdl/xmlSchema/complexType.rb +38 -5
- data/lib/wsdl/xmlSchema/data.rb +30 -7
- data/lib/wsdl/xmlSchema/element.rb +10 -2
- data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
- data/lib/wsdl/xmlSchema/group.rb +118 -0
- data/lib/wsdl/xmlSchema/import.rb +11 -23
- data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
- data/lib/wsdl/xmlSchema/include.rb +11 -17
- data/lib/wsdl/xmlSchema/length.rb +3 -1
- data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxlength.rb +3 -1
- data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/minlength.rb +3 -1
- data/lib/wsdl/xmlSchema/schema.rb +34 -0
- data/lib/wsdl/xmlSchema/sequence.rb +4 -1
- data/lib/wsdl/xmlSchema/simpleExtension.rb +8 -0
- data/lib/wsdl/xmlSchema/simpleRestriction.rb +49 -8
- data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
- data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
- data/lib/wsdl/xmlSchema/xsd2ruby.rb +13 -4
- data/lib/xsd/charset.rb +8 -6
- data/lib/xsd/codegen/classdef.rb +5 -0
- data/lib/xsd/codegen/moduledef.rb +17 -0
- data/lib/xsd/datatypes.rb +165 -20
- data/lib/xsd/mapping.rb +13 -5
- data/lib/xsd/namedelements.rb +8 -0
- data/lib/xsd/ns.rb +50 -14
- data/lib/xsd/qname.rb +3 -2
- data/lib/xsd/xmlparser.rb +4 -3
- data/test/soap/asp.net/test_aspdotnet.rb +1 -1
- data/test/soap/auth/test_basic.rb +4 -3
- data/test/soap/auth/test_digest.rb +4 -3
- data/test/soap/calc/test_calc.rb +6 -4
- data/test/soap/calc/test_calc2.rb +6 -4
- data/test/soap/calc/test_calc_cgi.rb +6 -4
- data/test/soap/fault/test_customfault.rb +6 -4
- data/test/soap/fault/test_soaparray.rb +35 -0
- data/test/soap/filter/test_filter.rb +2 -2
- data/test/soap/header/test_authheader.rb +2 -2
- data/test/soap/header/test_authheader_cgi.rb +3 -3
- data/test/soap/header/test_simplehandler.rb +2 -2
- data/test/soap/helloworld/test_helloworld.rb +6 -4
- data/test/soap/ssl/test_ssl.rb +1 -1
- data/test/soap/struct/test_struct.rb +2 -2
- data/test/soap/swa/test_file.rb +6 -4
- data/test/soap/test_basetype.rb +4 -4
- data/test/soap/test_cookie.rb +2 -2
- data/test/soap/test_custom_ns.rb +50 -8
- data/test/soap/test_custommap.rb +6 -4
- data/test/soap/test_empty.rb +6 -4
- data/test/soap/test_envelopenamespace.rb +2 -2
- data/test/soap/test_extraattr.rb +6 -7
- data/test/soap/test_generator.rb +27 -0
- data/test/soap/test_mapping.rb +10 -0
- data/test/soap/test_nestedexception.rb +56 -0
- data/test/soap/test_nil.rb +6 -4
- data/test/soap/test_no_indent.rb +6 -4
- data/test/soap/test_response_as_xml.rb +2 -2
- data/test/soap/test_streamhandler.rb +6 -3
- data/test/soap/test_styleuse.rb +2 -2
- data/test/soap/wsdlDriver/test_calc.rb +2 -2
- data/test/soap/wsdlDriver/test_document.rb +2 -2
- data/test/soap/wsdlDriver/test_simpletype.rb +2 -2
- data/test/wsdl/abstract/test_abstract.rb +1 -1
- data/test/wsdl/anonymous/expectedClassDef.rb +128 -0
- data/test/wsdl/anonymous/expectedDriver.rb +59 -0
- data/test/wsdl/anonymous/expectedMappingRegistry.rb +176 -0
- data/test/wsdl/anonymous/lp.wsdl +147 -0
- data/test/wsdl/anonymous/test_anonymous.rb +130 -0
- data/test/wsdl/any/expectedDriver.rb +3 -2
- data/test/wsdl/any/expectedEcho.rb +22 -2
- data/test/wsdl/any/expectedMappingRegistry.rb +63 -0
- data/test/wsdl/any/expectedService.rb +3 -1
- data/test/wsdl/any/test_any.rb +2 -7
- data/test/wsdl/axisArray/axisArray.wsdl +31 -4
- data/test/wsdl/axisArray/test_axisarray.rb +58 -3
- data/test/wsdl/choice/choice.wsdl +39 -0
- data/test/wsdl/choice/test_choice.rb +134 -7
- data/test/wsdl/complexcontent/test_echo.rb +1 -1
- data/test/wsdl/datetime/test_datetime.rb +2 -2
- data/test/wsdl/document/array/double.wsdl +45 -6
- data/test/wsdl/document/array/test_array.rb +68 -1
- data/test/wsdl/document/document.wsdl +2 -0
- data/test/wsdl/document/test_nosoapaction.rb +1 -1
- data/test/wsdl/document/test_number.rb +1 -1
- data/test/wsdl/document/test_rpc.rb +78 -9
- data/test/wsdl/fault/test_fault.rb +1 -1
- data/test/wsdl/fault/test_multifault.rb +1 -1
- data/test/wsdl/group/expectedClassdef.rb +58 -0
- data/test/wsdl/group/expectedDriver.rb +51 -0
- data/test/wsdl/group/expectedMappingRegistry.rb +67 -0
- data/test/wsdl/group/group.wsdl +88 -0
- data/test/wsdl/group/test_rpc.rb +145 -0
- data/test/wsdl/list/test_list.rb +1 -1
- data/test/wsdl/map/test_map.rb +2 -2
- data/test/wsdl/marshal/person_org.rb +5 -0
- data/test/wsdl/multiplefault.wsdl +11 -4
- data/test/wsdl/oneway/test_oneway.rb +1 -1
- data/test/wsdl/overload/test_overload.rb +1 -1
- data/test/wsdl/qualified/test_qualified.rb +1 -1
- data/test/wsdl/qualified/test_unqualified.rb +1 -1
- data/test/wsdl/raa/RAAService.rb +62 -57
- data/test/wsdl/raa/expectedClassDef.rb +100 -0
- data/test/wsdl/raa/expectedDriver.rb +96 -0
- data/test/wsdl/raa/expectedMappingRegistry.rb +121 -0
- data/test/wsdl/raa/test_raa.rb +54 -19
- data/test/wsdl/ref/expectedDriver.rb +1 -1
- data/test/wsdl/ref/expectedProduct.rb +101 -16
- data/test/wsdl/ref/test_ref.rb +2 -1
- data/test/wsdl/rpc/test_rpc.rb +1 -2
- data/test/wsdl/rpc/test_rpc_lit.rb +13 -13
- data/test/wsdl/simplecontent/test_simplecontent.rb +5 -5
- data/test/wsdl/simpletype/rpc/expectedDriver.rb +3 -2
- data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +2 -0
- data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +10 -17
- data/test/wsdl/simpletype/rpc/expectedService.rb +4 -2
- data/test/wsdl/simpletype/test_simpletype.rb +2 -2
- data/test/wsdl/soap/test_soapbodyparts.rb +2 -2
- data/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb +2 -0
- data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +3 -2
- data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +5 -9
- data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +4 -2
- data/test/wsdl/soap/wsdl2ruby/expectedService.rb +4 -2
- data/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb +6 -0
- data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +1 -1
- data/test/wsdl/soaptype/test_soaptype.rb +1 -1
- data/test/wsdl/test_multiplefault.rb +3 -1
- data/test/xsd/codegen/test_classdef.rb +30 -0
- data/test/xsd/test_ns.rb +21 -0
- data/test/xsd/test_xsd.rb +5 -4
- data/test/xsd/xsd2ruby/expected_mysample.rb +13 -2
- data/test/xsd/xsd2ruby/expected_mysample_mapping_registry.rb +5 -11
- data/test/xsd/xsd2ruby/section.xsd +8 -0
- metadata +40 -8
- data/test/wsdl/axisArray/itemList.rb +0 -14
- data/test/wsdl/raa/RAA.rb +0 -120
- data/test/wsdl/raa/RAAServant.rb +0 -107
- 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
|
154
|
-
|
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,
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
286
|
+
Generator.assign_ns(attrs, ns, data.arytype.namespace)
|
286
287
|
end
|
287
|
-
|
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 =
|
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,
|
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,
|
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(
|
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(
|
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,
|
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
|
504
|
-
is_nil =
|
505
|
-
type =
|
506
|
-
arytype =
|
507
|
-
root =
|
508
|
-
offset =
|
509
|
-
position =
|
510
|
-
href =
|
511
|
-
id =
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
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
|
516
|
+
def decode_ref_value(ns, value)
|
560
517
|
if /\A#/ =~ value
|
561
518
|
o = SOAPReference.decode(nil, value)
|
562
519
|
@refpool << o
|
data/lib/soap/generator.rb
CHANGED
@@ -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
|
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
|
-
|
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 =
|
62
|
+
ns = SOAP::NS.new
|
62
63
|
if @default_ns
|
63
64
|
@default_ns.each_ns do |default_ns, default_tag|
|
64
|
-
|
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
|
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
|
-
|
140
|
-
XSD::InstanceNamespace, XSINamespaceTag)
|
145
|
+
Generator.assign_ns(attrs, ns, XSD::InstanceNamespace)
|
141
146
|
if @generate_explicit_type
|
142
|
-
|
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 @
|
158
|
-
|
162
|
+
if @use_default_namespace
|
163
|
+
Generator.assign_ns(attrs, ns, data.elename.namespace, '')
|
159
164
|
else
|
160
|
-
|
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 }"]
|
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
|
-
'&' => '&',
|
209
|
-
'<' => '<',
|
210
|
-
'>' => '>',
|
211
|
-
'"' => '"',
|
212
|
-
'\'' => ''',
|
213
|
-
"\r" => '
'
|
214
|
-
}
|
215
|
-
EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]")
|
216
212
|
def encode_string(str)
|
217
|
-
|
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
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
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
|
+
'&' => '&',
|
252
|
+
'<' => '<',
|
253
|
+
'>' => '>',
|
254
|
+
'"' => '"',
|
255
|
+
'\'' => ''',
|
256
|
+
"\r" => '
'
|
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
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
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
|
data/lib/soap/header/handler.rb
CHANGED
@@ -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
|