1
# SOAP4R - Mapping factory.
2
# Copyright (C) 2000, 2001, 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
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.
14
include TraverseSupport
20
def obj2soap(soap_class, obj, info, map)
21
raise NotImplementError.new
25
def soap2obj(obj_class, node, info, map)
26
raise NotImplementError.new
27
# return convert_succeeded_or_not, obj
30
def setiv2obj(obj, node, map)
33
setiv2ary(obj, node, map)
35
setiv2struct(obj, node, map)
39
def setiv2soap(node, obj, map)
40
if obj.class.class_variables.include?('@@schema_element')
41
obj.class.class_eval('@@schema_element').each do |name, info|
46
elename = Mapping.name2elename(name)
49
Mapping._obj2soap(obj.instance_variable_get('@' + name), map))
52
# should we sort instance_variables?
53
obj.instance_variables.each do |var|
54
name = var.sub(/^@/, '')
55
elename = Mapping.name2elename(name)
57
Mapping._obj2soap(obj.instance_variable_get(var), map))
64
def setiv2ary(obj, node, map)
65
node.each do |name, value|
66
Array.instance_method(:<<).bind(obj).call(Mapping._soap2obj(value, map))
70
def setiv2struct(obj, node, map)
72
node.each do |name, value|
73
vars[Mapping.elename2name(name)] = Mapping._soap2obj(value, map)
75
Mapping.set_attributes(obj, vars)
79
class StringFactory_ < Factory
80
def initialize(allow_original_mapping = false)
82
@allow_original_mapping = allow_original_mapping
85
def obj2soap(soap_class, obj, info, map)
86
if !@allow_original_mapping and !obj.instance_variables.empty?
90
unless XSD::Charset.is_ces(obj, Thread.current[:SOAPExternalCES])
93
encoded = XSD::Charset.encoding_conv(obj,
94
Thread.current[:SOAPExternalCES], XSD::Charset.encoding)
95
soap_obj = soap_class.new(encoded)
96
rescue XSD::ValueSpaceError
99
mark_marshalled_obj(obj, soap_obj)
103
def soap2obj(obj_class, node, info, map)
104
obj = Mapping.create_empty_object(obj_class)
105
decoded = XSD::Charset.encoding_conv(node.data, XSD::Charset.encoding,
106
Thread.current[:SOAPExternalCES])
108
mark_unmarshalled_obj(node, obj)
113
class BasetypeFactory_ < Factory
114
def initialize(allow_original_mapping = false)
116
@allow_original_mapping = allow_original_mapping
119
def obj2soap(soap_class, obj, info, map)
120
if !@allow_original_mapping and !obj.instance_variables.empty?
125
soap_obj = soap_class.new(obj)
126
rescue XSD::ValueSpaceError
129
if @allow_original_mapping
130
# Basetype except String should not be multiref-ed in SOAP/1.1.
131
mark_marshalled_obj(obj, soap_obj)
136
def soap2obj(obj_class, node, info, map)
138
mark_unmarshalled_obj(node, obj)
143
class DateTimeFactory_ < Factory
144
def initialize(allow_original_mapping = false)
146
@allow_original_mapping = allow_original_mapping
149
def obj2soap(soap_class, obj, info, map)
150
if !@allow_original_mapping and
151
Time === obj and !obj.instance_variables.empty?
156
soap_obj = soap_class.new(obj)
157
rescue XSD::ValueSpaceError
160
mark_marshalled_obj(obj, soap_obj)
164
def soap2obj(obj_class, node, info, map)
165
if node.respond_to?(:to_obj)
166
obj = node.to_obj(obj_class)
167
return false if obj.nil?
168
mark_unmarshalled_obj(node, obj)
176
class Base64Factory_ < Factory
177
def obj2soap(soap_class, obj, info, map)
178
return nil unless obj.instance_variables.empty?
179
soap_obj = soap_class.new(obj)
180
mark_marshalled_obj(obj, soap_obj) if soap_obj
184
def soap2obj(obj_class, node, info, map)
186
mark_unmarshalled_obj(node, obj)
191
class URIFactory_ < Factory
192
def obj2soap(soap_class, obj, info, map)
193
soap_obj = soap_class.new(obj)
194
mark_marshalled_obj(obj, soap_obj) if soap_obj
198
def soap2obj(obj_class, node, info, map)
200
mark_unmarshalled_obj(node, obj)
205
class ArrayFactory_ < Factory
206
def initialize(allow_original_mapping = false)
208
@allow_original_mapping = allow_original_mapping
211
# [[1], [2]] is converted to Array of Array, not 2-D Array.
212
# To create M-D Array, you must call Mapping.ary2md.
213
def obj2soap(soap_class, obj, info, map)
214
if !@allow_original_mapping and !obj.instance_variables.empty?
217
arytype = Mapping.obj2element(obj)
219
arytype.namespace ||= RubyTypeNamespace
221
arytype = XSD::AnyTypeName
223
soap_obj = SOAPArray.new(ValueArrayName, 1, arytype)
224
mark_marshalled_obj(obj, soap_obj)
226
soap_obj.add(Mapping._obj2soap(item, map))
231
def soap2obj(obj_class, node, info, map)
232
obj = Mapping.create_empty_object(obj_class)
233
mark_unmarshalled_obj(node, obj)
234
node.soap2array(obj) do |elem|
235
elem ? Mapping._soap2obj(elem, map) : nil
241
class TypedArrayFactory_ < Factory
242
def initialize(allow_original_mapping = false)
244
@allow_original_mapping = allow_original_mapping
247
def obj2soap(soap_class, obj, info, map)
248
if !@allow_original_mapping and !obj.instance_variables.empty?
251
arytype = info[:type] || info[0]
252
soap_obj = SOAPArray.new(ValueArrayName, 1, arytype)
253
mark_marshalled_obj(obj, soap_obj)
255
soap_obj.add(Mapping._obj2soap(var, map))
260
def soap2obj(obj_class, node, info, map)
264
arytype = info[:type] || info[0]
265
unless node.arytype == arytype
268
obj = Mapping.create_empty_object(obj_class)
269
mark_unmarshalled_obj(node, obj)
270
node.soap2array(obj) do |elem|
271
elem ? Mapping._soap2obj(elem, map) : nil
277
class TypedStructFactory_ < Factory
278
def obj2soap(soap_class, obj, info, map)
279
type = info[:type] || info[0]
280
soap_obj = soap_class.new(type)
281
mark_marshalled_obj(obj, soap_obj)
282
if obj.class <= SOAP::Marshallable
283
setiv2soap(soap_obj, obj, map)
285
setiv2soap(soap_obj, obj, map)
290
def soap2obj(obj_class, node, info, map)
291
type = info[:type] || info[0]
292
unless node.type == type
295
obj = Mapping.create_empty_object(obj_class)
296
mark_unmarshalled_obj(node, obj)
297
setiv2obj(obj, node, map)
302
MapQName = XSD::QName.new(ApacheSOAPTypeNamespace, 'Map')
303
class HashFactory_ < Factory
304
def initialize(allow_original_mapping = false)
306
@allow_original_mapping = allow_original_mapping
309
def obj2soap(soap_class, obj, info, map)
310
if !@allow_original_mapping and !obj.instance_variables.empty?
313
if !obj.default.nil? or
314
(obj.respond_to?(:default_proc) and obj.default_proc)
317
soap_obj = SOAPStruct.new(MapQName)
318
mark_marshalled_obj(obj, soap_obj)
319
obj.each do |key, value|
320
elem = SOAPStruct.new
321
elem.add("key", Mapping._obj2soap(key, map))
322
elem.add("value", Mapping._obj2soap(value, map))
323
# ApacheAxis allows only 'item' here.
324
soap_obj.add("item", elem)
329
def soap2obj(obj_class, node, info, map)
330
unless node.type == MapQName
333
if node.class == SOAPStruct and node.key?('default')
336
obj = Mapping.create_empty_object(obj_class)
337
mark_unmarshalled_obj(node, obj)
338
if node.class == SOAPStruct
339
node.each do |key, value|
340
obj[Mapping._soap2obj(value['key'], map)] =
341
Mapping._soap2obj(value['value'], map)
345
obj[Mapping._soap2obj(value['key'], map)] =
346
Mapping._soap2obj(value['value'], map)