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