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
@@ -65,12 +65,9 @@ class EncodedRegistry
|
|
65
65
|
return ret if ret
|
66
66
|
end
|
67
67
|
end
|
68
|
-
ancestors
|
69
|
-
|
70
|
-
|
71
|
-
ancestors.delete(::Kernel)
|
72
|
-
ancestors.each do |klass|
|
73
|
-
if map = @obj2soap[klass]
|
68
|
+
klass.ancestors.each do |baseclass|
|
69
|
+
next if baseclass == klass
|
70
|
+
if map = @obj2soap[baseclass]
|
74
71
|
map.each do |soap_class, factory, info|
|
75
72
|
if info[:derived_class]
|
76
73
|
ret = factory.obj2soap(soap_class, obj, info, @registry)
|
@@ -126,6 +123,7 @@ class EncodedRegistry
|
|
126
123
|
|
127
124
|
StringFactory = StringFactory_.new
|
128
125
|
BasetypeFactory = BasetypeFactory_.new
|
126
|
+
FixnumFactory = FixnumFactory_.new
|
129
127
|
DateTimeFactory = DateTimeFactory_.new
|
130
128
|
ArrayFactory = ArrayFactory_.new
|
131
129
|
Base64Factory = Base64Factory_.new
|
@@ -149,6 +147,7 @@ class EncodedRegistry
|
|
149
147
|
{:derived_class => true}],
|
150
148
|
[::Float, ::SOAP::SOAPFloat, BasetypeFactory,
|
151
149
|
{:derived_class => true}],
|
150
|
+
[::Fixnum, ::SOAP::SOAPInt, FixnumFactory],
|
152
151
|
[::Integer, ::SOAP::SOAPInt, BasetypeFactory,
|
153
152
|
{:derived_class => true}],
|
154
153
|
[::Integer, ::SOAP::SOAPLong, BasetypeFactory,
|
@@ -188,8 +187,10 @@ class EncodedRegistry
|
|
188
187
|
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
189
188
|
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
190
189
|
|
191
|
-
[::Hash, ::SOAP::SOAPArray, HashFactory
|
192
|
-
|
190
|
+
[::Hash, ::SOAP::SOAPArray, HashFactory,
|
191
|
+
{:derived_class => true}],
|
192
|
+
[::Hash, ::SOAP::SOAPStruct, HashFactory,
|
193
|
+
{:derived_class => true}],
|
193
194
|
|
194
195
|
[::Array, ::SOAP::SOAPArray, ArrayFactory,
|
195
196
|
{:derived_class => true}],
|
@@ -212,6 +213,7 @@ class EncodedRegistry
|
|
212
213
|
{:derived_class => true}],
|
213
214
|
[::Float, ::SOAP::SOAPFloat, BasetypeFactory,
|
214
215
|
{:derived_class => true}],
|
216
|
+
[::Fixnum, ::SOAP::SOAPInt, FixnumFactory],
|
215
217
|
[::Integer, ::SOAP::SOAPInt, BasetypeFactory,
|
216
218
|
{:derived_class => true}],
|
217
219
|
[::Integer, ::SOAP::SOAPLong, BasetypeFactory,
|
@@ -324,7 +326,7 @@ private
|
|
324
326
|
|
325
327
|
def _obj2soap(obj, type_qname = nil)
|
326
328
|
ret = nil
|
327
|
-
if obj.is_a?(
|
329
|
+
if obj.is_a?(SOAPCompoundtype)
|
328
330
|
obj.replace do |ele|
|
329
331
|
Mapping._obj2soap(ele, self)
|
330
332
|
end
|
@@ -334,6 +336,7 @@ private
|
|
334
336
|
elsif type_qname && type = TypeMap[type_qname]
|
335
337
|
return base2soap(obj, type)
|
336
338
|
end
|
339
|
+
cause = nil
|
337
340
|
begin
|
338
341
|
if definition = schema_definition_from_class(obj.class)
|
339
342
|
return stubobj2soap(obj, definition)
|
@@ -342,6 +345,7 @@ private
|
|
342
345
|
@default_factory.obj2soap(nil, obj, nil, self)
|
343
346
|
return ret if ret
|
344
347
|
rescue MappingError
|
348
|
+
cause = $!
|
345
349
|
end
|
346
350
|
if @excn_handler_obj2soap
|
347
351
|
ret = @excn_handler_obj2soap.call(obj) { |yield_obj|
|
@@ -349,7 +353,7 @@ private
|
|
349
353
|
}
|
350
354
|
return ret if ret
|
351
355
|
end
|
352
|
-
raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.")
|
356
|
+
raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.", cause)
|
353
357
|
end
|
354
358
|
|
355
359
|
# Might return nil as a mapping result.
|
@@ -365,7 +369,7 @@ private
|
|
365
369
|
else
|
366
370
|
klass = definition.class_for if definition
|
367
371
|
end
|
368
|
-
if definition and node.is_a?(::SOAP::
|
372
|
+
if definition and node.is_a?(::SOAP::SOAPNameAccessible)
|
369
373
|
return elesoap2stubobj(node, klass, definition)
|
370
374
|
end
|
371
375
|
if node.extraattr.key?(RubyTypeName)
|
@@ -376,15 +380,17 @@ private
|
|
376
380
|
return obj if conv
|
377
381
|
conv, obj = @default_factory.soap2obj(nil, node, nil, self)
|
378
382
|
return obj if conv
|
383
|
+
cause = nil
|
379
384
|
if @excn_handler_soap2obj
|
380
385
|
begin
|
381
386
|
return @excn_handler_soap2obj.call(node) { |yield_node|
|
382
387
|
Mapping._soap2obj(yield_node, self)
|
383
388
|
}
|
384
389
|
rescue Exception
|
390
|
+
cause = $!
|
385
391
|
end
|
386
392
|
end
|
387
|
-
raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.")
|
393
|
+
raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.", cause)
|
388
394
|
end
|
389
395
|
|
390
396
|
def addiv2obj(obj, attr)
|
@@ -513,7 +519,7 @@ private
|
|
513
519
|
end
|
514
520
|
end
|
515
521
|
if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
|
516
|
-
|
522
|
+
Array.instance_method(:replace).bind(obj).call(vars.values[0])
|
517
523
|
else
|
518
524
|
Mapping.set_attributes(obj, vars)
|
519
525
|
end
|
data/lib/soap/mapping/factory.rb
CHANGED
@@ -105,8 +105,7 @@ class StringFactory_ < Factory
|
|
105
105
|
return nil
|
106
106
|
end
|
107
107
|
begin
|
108
|
-
|
109
|
-
encoded = XSD::Charset.encoding_conv(obj, externalces,
|
108
|
+
encoded = XSD::Charset.encoding_conv(obj, Mapping.external_ces,
|
110
109
|
XSD::Charset.encoding)
|
111
110
|
soap_obj = soap_class.new(encoded)
|
112
111
|
rescue XSD::ValueSpaceError
|
@@ -119,13 +118,30 @@ class StringFactory_ < Factory
|
|
119
118
|
def soap2obj(obj_class, node, info, map)
|
120
119
|
obj = Mapping.create_empty_object(obj_class)
|
121
120
|
decoded = XSD::Charset.encoding_conv(node.data, XSD::Charset.encoding,
|
122
|
-
|
121
|
+
Mapping.external_ces)
|
123
122
|
obj.replace(decoded)
|
124
123
|
mark_unmarshalled_obj(node, obj)
|
125
124
|
return true, obj
|
126
125
|
end
|
127
126
|
end
|
128
127
|
|
128
|
+
class FixnumFactory_ < Factory
|
129
|
+
def obj2soap(soap_class, obj, info, map)
|
130
|
+
soap_obj = nil
|
131
|
+
begin
|
132
|
+
soap_obj = soap_class.new(obj)
|
133
|
+
rescue XSD::ValueSpaceError
|
134
|
+
return nil
|
135
|
+
end
|
136
|
+
soap_obj
|
137
|
+
end
|
138
|
+
|
139
|
+
def soap2obj(obj_class, node, info, map)
|
140
|
+
obj = node.data
|
141
|
+
return true, obj
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
129
145
|
class BasetypeFactory_ < Factory
|
130
146
|
def initialize(allow_original_mapping = false)
|
131
147
|
super()
|
@@ -48,9 +48,11 @@ class LiteralRegistry
|
|
48
48
|
|
49
49
|
# node should be a SOAPElement
|
50
50
|
def soap2obj(node, obj_class = nil)
|
51
|
+
cause = nil
|
51
52
|
begin
|
52
53
|
return any2obj(node, obj_class)
|
53
54
|
rescue MappingError
|
55
|
+
cause = $!
|
54
56
|
end
|
55
57
|
if @excn_handler_soap2obj
|
56
58
|
begin
|
@@ -60,7 +62,7 @@ class LiteralRegistry
|
|
60
62
|
rescue Exception
|
61
63
|
end
|
62
64
|
end
|
63
|
-
raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object")
|
65
|
+
raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object", cause)
|
64
66
|
end
|
65
67
|
|
66
68
|
private
|
@@ -76,7 +78,10 @@ private
|
|
76
78
|
if obj.is_a?(SOAP::Mapping::Object)
|
77
79
|
return mappingobj2soap(obj, qname)
|
78
80
|
end
|
79
|
-
class_definition = schema_definition_from_class(
|
81
|
+
class_definition = schema_definition_from_class(obj.class)
|
82
|
+
if class_definition.nil? and obj_class
|
83
|
+
class_definition = schema_definition_from_class(obj_class)
|
84
|
+
end
|
80
85
|
elename_definition = schema_definition_from_elename(qname)
|
81
86
|
if !class_definition and !elename_definition
|
82
87
|
# no definition found
|
@@ -122,25 +127,25 @@ private
|
|
122
127
|
end
|
123
128
|
|
124
129
|
def stubobj2soap(obj, qname, definition)
|
125
|
-
if obj.
|
130
|
+
if obj.nil?
|
131
|
+
ele = SOAPNil.new
|
132
|
+
ele.elename = qname
|
133
|
+
elsif obj.is_a?(::String)
|
126
134
|
ele = SOAPElement.new(qname, obj)
|
127
135
|
else
|
128
136
|
ele = SOAPElement.new(qname)
|
129
137
|
end
|
130
138
|
ele.qualified = definition.qualified
|
131
|
-
if definition.type
|
139
|
+
if definition.type and (definition.basetype or Mapping.root_type_hint)
|
140
|
+
Mapping.reset_root_type_hint
|
132
141
|
ele.extraattr[XSD::AttrTypeName] = definition.type
|
133
142
|
end
|
134
143
|
if qname.nil? and definition.elename
|
135
144
|
ele.elename = definition.elename
|
136
145
|
end
|
146
|
+
return ele if obj.nil?
|
137
147
|
stubobj2soap_elements(obj, ele, definition.elements)
|
138
|
-
|
139
|
-
definition.attributes.each do |qname, param|
|
140
|
-
at = Mapping.get_attribute(obj, XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name))
|
141
|
-
ele.extraattr[qname] = at
|
142
|
-
end
|
143
|
-
end
|
148
|
+
add_definedattributes2soap(obj, ele, definition)
|
144
149
|
ele
|
145
150
|
end
|
146
151
|
|
@@ -174,8 +179,12 @@ private
|
|
174
179
|
added = false
|
175
180
|
else
|
176
181
|
if child.respond_to?(:each) and definition.as_array?
|
177
|
-
child.
|
178
|
-
|
182
|
+
if child.empty?
|
183
|
+
added = false
|
184
|
+
else
|
185
|
+
child.each do |item|
|
186
|
+
ele.add(definedobj2soap(item, definition))
|
187
|
+
end
|
179
188
|
end
|
180
189
|
else
|
181
190
|
ele.add(definedobj2soap(child, definition))
|
@@ -197,7 +206,9 @@ private
|
|
197
206
|
ele.add(obj2soap(value, key))
|
198
207
|
end
|
199
208
|
end
|
200
|
-
|
209
|
+
obj.__xmlattr.each do |key, value|
|
210
|
+
ele.extraattr[key] = value
|
211
|
+
end
|
201
212
|
ele
|
202
213
|
end
|
203
214
|
|
@@ -219,7 +230,7 @@ private
|
|
219
230
|
if is_compound
|
220
231
|
if definition
|
221
232
|
return elesoap2stubobj(node, obj_class, definition)
|
222
|
-
|
233
|
+
elsif node.is_a?(::SOAP::SOAPNameAccessible)
|
223
234
|
return elesoap2plainobj(node)
|
224
235
|
end
|
225
236
|
end
|
@@ -230,8 +241,10 @@ private
|
|
230
241
|
|
231
242
|
def elesoap2stubobj(node, obj_class, definition)
|
232
243
|
obj = nil
|
233
|
-
if obj_class
|
244
|
+
if obj_class == ::String
|
234
245
|
obj = node.text
|
246
|
+
elsif obj_class < ::String
|
247
|
+
obj = obj_class.new(node.text)
|
235
248
|
else
|
236
249
|
obj = Mapping.create_empty_object(obj_class)
|
237
250
|
add_elesoap2stubobj(node, obj, definition)
|
@@ -242,7 +255,7 @@ private
|
|
242
255
|
|
243
256
|
def elesoap2plainobj(node)
|
244
257
|
obj = nil
|
245
|
-
if node.
|
258
|
+
if !node.have_member
|
246
259
|
obj = base2obj(node, ::SOAP::SOAPString)
|
247
260
|
else
|
248
261
|
obj = anytype2obj(node)
|
@@ -256,9 +269,7 @@ private
|
|
256
269
|
if node.is_a?(::SOAP::SOAPBasetype)
|
257
270
|
return node.data
|
258
271
|
end
|
259
|
-
|
260
|
-
obj = klass.new
|
261
|
-
obj
|
272
|
+
::SOAP::Mapping::Object.new
|
262
273
|
end
|
263
274
|
|
264
275
|
def add_elesoap2stubobj(node, obj, definition)
|
@@ -280,7 +291,7 @@ private
|
|
280
291
|
end
|
281
292
|
end
|
282
293
|
if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
|
283
|
-
|
294
|
+
Array.instance_method(:replace).bind(obj).call(vars.values[0])
|
284
295
|
else
|
285
296
|
Mapping.set_attributes(obj, vars)
|
286
297
|
end
|
@@ -309,13 +320,12 @@ private
|
|
309
320
|
if attributes = definition.attributes
|
310
321
|
define_xmlattr(obj)
|
311
322
|
attributes.each do |qname, class_name|
|
312
|
-
|
313
|
-
next if
|
314
|
-
child = attr
|
323
|
+
child = node.extraattr[qname]
|
324
|
+
next if child.nil?
|
315
325
|
if class_name
|
316
326
|
klass = Mapping.class_from_name(class_name)
|
317
327
|
if klass.include?(::SOAP::SOAPBasetype)
|
318
|
-
child = klass.
|
328
|
+
child = klass.to_data(child)
|
319
329
|
end
|
320
330
|
end
|
321
331
|
obj.__xmlattr[qname] = child
|
@@ -343,18 +353,20 @@ private
|
|
343
353
|
# much memory for each singleton Object. just instance_eval instead of it.
|
344
354
|
def define_xmlattr_accessor(obj, qname)
|
345
355
|
# untaint depends GenSupport.safemethodname
|
346
|
-
name =
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
356
|
+
name = Mapping.safemethodname('xmlattr_' + qname.name).untaint
|
357
|
+
unless obj.respond_to?(name)
|
358
|
+
# untaint depends QName#dump
|
359
|
+
qnamedump = qname.dump.untaint
|
360
|
+
obj.instance_eval <<-EOS
|
361
|
+
def #{name}
|
362
|
+
@__xmlattr[#{qnamedump}]
|
363
|
+
end
|
353
364
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
365
|
+
def #{name}=(value)
|
366
|
+
@__xmlattr[#{qnamedump}] = value
|
367
|
+
end
|
368
|
+
EOS
|
369
|
+
end
|
358
370
|
end
|
359
371
|
|
360
372
|
# Mapping.define_attr_accessor calls define_method with proc and it exhausts
|
data/lib/soap/mapping/mapping.rb
CHANGED
@@ -204,18 +204,20 @@ module Mapping
|
|
204
204
|
def self.const_from_name(name, lenient = false)
|
205
205
|
const = ::Object
|
206
206
|
name.sub(/\A::/, '').split('::').each do |const_str|
|
207
|
-
|
208
|
-
|
209
|
-
const = const.const_get(const_str)
|
210
|
-
next
|
211
|
-
end
|
212
|
-
rescue NameError
|
213
|
-
if lenient
|
214
|
-
const_str = XSD::CodeGen::GenSupport.safeconstname(const_str)
|
207
|
+
if /\A[A-Z]/ =~ const_str
|
208
|
+
begin
|
215
209
|
if const.const_defined?(const_str)
|
216
210
|
const = const.const_get(const_str)
|
217
211
|
next
|
218
212
|
end
|
213
|
+
rescue NameError
|
214
|
+
end
|
215
|
+
end
|
216
|
+
if lenient
|
217
|
+
const_str = Mapping.safeconstname(const_str)
|
218
|
+
if const.const_defined?(const_str)
|
219
|
+
const = const.const_get(const_str)
|
220
|
+
next
|
219
221
|
end
|
220
222
|
end
|
221
223
|
return nil
|
@@ -224,7 +226,11 @@ module Mapping
|
|
224
226
|
end
|
225
227
|
|
226
228
|
def self.class_from_name(name, lenient = false)
|
227
|
-
|
229
|
+
unless lenient
|
230
|
+
const = const_from_name_nonlenient(name)
|
231
|
+
else
|
232
|
+
const = const_from_name(name, true)
|
233
|
+
end
|
228
234
|
if const.is_a?(::Class)
|
229
235
|
const
|
230
236
|
else
|
@@ -233,7 +239,11 @@ module Mapping
|
|
233
239
|
end
|
234
240
|
|
235
241
|
def self.module_from_name(name, lenient = false)
|
236
|
-
|
242
|
+
unless lenient
|
243
|
+
const = const_from_name_nonlenient(name)
|
244
|
+
else
|
245
|
+
const = const_from_name(name, true)
|
246
|
+
end
|
237
247
|
if const.is_a?(::Module)
|
238
248
|
const
|
239
249
|
else
|
@@ -241,6 +251,15 @@ module Mapping
|
|
241
251
|
end
|
242
252
|
end
|
243
253
|
|
254
|
+
def self.const_from_name_nonlenient(name)
|
255
|
+
if Thread.current[:SOAPMapping]
|
256
|
+
Thread.current[:SOAPMapping][:ConstFromName][name] ||=
|
257
|
+
const_from_name(name)
|
258
|
+
else
|
259
|
+
const_from_name(name)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
244
263
|
def self.class2qname(klass)
|
245
264
|
name = schema_type_definition(klass)
|
246
265
|
namespace = schema_ns_definition(klass)
|
@@ -270,6 +289,14 @@ module Mapping
|
|
270
289
|
end
|
271
290
|
end
|
272
291
|
|
292
|
+
def self.to_qname(obj, ns = nil)
|
293
|
+
if obj.is_a?(XSD::QName)
|
294
|
+
obj
|
295
|
+
else
|
296
|
+
XSD::QName.new(ns, obj)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
273
300
|
def self.define_singleton_method(obj, name, &block)
|
274
301
|
sclass = (class << obj; self; end)
|
275
302
|
sclass.class_eval {
|
@@ -309,7 +336,7 @@ module Mapping
|
|
309
336
|
return obj.__send__(attr_name)
|
310
337
|
end
|
311
338
|
iv = obj.instance_variables
|
312
|
-
name =
|
339
|
+
name = Mapping.safevarname(attr_name)
|
313
340
|
if iv.include?("@#{name}")
|
314
341
|
return obj.instance_variable_get("@#{name}")
|
315
342
|
elsif iv.include?("@#{attr_name}")
|
@@ -331,7 +358,7 @@ module Mapping
|
|
331
358
|
else
|
332
359
|
values.each do |attr_name, value|
|
333
360
|
# untaint depends GenSupport.safevarname
|
334
|
-
name =
|
361
|
+
name = Mapping.safevarname(attr_name).untaint
|
335
362
|
setter = name + "="
|
336
363
|
if obj.respond_to?(setter)
|
337
364
|
obj.__send__(setter, value)
|
@@ -360,6 +387,33 @@ module Mapping
|
|
360
387
|
end
|
361
388
|
end
|
362
389
|
|
390
|
+
def self.safeconstname(name)
|
391
|
+
Thread.current[:SOAPMapping][:SafeConstName][name] ||=
|
392
|
+
XSD::CodeGen::GenSupport.safeconstname(name)
|
393
|
+
end
|
394
|
+
|
395
|
+
def self.safemethodname(name)
|
396
|
+
Thread.current[:SOAPMapping][:SafeMethodName][name] ||=
|
397
|
+
XSD::CodeGen::GenSupport.safemethodname(name)
|
398
|
+
end
|
399
|
+
|
400
|
+
def self.safevarname(name)
|
401
|
+
Thread.current[:SOAPMapping][:SafeVarName][name] ||=
|
402
|
+
XSD::CodeGen::GenSupport.safevarname(name)
|
403
|
+
end
|
404
|
+
|
405
|
+
def self.root_type_hint
|
406
|
+
Thread.current[:SOAPMapping][:RootTypeHint]
|
407
|
+
end
|
408
|
+
|
409
|
+
def self.reset_root_type_hint
|
410
|
+
Thread.current[:SOAPMapping][:RootTypeHint] = false
|
411
|
+
end
|
412
|
+
|
413
|
+
def self.external_ces
|
414
|
+
Thread.current[:SOAPMapping][:ExternalCES]
|
415
|
+
end
|
416
|
+
|
363
417
|
def self.schema_ns_definition(klass)
|
364
418
|
class_schema_variable(:schema_ns, klass)
|
365
419
|
end
|
@@ -388,17 +442,19 @@ module Mapping
|
|
388
442
|
if Thread.current[:SOAPMapping][:SchemaDefinition].key?(klass)
|
389
443
|
return Thread.current[:SOAPMapping][:SchemaDefinition][klass]
|
390
444
|
end
|
391
|
-
|
392
|
-
|
393
|
-
|
445
|
+
schema_ns = schema_ns_definition(klass)
|
446
|
+
schema_name = schema_name_definition(klass)
|
447
|
+
schema_type = schema_type_definition(klass)
|
394
448
|
qualified = schema_qualified_definition(klass)
|
395
449
|
elements = schema_element_definition(klass)
|
396
450
|
attributes = schema_attribute_definition(klass)
|
397
|
-
return nil if
|
451
|
+
return nil if schema_name.nil? and schema_type.nil?
|
452
|
+
schema_name = Mapping.to_qname(schema_name, schema_ns) if schema_name
|
453
|
+
schema_type = Mapping.to_qname(schema_type, schema_ns) if schema_type
|
398
454
|
definition = create_schema_definition(klass,
|
399
|
-
:
|
400
|
-
:
|
401
|
-
:
|
455
|
+
:schema_name => schema_name,
|
456
|
+
:schema_type => schema_type,
|
457
|
+
:is_anonymous => false,
|
402
458
|
:schema_qualified => qualified,
|
403
459
|
:schema_element => elements,
|
404
460
|
:schema_attribute => attributes
|
@@ -411,20 +467,27 @@ module Mapping
|
|
411
467
|
schema_ns = definition[:schema_ns]
|
412
468
|
schema_name = definition[:schema_name]
|
413
469
|
schema_type = definition[:schema_type]
|
470
|
+
is_anonymous = definition[:is_anonymous]
|
471
|
+
schema_basetype = definition[:schema_basetype]
|
472
|
+
# wrap if needed for backward compatibility
|
473
|
+
if schema_ns
|
474
|
+
schema_name = Mapping.to_qname(schema_name, schema_ns) if schema_name
|
475
|
+
schema_type = Mapping.to_qname(schema_type, schema_ns) if schema_type
|
476
|
+
# no need for schema_basetype bacause it's introduced later
|
477
|
+
end
|
414
478
|
schema_qualified = definition[:schema_qualified]
|
415
479
|
schema_element = definition[:schema_element]
|
416
480
|
schema_attributes = definition[:schema_attribute]
|
417
|
-
|
418
|
-
|
419
|
-
definition = SchemaDefinition.new(klass, elename, type, schema_qualified)
|
481
|
+
definition = SchemaDefinition.new(klass, schema_name, schema_type, is_anonymous, schema_qualified)
|
482
|
+
definition.basetype = schema_basetype
|
420
483
|
definition.attributes = schema_attributes
|
421
484
|
if schema_element
|
422
485
|
if schema_element.respond_to?(:is_concrete_definition) and
|
423
486
|
schema_element.is_concrete_definition
|
424
487
|
definition.elements = schema_element
|
425
488
|
else
|
426
|
-
default_ns =
|
427
|
-
default_ns ||=
|
489
|
+
default_ns = schema_name.namespace if schema_name
|
490
|
+
default_ns ||= schema_type.namespace if schema_type
|
428
491
|
definition.elements = parse_schema_definition(schema_element, default_ns)
|
429
492
|
if klass < ::Array
|
430
493
|
definition.elements.set_array
|
@@ -520,7 +583,12 @@ module Mapping
|
|
520
583
|
data[:MarshalKey] = {}
|
521
584
|
data[:ExternalCES] = opt[:external_ces] || XSD::Charset.encoding
|
522
585
|
data[:NoReference] = opt[:no_reference]
|
586
|
+
data[:RootTypeHint] = opt[:root_type_hint]
|
523
587
|
data[:SchemaDefinition] = {}
|
588
|
+
data[:SafeConstName] = {}
|
589
|
+
data[:SafeMethodName] = {}
|
590
|
+
data[:SafeVarName] = {}
|
591
|
+
data[:ConstFromName] = {}
|
524
592
|
yield
|
525
593
|
end
|
526
594
|
end
|