soap4r 1.5.7 → 1.5.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|