soap2r 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 +137 -0
- data/bin/xsd2ruby.rb +90 -0
- data/lib/soap/attachment.rb +108 -0
- data/lib/soap/attrproxy.rb +34 -0
- data/lib/soap/baseData.rb +1094 -0
- data/lib/soap/element.rb +277 -0
- data/lib/soap/encodingstyle/aspDotNetHandler.rb +207 -0
- data/lib/soap/encodingstyle/handler.rb +120 -0
- data/lib/soap/encodingstyle/literalHandler.rb +195 -0
- data/lib/soap/encodingstyle/soapHandler.rb +559 -0
- data/lib/soap/filter.rb +13 -0
- data/lib/soap/filter/filterchain.rb +51 -0
- data/lib/soap/filter/handler.rb +31 -0
- data/lib/soap/filter/streamhandler.rb +29 -0
- data/lib/soap/generator.rb +299 -0
- data/lib/soap/header/handler.rb +61 -0
- data/lib/soap/header/handlerset.rb +70 -0
- data/lib/soap/header/mappinghandler.rb +47 -0
- data/lib/soap/header/simplehandler.rb +44 -0
- data/lib/soap/httpconfigloader.rb +141 -0
- data/lib/soap/mapping.rb +12 -0
- data/lib/soap/mapping/encodedregistry.rb +537 -0
- data/lib/soap/mapping/factory.rb +388 -0
- data/lib/soap/mapping/literalregistry.rb +391 -0
- data/lib/soap/mapping/mapping.rb +576 -0
- data/lib/soap/mapping/registry.rb +295 -0
- data/lib/soap/mapping/rubytypeFactory.rb +446 -0
- data/lib/soap/mapping/schemadefinition.rb +170 -0
- data/lib/soap/mapping/typeMap.rb +106 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +211 -0
- data/lib/soap/mapping/wsdlliteralregistry.rb +248 -0
- data/lib/soap/marshal.rb +59 -0
- data/lib/soap/mimemessage.rb +241 -0
- data/lib/soap/nestedexception.rb +42 -0
- data/lib/soap/netHttpClient.rb +241 -0
- data/lib/soap/ns.rb +34 -0
- data/lib/soap/parser.rb +252 -0
- data/lib/soap/processor.rb +66 -0
- data/lib/soap/property.rb +319 -0
- data/lib/soap/proxy.rb +14 -0
- data/lib/soap/rpc/cgistub.rb +247 -0
- data/lib/soap/rpc/driver.rb +221 -0
- data/lib/soap/rpc/element.rb +374 -0
- data/lib/soap/rpc/httpserver.rb +142 -0
- data/lib/soap/rpc/methodDef.rb +68 -0
- data/lib/soap/rpc/proxy.rb +572 -0
- data/lib/soap/rpc/router.rb +662 -0
- data/lib/soap/rpc/rpc.rb +25 -0
- data/lib/soap/rpc/soaplet.rb +200 -0
- data/lib/soap/rpc/standaloneServer.rb +43 -0
- data/lib/soap/soap.rb +151 -0
- data/lib/soap/streamHandler.rb +301 -0
- data/lib/soap/wsdlDriver.rb +164 -0
- data/lib/wsdl/binding.rb +65 -0
- data/lib/wsdl/data.rb +64 -0
- data/lib/wsdl/definitions.rb +236 -0
- data/lib/wsdl/documentation.rb +32 -0
- data/lib/wsdl/import.rb +80 -0
- data/lib/wsdl/importer.rb +38 -0
- data/lib/wsdl/info.rb +50 -0
- data/lib/wsdl/message.rb +54 -0
- data/lib/wsdl/operation.rb +151 -0
- data/lib/wsdl/operationBinding.rb +240 -0
- data/lib/wsdl/param.rb +93 -0
- data/lib/wsdl/parser.rb +164 -0
- data/lib/wsdl/part.rb +52 -0
- data/lib/wsdl/port.rb +66 -0
- data/lib/wsdl/portType.rb +75 -0
- data/lib/wsdl/service.rb +61 -0
- data/lib/wsdl/soap/address.rb +40 -0
- data/lib/wsdl/soap/binding.rb +49 -0
- data/lib/wsdl/soap/body.rb +58 -0
- data/lib/wsdl/soap/cgiStubCreator.rb +92 -0
- data/lib/wsdl/soap/classDefCreator.rb +433 -0
- data/lib/wsdl/soap/classDefCreatorSupport.rb +240 -0
- data/lib/wsdl/soap/classNameCreator.rb +54 -0
- data/lib/wsdl/soap/clientSkeltonCreator.rb +104 -0
- data/lib/wsdl/soap/complexType.rb +173 -0
- data/lib/wsdl/soap/data.rb +42 -0
- data/lib/wsdl/soap/definitions.rb +200 -0
- data/lib/wsdl/soap/driverCreator.rb +118 -0
- data/lib/wsdl/soap/element.rb +33 -0
- data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +73 -0
- data/lib/wsdl/soap/fault.rb +56 -0
- data/lib/wsdl/soap/header.rb +86 -0
- data/lib/wsdl/soap/headerfault.rb +56 -0
- data/lib/wsdl/soap/literalMappingRegistryCreator.rb +115 -0
- data/lib/wsdl/soap/mappingRegistryCreator.rb +58 -0
- data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +376 -0
- data/lib/wsdl/soap/methodDefCreator.rb +199 -0
- data/lib/wsdl/soap/operation.rb +112 -0
- data/lib/wsdl/soap/servantSkeltonCreator.rb +89 -0
- data/lib/wsdl/soap/servletStubCreator.rb +104 -0
- data/lib/wsdl/soap/standaloneServerStubCreator.rb +100 -0
- data/lib/wsdl/soap/wsdl2ruby.rb +217 -0
- data/lib/wsdl/types.rb +44 -0
- data/lib/wsdl/wsdl.rb +24 -0
- data/lib/wsdl/xmlSchema/all.rb +24 -0
- data/lib/wsdl/xmlSchema/annotation.rb +34 -0
- data/lib/wsdl/xmlSchema/any.rb +61 -0
- data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
- data/lib/wsdl/xmlSchema/attribute.rb +104 -0
- data/lib/wsdl/xmlSchema/attributeGroup.rb +68 -0
- data/lib/wsdl/xmlSchema/choice.rb +58 -0
- data/lib/wsdl/xmlSchema/complexContent.rb +97 -0
- data/lib/wsdl/xmlSchema/complexExtension.rb +119 -0
- data/lib/wsdl/xmlSchema/complexRestriction.rb +104 -0
- data/lib/wsdl/xmlSchema/complexType.rb +193 -0
- data/lib/wsdl/xmlSchema/content.rb +95 -0
- data/lib/wsdl/xmlSchema/data.rb +116 -0
- data/lib/wsdl/xmlSchema/element.rb +153 -0
- data/lib/wsdl/xmlSchema/enumeration.rb +36 -0
- data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
- data/lib/wsdl/xmlSchema/group.rb +100 -0
- data/lib/wsdl/xmlSchema/import.rb +53 -0
- data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
- data/lib/wsdl/xmlSchema/importer.rb +102 -0
- data/lib/wsdl/xmlSchema/include.rb +48 -0
- data/lib/wsdl/xmlSchema/length.rb +37 -0
- data/lib/wsdl/xmlSchema/list.rb +48 -0
- data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxlength.rb +37 -0
- data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/minlength.rb +37 -0
- data/lib/wsdl/xmlSchema/parser.rb +167 -0
- data/lib/wsdl/xmlSchema/pattern.rb +36 -0
- data/lib/wsdl/xmlSchema/ref.rb +33 -0
- data/lib/wsdl/xmlSchema/schema.rb +178 -0
- data/lib/wsdl/xmlSchema/sequence.rb +54 -0
- data/lib/wsdl/xmlSchema/simpleContent.rb +69 -0
- data/lib/wsdl/xmlSchema/simpleExtension.rb +62 -0
- data/lib/wsdl/xmlSchema/simpleRestriction.rb +132 -0
- data/lib/wsdl/xmlSchema/simpleType.rb +87 -0
- data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
- data/lib/wsdl/xmlSchema/union.rb +35 -0
- data/lib/wsdl/xmlSchema/unique.rb +34 -0
- data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
- data/lib/wsdl/xmlSchema/xsd2ruby.rb +174 -0
- data/lib/xsd/charset.rb +193 -0
- data/lib/xsd/codegen.rb +12 -0
- data/lib/xsd/codegen/classdef.rb +208 -0
- data/lib/xsd/codegen/commentdef.rb +34 -0
- data/lib/xsd/codegen/gensupport.rb +273 -0
- data/lib/xsd/codegen/methoddef.rb +70 -0
- data/lib/xsd/codegen/moduledef.rb +208 -0
- data/lib/xsd/datatypes.rb +1466 -0
- data/lib/xsd/datatypes1999.rb +20 -0
- data/lib/xsd/iconvcharset.rb +39 -0
- data/lib/xsd/mapping.rb +68 -0
- data/lib/xsd/namedelements.rb +132 -0
- data/lib/xsd/ns.rb +182 -0
- data/lib/xsd/qname.rb +79 -0
- data/lib/xsd/xmlparser.rb +76 -0
- data/lib/xsd/xmlparser/libxmlparser.rb +115 -0
- data/lib/xsd/xmlparser/parser.rb +100 -0
- data/lib/xsd/xmlparser/rexmlparser.rb +58 -0
- data/lib/xsd/xmlparser/xmlparser.rb +50 -0
- data/lib/xsd/xmlparser/xmlscanner.rb +149 -0
- metadata +224 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# SOAP4R - Mapping registry.
|
|
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/baseData'
|
|
10
|
+
require 'soap/mapping/mapping'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module SOAP
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
module Marshallable
|
|
17
|
+
# @@type_ns = Mapping::RubyCustomTypeNamespace
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
module Mapping
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
module MappedException; end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
RubyTypeName = XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType')
|
|
28
|
+
RubyExtendName = XSD::QName.new(RubyTypeInstanceNamespace, 'extends')
|
|
29
|
+
RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# For anyType object: SOAP::Mapping::Object not ::Object
|
|
33
|
+
class Object
|
|
34
|
+
def initialize
|
|
35
|
+
@__xmlele_type = {}
|
|
36
|
+
@__xmlele = []
|
|
37
|
+
@__xmlattr = {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def inspect
|
|
41
|
+
sprintf("#<%s:0x%x%s>", self.class.name, __id__,
|
|
42
|
+
@__xmlele.collect { |name, value| " #{name}=#{value.inspect}" }.join)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def __xmlattr
|
|
46
|
+
@__xmlattr
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def __xmlele
|
|
50
|
+
@__xmlele
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def [](qname)
|
|
54
|
+
qname = Mapping.to_qname(qname)
|
|
55
|
+
@__xmlele.each do |k, v|
|
|
56
|
+
return v if k == qname
|
|
57
|
+
end
|
|
58
|
+
# fallback
|
|
59
|
+
@__xmlele.each do |k, v|
|
|
60
|
+
return v if k.name == qname.name
|
|
61
|
+
end
|
|
62
|
+
nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def []=(qname, value)
|
|
66
|
+
qname = Mapping.to_qname(qname)
|
|
67
|
+
found = false
|
|
68
|
+
@__xmlele.each do |pair|
|
|
69
|
+
if pair[0] == qname
|
|
70
|
+
found = true
|
|
71
|
+
pair[1] = value
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
unless found
|
|
75
|
+
__define_attr_accessor(qname)
|
|
76
|
+
@__xmlele << [qname, value]
|
|
77
|
+
end
|
|
78
|
+
@__xmlele_type[qname] = :single
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def __add_xmlele_value(qname, value)
|
|
82
|
+
found = false
|
|
83
|
+
@__xmlele.map! do |k, v|
|
|
84
|
+
if k == qname
|
|
85
|
+
found = true
|
|
86
|
+
[k, __set_xmlele_value(k, v, value)]
|
|
87
|
+
else
|
|
88
|
+
[k, v]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
unless found
|
|
92
|
+
__define_attr_accessor(qname)
|
|
93
|
+
@__xmlele << [qname, value]
|
|
94
|
+
@__xmlele_type[qname] = :single
|
|
95
|
+
end
|
|
96
|
+
value
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def marshal_load(dumpobj)
|
|
100
|
+
__import(dumpobj)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
private
|
|
104
|
+
|
|
105
|
+
# Mapping.define_attr_accessor calls define_method with proc and it exhausts
|
|
106
|
+
# much memory for each singleton Object. just instance_eval instead of it.
|
|
107
|
+
def __define_attr_accessor(qname)
|
|
108
|
+
# untaint depends GenSupport.safemethodname
|
|
109
|
+
name = Mapping.safemethodname(qname.name).untaint
|
|
110
|
+
# untaint depends on QName#dump
|
|
111
|
+
qnamedump = qname.dump.untaint
|
|
112
|
+
singleton = false
|
|
113
|
+
unless self.respond_to?(name)
|
|
114
|
+
singleton = true
|
|
115
|
+
instance_eval <<-EOS
|
|
116
|
+
def #{name}
|
|
117
|
+
self[#{qnamedump}]
|
|
118
|
+
end
|
|
119
|
+
EOS
|
|
120
|
+
end
|
|
121
|
+
unless self.respond_to?(name + "=")
|
|
122
|
+
singleton = true
|
|
123
|
+
instance_eval <<-EOS
|
|
124
|
+
def #{name}=(value)
|
|
125
|
+
self[#{qnamedump}] = value
|
|
126
|
+
end
|
|
127
|
+
EOS
|
|
128
|
+
end
|
|
129
|
+
if singleton && !self.respond_to?(:marshal_dump)
|
|
130
|
+
instance_eval <<-EOS
|
|
131
|
+
def marshal_dump
|
|
132
|
+
__export
|
|
133
|
+
end
|
|
134
|
+
EOS
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def __set_xmlele_value(key, org, value)
|
|
139
|
+
case @__xmlele_type[key]
|
|
140
|
+
when :multi
|
|
141
|
+
org << value
|
|
142
|
+
org
|
|
143
|
+
when :single
|
|
144
|
+
@__xmlele_type[key] = :multi
|
|
145
|
+
[org, value]
|
|
146
|
+
else
|
|
147
|
+
raise RuntimeError.new("unknown type")
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def __export
|
|
152
|
+
dumpobj = ::SOAP::Mapping::Object.new
|
|
153
|
+
dumpobj.__xmlele.replace(@__xmlele)
|
|
154
|
+
dumpobj.__xmlattr.replace(@__xmlattr)
|
|
155
|
+
dumpobj
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def __import(dumpobj)
|
|
159
|
+
@__xmlele_type = {}
|
|
160
|
+
@__xmlele = []
|
|
161
|
+
@__xmlattr = {}
|
|
162
|
+
dumpobj.__xmlele.each do |qname, value|
|
|
163
|
+
__add_xmlele_value(qname, value)
|
|
164
|
+
end
|
|
165
|
+
@__xmlattr.replace(dumpobj.__xmlattr)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class MappingError < Error; end
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
module RegistrySupport
|
|
174
|
+
def initialize
|
|
175
|
+
super()
|
|
176
|
+
@class_schema_definition = {}
|
|
177
|
+
@class_elename_schema_definition = {}
|
|
178
|
+
@elename_schema_definition = {}
|
|
179
|
+
@type_schema_definition = {}
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def register(definition)
|
|
183
|
+
obj_class = definition[:class]
|
|
184
|
+
definition = Mapping.create_schema_definition(obj_class, definition)
|
|
185
|
+
# give complexType definition a priority explicitly
|
|
186
|
+
if !@class_schema_definition[obj_class] or definition.type
|
|
187
|
+
@class_schema_definition[obj_class] = definition
|
|
188
|
+
end
|
|
189
|
+
if definition.elename and !definition.is_anonymous?
|
|
190
|
+
@class_elename_schema_definition[obj_class] = definition
|
|
191
|
+
@elename_schema_definition[definition.elename] = definition
|
|
192
|
+
end
|
|
193
|
+
if definition.type
|
|
194
|
+
@type_schema_definition[definition.type] = definition
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def schema_definition_from_class(klass)
|
|
199
|
+
@class_schema_definition[klass] || Mapping.schema_definition_classdef(klass)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def elename_schema_definition_from_class(klass)
|
|
203
|
+
@class_elename_schema_definition[klass]
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def schema_definition_from_elename(qname)
|
|
207
|
+
@elename_schema_definition[qname]
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def schema_definition_from_type(type)
|
|
211
|
+
@type_schema_definition[type]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def find_node_definition(node)
|
|
215
|
+
schema_definition_from_type(node.type) ||
|
|
216
|
+
schema_definition_from_elename(node.elename) ||
|
|
217
|
+
find_schema_definition(node.elename.name) ||
|
|
218
|
+
find_schema_definition(node.type.name)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def find_schema_definition(name)
|
|
222
|
+
return nil unless name
|
|
223
|
+
typestr = Mapping.safeconstname(name)
|
|
224
|
+
obj_class = Mapping.class_from_name(typestr)
|
|
225
|
+
if obj_class
|
|
226
|
+
schema_definition_from_class(obj_class)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def add_attributes2soap(obj, ele)
|
|
231
|
+
if definition = Mapping.schema_definition_classdef(obj.class)
|
|
232
|
+
add_definedattributes2soap(obj, ele, definition)
|
|
233
|
+
elsif obj.respond_to?(:__xmlattr)
|
|
234
|
+
obj.__xmlattr.each do |key, value|
|
|
235
|
+
ele.extraattr[key] = value
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def add_definedattributes2soap(obj, ele, typedef)
|
|
241
|
+
if typedef.attributes
|
|
242
|
+
typedef.attributes.each do |qname, param|
|
|
243
|
+
value = get_xmlattr_value(obj, qname)
|
|
244
|
+
ele.extraattr[qname] = value unless value.nil?
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def get_xmlattr_value(obj, qname)
|
|
250
|
+
attrname = 'xmlattr_' + qname.name
|
|
251
|
+
value = Mapping.get_attribute(obj, attrname)
|
|
252
|
+
if value.nil?
|
|
253
|
+
attrname = Mapping.safemethodname('xmlattr_' + qname.name)
|
|
254
|
+
value = Mapping.get_attribute(obj, attrname)
|
|
255
|
+
end
|
|
256
|
+
value
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def base2soap(obj, type, qualified = nil)
|
|
260
|
+
return SOAPNil.new if obj.nil?
|
|
261
|
+
soap_obj = nil
|
|
262
|
+
if type <= XSD::XSDString
|
|
263
|
+
str = XSD::Charset.encoding_conv(obj.to_s, Mapping.external_ces,
|
|
264
|
+
XSD::Charset.encoding)
|
|
265
|
+
soap_obj = type.new(str)
|
|
266
|
+
else
|
|
267
|
+
soap_obj = type.new(obj)
|
|
268
|
+
end
|
|
269
|
+
soap_obj.qualified = qualified
|
|
270
|
+
soap_obj
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def base2obj(value, klass)
|
|
274
|
+
v = if value.respond_to?(:data)
|
|
275
|
+
value.data
|
|
276
|
+
elsif value.respond_to?(:text)
|
|
277
|
+
value.text
|
|
278
|
+
else
|
|
279
|
+
nil
|
|
280
|
+
end
|
|
281
|
+
if value.is_a?(klass)
|
|
282
|
+
v
|
|
283
|
+
else
|
|
284
|
+
klass.to_data(v)
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def is_stubobj_elements_for_array(vars)
|
|
289
|
+
vars.keys.size == 1 and vars.values[0].is_a?(::Array)
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
end
|
|
295
|
+
end
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
# SOAP4R - Ruby type mapping factory.
|
|
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
|
+
require 'continuation' if RUBY_VERSION.to_f >= 1.9
|
|
9
|
+
|
|
10
|
+
module SOAP
|
|
11
|
+
module Mapping
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RubytypeFactory < Factory
|
|
15
|
+
TYPE_STRING = XSD::QName.new(RubyTypeNamespace, 'String')
|
|
16
|
+
TYPE_TIME = XSD::QName.new(RubyTypeNamespace, 'Time')
|
|
17
|
+
TYPE_ARRAY = XSD::QName.new(RubyTypeNamespace, 'Array')
|
|
18
|
+
TYPE_REGEXP = XSD::QName.new(RubyTypeNamespace, 'Regexp')
|
|
19
|
+
TYPE_RANGE = XSD::QName.new(RubyTypeNamespace, 'Range')
|
|
20
|
+
TYPE_CLASS = XSD::QName.new(RubyTypeNamespace, 'Class')
|
|
21
|
+
TYPE_MODULE = XSD::QName.new(RubyTypeNamespace, 'Module')
|
|
22
|
+
TYPE_SYMBOL = XSD::QName.new(RubyTypeNamespace, 'Symbol')
|
|
23
|
+
TYPE_STRUCT = XSD::QName.new(RubyTypeNamespace, 'Struct')
|
|
24
|
+
TYPE_HASH = XSD::QName.new(RubyTypeNamespace, 'Map')
|
|
25
|
+
|
|
26
|
+
def initialize(config = {})
|
|
27
|
+
@config = config
|
|
28
|
+
@allow_untyped_struct = @config.key?(:allow_untyped_struct) ?
|
|
29
|
+
@config[:allow_untyped_struct] : true
|
|
30
|
+
@allow_original_mapping = @config.key?(:allow_original_mapping) ?
|
|
31
|
+
@config[:allow_original_mapping] : false
|
|
32
|
+
@string_factory = StringFactory_.new(true)
|
|
33
|
+
@basetype_factory = BasetypeFactory_.new(true)
|
|
34
|
+
@datetime_factory = DateTimeFactory_.new(true)
|
|
35
|
+
@array_factory = ArrayFactory_.new(true)
|
|
36
|
+
@hash_factory = HashFactory_.new(true)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def obj2soap(soap_class, obj, info, map)
|
|
40
|
+
param = nil
|
|
41
|
+
case obj
|
|
42
|
+
when ::String
|
|
43
|
+
unless @allow_original_mapping
|
|
44
|
+
return nil
|
|
45
|
+
end
|
|
46
|
+
param = @string_factory.obj2soap(SOAPString, obj, info, map)
|
|
47
|
+
if obj.class != String
|
|
48
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
49
|
+
end
|
|
50
|
+
addiv2soapattr(param, obj, map)
|
|
51
|
+
when ::Time
|
|
52
|
+
unless @allow_original_mapping
|
|
53
|
+
return nil
|
|
54
|
+
end
|
|
55
|
+
param = @datetime_factory.obj2soap(SOAPDateTime, obj, info, map)
|
|
56
|
+
if obj.class != Time
|
|
57
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
58
|
+
end
|
|
59
|
+
addiv2soapattr(param, obj, map)
|
|
60
|
+
when ::Array
|
|
61
|
+
unless @allow_original_mapping
|
|
62
|
+
return nil
|
|
63
|
+
end
|
|
64
|
+
param = @array_factory.obj2soap(nil, obj, info, map)
|
|
65
|
+
if obj.class != Array
|
|
66
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
67
|
+
end
|
|
68
|
+
addiv2soapattr(param, obj, map)
|
|
69
|
+
when ::NilClass
|
|
70
|
+
unless @allow_original_mapping
|
|
71
|
+
return nil
|
|
72
|
+
end
|
|
73
|
+
param = @basetype_factory.obj2soap(SOAPNil, obj, info, map)
|
|
74
|
+
addiv2soapattr(param, obj, map)
|
|
75
|
+
when ::FalseClass, ::TrueClass
|
|
76
|
+
unless @allow_original_mapping
|
|
77
|
+
return nil
|
|
78
|
+
end
|
|
79
|
+
param = @basetype_factory.obj2soap(SOAPBoolean, obj, info, map)
|
|
80
|
+
addiv2soapattr(param, obj, map)
|
|
81
|
+
when ::Integer
|
|
82
|
+
unless @allow_original_mapping
|
|
83
|
+
return nil
|
|
84
|
+
end
|
|
85
|
+
param = @basetype_factory.obj2soap(SOAPInt, obj, info, map)
|
|
86
|
+
param ||= @basetype_factory.obj2soap(SOAPInteger, obj, info, map)
|
|
87
|
+
param ||= @basetype_factory.obj2soap(SOAPDecimal, obj, info, map)
|
|
88
|
+
addiv2soapattr(param, obj, map)
|
|
89
|
+
when ::Float
|
|
90
|
+
unless @allow_original_mapping
|
|
91
|
+
return nil
|
|
92
|
+
end
|
|
93
|
+
param = @basetype_factory.obj2soap(SOAPDouble, obj, info, map)
|
|
94
|
+
if obj.class != Float
|
|
95
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
96
|
+
end
|
|
97
|
+
addiv2soapattr(param, obj, map)
|
|
98
|
+
when ::Hash
|
|
99
|
+
unless @allow_original_mapping
|
|
100
|
+
return nil
|
|
101
|
+
end
|
|
102
|
+
if obj.respond_to?(:default_proc) && obj.default_proc
|
|
103
|
+
raise TypeError.new("cannot dump hash with default proc")
|
|
104
|
+
end
|
|
105
|
+
param = SOAPStruct.new(TYPE_HASH)
|
|
106
|
+
mark_marshalled_obj(obj, param)
|
|
107
|
+
if obj.class != Hash
|
|
108
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
109
|
+
end
|
|
110
|
+
obj.each do |key, value|
|
|
111
|
+
elem = SOAPStruct.new # Undefined type.
|
|
112
|
+
elem.add("key", Mapping._obj2soap(key, map))
|
|
113
|
+
elem.add("value", Mapping._obj2soap(value, map))
|
|
114
|
+
param.add("item", elem)
|
|
115
|
+
end
|
|
116
|
+
param.add('default', Mapping._obj2soap(obj.default, map))
|
|
117
|
+
addiv2soapattr(param, obj, map)
|
|
118
|
+
when ::Regexp
|
|
119
|
+
unless @allow_original_mapping
|
|
120
|
+
return nil
|
|
121
|
+
end
|
|
122
|
+
param = SOAPStruct.new(TYPE_REGEXP)
|
|
123
|
+
mark_marshalled_obj(obj, param)
|
|
124
|
+
if obj.class != Regexp
|
|
125
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
126
|
+
end
|
|
127
|
+
param.add('source', SOAPBase64.new(obj.source))
|
|
128
|
+
options = obj.options
|
|
129
|
+
param.add('options', SOAPInt.new(options))
|
|
130
|
+
addiv2soapattr(param, obj, map)
|
|
131
|
+
when ::Range
|
|
132
|
+
unless @allow_original_mapping
|
|
133
|
+
return nil
|
|
134
|
+
end
|
|
135
|
+
param = SOAPStruct.new(TYPE_RANGE)
|
|
136
|
+
mark_marshalled_obj(obj, param)
|
|
137
|
+
if obj.class != Range
|
|
138
|
+
param.extraattr[RubyTypeName] = obj.class.name
|
|
139
|
+
end
|
|
140
|
+
param.add('begin', Mapping._obj2soap(obj.begin, map))
|
|
141
|
+
param.add('end', Mapping._obj2soap(obj.end, map))
|
|
142
|
+
param.add('exclude_end', SOAP::SOAPBoolean.new(obj.exclude_end?))
|
|
143
|
+
addiv2soapattr(param, obj, map)
|
|
144
|
+
when ::Class
|
|
145
|
+
unless @allow_original_mapping
|
|
146
|
+
return nil
|
|
147
|
+
end
|
|
148
|
+
if obj.to_s[0] == ?#
|
|
149
|
+
raise TypeError.new("can't dump anonymous class #{obj}")
|
|
150
|
+
end
|
|
151
|
+
param = SOAPStruct.new(TYPE_CLASS)
|
|
152
|
+
mark_marshalled_obj(obj, param)
|
|
153
|
+
param.add('name', SOAPString.new(obj.name))
|
|
154
|
+
addiv2soapattr(param, obj, map)
|
|
155
|
+
when ::Module
|
|
156
|
+
unless @allow_original_mapping
|
|
157
|
+
return nil
|
|
158
|
+
end
|
|
159
|
+
if obj.to_s[0] == ?#
|
|
160
|
+
raise TypeError.new("can't dump anonymous module #{obj}")
|
|
161
|
+
end
|
|
162
|
+
param = SOAPStruct.new(TYPE_MODULE)
|
|
163
|
+
mark_marshalled_obj(obj, param)
|
|
164
|
+
param.add('name', SOAPString.new(obj.name))
|
|
165
|
+
addiv2soapattr(param, obj, map)
|
|
166
|
+
when ::Symbol
|
|
167
|
+
unless @allow_original_mapping
|
|
168
|
+
return nil
|
|
169
|
+
end
|
|
170
|
+
param = SOAPStruct.new(TYPE_SYMBOL)
|
|
171
|
+
mark_marshalled_obj(obj, param)
|
|
172
|
+
param.add('id', SOAPString.new(obj.id2name))
|
|
173
|
+
addiv2soapattr(param, obj, map)
|
|
174
|
+
when ::Struct
|
|
175
|
+
unless @allow_original_mapping
|
|
176
|
+
# treat it as an user defined class. [ruby-talk:104980]
|
|
177
|
+
#param = unknownobj2soap(soap_class, obj, info, map)
|
|
178
|
+
param = SOAPStruct.new(XSD::AnyTypeName)
|
|
179
|
+
mark_marshalled_obj(obj, param)
|
|
180
|
+
obj.members.each do |member|
|
|
181
|
+
param.add(Mapping.name2elename(member),
|
|
182
|
+
Mapping._obj2soap(obj[member], map))
|
|
183
|
+
end
|
|
184
|
+
else
|
|
185
|
+
param = SOAPStruct.new(TYPE_STRUCT)
|
|
186
|
+
mark_marshalled_obj(obj, param)
|
|
187
|
+
param.add('type', ele_type = SOAPString.new(obj.class.to_s))
|
|
188
|
+
ele_member = SOAPStruct.new
|
|
189
|
+
obj.members.each do |member|
|
|
190
|
+
ele_member.add(Mapping.name2elename(member),
|
|
191
|
+
Mapping._obj2soap(obj[member], map))
|
|
192
|
+
end
|
|
193
|
+
param.add('member', ele_member)
|
|
194
|
+
addiv2soapattr(param, obj, map)
|
|
195
|
+
end
|
|
196
|
+
when ::IO, ::Binding, ::Continuation, ::Data, ::Dir, ::File::Stat,
|
|
197
|
+
::MatchData, Method, ::Proc, ::Process::Status, ::Thread,
|
|
198
|
+
::ThreadGroup, ::UnboundMethod
|
|
199
|
+
return nil
|
|
200
|
+
when ::SOAP::Mapping::Object
|
|
201
|
+
param = SOAPStruct.new(XSD::AnyTypeName)
|
|
202
|
+
mark_marshalled_obj(obj, param)
|
|
203
|
+
obj.__xmlele.each do |key, value|
|
|
204
|
+
param.add(key.name, Mapping._obj2soap(value, map))
|
|
205
|
+
end
|
|
206
|
+
obj.__xmlattr.each do |key, value|
|
|
207
|
+
param.extraattr[key] = value
|
|
208
|
+
end
|
|
209
|
+
when ::Exception
|
|
210
|
+
typestr = Mapping.name2elename(obj.class.to_s)
|
|
211
|
+
param = SOAPStruct.new(XSD::QName.new(RubyTypeNamespace, typestr))
|
|
212
|
+
mark_marshalled_obj(obj, param)
|
|
213
|
+
param.add('message', Mapping._obj2soap(obj.message, map))
|
|
214
|
+
param.add('backtrace', Mapping._obj2soap(obj.backtrace, map))
|
|
215
|
+
addiv2soapattr(param, obj, map)
|
|
216
|
+
else
|
|
217
|
+
param = unknownobj2soap(soap_class, obj, info, map)
|
|
218
|
+
end
|
|
219
|
+
param
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def soap2obj(obj_class, node, info, map)
|
|
223
|
+
rubytype = node.extraattr[RubyTypeName]
|
|
224
|
+
if rubytype or node.type.namespace == RubyTypeNamespace
|
|
225
|
+
rubytype2obj(node, info, map, rubytype)
|
|
226
|
+
elsif node.type == XSD::AnyTypeName or node.type == XSD::AnySimpleTypeName
|
|
227
|
+
anytype2obj(node, info, map)
|
|
228
|
+
else
|
|
229
|
+
unknowntype2obj(node, info, map)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
private
|
|
234
|
+
|
|
235
|
+
def addiv2soapattr(node, obj, map)
|
|
236
|
+
return if obj.instance_variables.empty?
|
|
237
|
+
ivars = SOAPStruct.new # Undefined type.
|
|
238
|
+
setiv2soap(ivars, obj, map)
|
|
239
|
+
node.extraattr[RubyIVarName] = ivars
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def unknownobj2soap(soap_class, obj, info, map)
|
|
243
|
+
if anonymous_class?(obj)
|
|
244
|
+
raise TypeError.new("can't dump anonymous class #{obj}")
|
|
245
|
+
end
|
|
246
|
+
singleton_class = class << obj; self; end
|
|
247
|
+
if !obj.singleton_methods(true).empty? or
|
|
248
|
+
!singleton_class.instance_variables.empty?
|
|
249
|
+
raise TypeError.new("singleton can't be dumped #{obj}")
|
|
250
|
+
end
|
|
251
|
+
if !(singleton_class.ancestors - obj.class.ancestors).empty?
|
|
252
|
+
typestr = Mapping.name2elename(obj.class.to_s)
|
|
253
|
+
type = XSD::QName.new(RubyTypeNamespace, typestr)
|
|
254
|
+
else
|
|
255
|
+
type = Mapping.class2element(obj.class)
|
|
256
|
+
end
|
|
257
|
+
param = SOAPStruct.new(type)
|
|
258
|
+
mark_marshalled_obj(obj, param)
|
|
259
|
+
setiv2soap(param, obj, map)
|
|
260
|
+
param
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def rubytype2obj(node, info, map, rubytype)
|
|
264
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : nil
|
|
265
|
+
obj = nil
|
|
266
|
+
case node
|
|
267
|
+
when SOAPString
|
|
268
|
+
return @string_factory.soap2obj(klass || String, node, info, map)
|
|
269
|
+
when SOAPDateTime
|
|
270
|
+
#return @datetime_factory.soap2obj(klass || Time, node, info, map)
|
|
271
|
+
klass ||= Time
|
|
272
|
+
t = node.to_time
|
|
273
|
+
arg = [t.year, t.month, t.mday, t.hour, t.min, t.sec, t.usec]
|
|
274
|
+
obj = t.gmt? ? klass.gm(*arg) : klass.local(*arg)
|
|
275
|
+
mark_unmarshalled_obj(node, obj)
|
|
276
|
+
return true, obj
|
|
277
|
+
when SOAPArray
|
|
278
|
+
return @array_factory.soap2obj(klass || Array, node, info, map)
|
|
279
|
+
when SOAPNil, SOAPBoolean, SOAPInt, SOAPInteger, SOAPDecimal, SOAPDouble
|
|
280
|
+
return @basetype_factory.soap2obj(nil, node, info, map)
|
|
281
|
+
when SOAPStruct
|
|
282
|
+
return rubytypestruct2obj(node, info, map, rubytype)
|
|
283
|
+
else
|
|
284
|
+
raise
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def rubytypestruct2obj(node, info, map, rubytype)
|
|
289
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : nil
|
|
290
|
+
obj = nil
|
|
291
|
+
case node.type
|
|
292
|
+
when TYPE_HASH
|
|
293
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : Hash
|
|
294
|
+
obj = Mapping.create_empty_object(klass)
|
|
295
|
+
mark_unmarshalled_obj(node, obj)
|
|
296
|
+
node.each do |key, value|
|
|
297
|
+
next unless key == 'item'
|
|
298
|
+
obj[Mapping._soap2obj(value['key'], map)] =
|
|
299
|
+
Mapping._soap2obj(value['value'], map)
|
|
300
|
+
end
|
|
301
|
+
if node.key?('default')
|
|
302
|
+
obj.default = Mapping._soap2obj(node['default'], map)
|
|
303
|
+
end
|
|
304
|
+
when TYPE_REGEXP
|
|
305
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : Regexp
|
|
306
|
+
obj = Mapping.create_empty_object(klass)
|
|
307
|
+
mark_unmarshalled_obj(node, obj)
|
|
308
|
+
source = node['source'].string
|
|
309
|
+
options = node['options'].data || 0
|
|
310
|
+
Regexp.instance_method(:initialize).bind(obj).call(source, options)
|
|
311
|
+
when TYPE_RANGE
|
|
312
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : Range
|
|
313
|
+
obj = Mapping.create_empty_object(klass)
|
|
314
|
+
mark_unmarshalled_obj(node, obj)
|
|
315
|
+
first = Mapping._soap2obj(node['begin'], map)
|
|
316
|
+
last = Mapping._soap2obj(node['end'], map)
|
|
317
|
+
exclude_end = node['exclude_end'].data
|
|
318
|
+
Range.instance_method(:initialize).bind(obj).call(first, last, exclude_end)
|
|
319
|
+
when TYPE_CLASS
|
|
320
|
+
obj = Mapping.class_from_name(node['name'].data)
|
|
321
|
+
when TYPE_MODULE
|
|
322
|
+
obj = Mapping.class_from_name(node['name'].data)
|
|
323
|
+
when TYPE_SYMBOL
|
|
324
|
+
obj = node['id'].data.intern
|
|
325
|
+
when TYPE_STRUCT
|
|
326
|
+
typestr = Mapping.elename2name(node['type'].data)
|
|
327
|
+
klass = Mapping.class_from_name(typestr)
|
|
328
|
+
if klass.nil?
|
|
329
|
+
return false
|
|
330
|
+
end
|
|
331
|
+
unless klass <= ::Struct
|
|
332
|
+
return false
|
|
333
|
+
end
|
|
334
|
+
obj = Mapping.create_empty_object(klass)
|
|
335
|
+
mark_unmarshalled_obj(node, obj)
|
|
336
|
+
node['member'].each do |name, value|
|
|
337
|
+
obj[Mapping.elename2name(name)] = Mapping._soap2obj(value, map)
|
|
338
|
+
end
|
|
339
|
+
else
|
|
340
|
+
return unknowntype2obj(node, info, map)
|
|
341
|
+
end
|
|
342
|
+
return true, obj
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def anytype2obj(node, info, map)
|
|
346
|
+
case node
|
|
347
|
+
when SOAPBasetype
|
|
348
|
+
return true, node.data
|
|
349
|
+
when SOAPStruct
|
|
350
|
+
klass = ::SOAP::Mapping::Object
|
|
351
|
+
obj = klass.new
|
|
352
|
+
mark_unmarshalled_obj(node, obj)
|
|
353
|
+
node.each do |name, value|
|
|
354
|
+
obj.__add_xmlele_value(XSD::QName.new(nil, name),
|
|
355
|
+
Mapping._soap2obj(value, map))
|
|
356
|
+
end
|
|
357
|
+
unless node.extraattr.empty?
|
|
358
|
+
obj.instance_variable_set('@__xmlattr', node.extraattr)
|
|
359
|
+
end
|
|
360
|
+
return true, obj
|
|
361
|
+
else
|
|
362
|
+
return false
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def unknowntype2obj(node, info, map)
|
|
367
|
+
case node
|
|
368
|
+
when SOAPBasetype
|
|
369
|
+
return true, node.data
|
|
370
|
+
when SOAPArray
|
|
371
|
+
return @array_factory.soap2obj(Array, node, info, map)
|
|
372
|
+
when SOAPStruct
|
|
373
|
+
obj = unknownstruct2obj(node, info, map)
|
|
374
|
+
return true, obj if obj
|
|
375
|
+
if !@allow_untyped_struct
|
|
376
|
+
return false
|
|
377
|
+
end
|
|
378
|
+
return anytype2obj(node, info, map)
|
|
379
|
+
else
|
|
380
|
+
# Basetype which is not defined...
|
|
381
|
+
return false
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
def unknownstruct2obj(node, info, map)
|
|
386
|
+
unless node.type.name
|
|
387
|
+
return nil
|
|
388
|
+
end
|
|
389
|
+
typestr = Mapping.elename2name(node.type.name)
|
|
390
|
+
klass = Mapping.class_from_name(typestr)
|
|
391
|
+
if klass.respond_to?(:soap_marshallable) and !klass.soap_marshallable
|
|
392
|
+
return nil
|
|
393
|
+
end
|
|
394
|
+
if klass.nil? and @allow_untyped_struct
|
|
395
|
+
klass = Mapping.class_from_name(typestr, true) # lenient
|
|
396
|
+
end
|
|
397
|
+
if klass.nil?
|
|
398
|
+
return nil
|
|
399
|
+
end
|
|
400
|
+
if klass <= ::Exception
|
|
401
|
+
return exception2obj(klass, node, map)
|
|
402
|
+
end
|
|
403
|
+
klass_type = Mapping.class2qname(klass)
|
|
404
|
+
return nil unless node.type.match(klass_type)
|
|
405
|
+
obj = nil
|
|
406
|
+
begin
|
|
407
|
+
obj = Mapping.create_empty_object(klass)
|
|
408
|
+
rescue
|
|
409
|
+
# type name "data" tries Data.new which raises TypeError
|
|
410
|
+
nil
|
|
411
|
+
end
|
|
412
|
+
mark_unmarshalled_obj(node, obj)
|
|
413
|
+
setiv2obj(obj, node, map)
|
|
414
|
+
obj
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
def exception2obj(klass, node, map)
|
|
418
|
+
message = Mapping._soap2obj(node['message'], map)
|
|
419
|
+
backtrace = Mapping._soap2obj(node['backtrace'], map)
|
|
420
|
+
obj = Mapping.create_empty_object(klass)
|
|
421
|
+
obj = obj.exception(message)
|
|
422
|
+
mark_unmarshalled_obj(node, obj)
|
|
423
|
+
obj.set_backtrace(backtrace)
|
|
424
|
+
obj
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
# Only creates empty array. Do String#replace it with real string.
|
|
428
|
+
def array2obj(node, map, rubytype)
|
|
429
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : Array
|
|
430
|
+
obj = Mapping.create_empty_object(klass)
|
|
431
|
+
mark_unmarshalled_obj(node, obj)
|
|
432
|
+
obj
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
# Only creates empty string. Do String#replace it with real string.
|
|
436
|
+
def string2obj(node, map, rubytype)
|
|
437
|
+
klass = rubytype ? Mapping.class_from_name(rubytype) : String
|
|
438
|
+
obj = Mapping.create_empty_object(klass)
|
|
439
|
+
mark_unmarshalled_obj(node, obj)
|
|
440
|
+
obj
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
end
|
|
446
|
+
end
|