| Class | SOAP::Mapping::WSDLEncodedRegistry |
| In: |
lib/soap/mapping/wsdlencodedregistry.rb
|
| Parent: | Registry |
| MapKeyName | = | XSD::QName.new(nil, "key") |
| MapValueName | = | XSD::QName.new(nil, "value") |
| definedelements | [R] | |
| definedtypes | [R] | |
| excn_handler_obj2soap | [RW] | |
| excn_handler_soap2obj | [RW] |
# File lib/soap/mapping/wsdlencodedregistry.rb, line 28
28: def initialize(definedtypes = XSD::NamedElements::Empty)
29: @definedtypes = definedtypes
30: # @definedelements = definedelements needed?
31: @excn_handler_obj2soap = nil
32: @excn_handler_soap2obj = nil
33: # For mapping AnyType element.
34: @rubytype_factory = RubytypeFactory.new(
35: :allow_untyped_struct => true,
36: :allow_original_mapping => true
37: )
38: @schema_element_cache = {}
39: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 41
41: def obj2soap(obj, qname = nil)
42: soap_obj = nil
43: if type = @definedtypes[qname]
44: soap_obj = obj2typesoap(obj, type)
45: else
46: soap_obj = any2soap(obj, qname)
47: end
48: return soap_obj if soap_obj
49: if @excn_handler_obj2soap
50: soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
51: Mapping._obj2soap(yield_obj, self)
52: }
53: return soap_obj if soap_obj
54: end
55: if qname
56: raise MappingError.new("cannot map #{obj.class.name} as #{qname}")
57: else
58: raise MappingError.new("cannot map #{obj.class.name} to SOAP/OM")
59: end
60: end
map anything for now: must refer WSDL while mapping. [ToDo]
# File lib/soap/mapping/wsdlencodedregistry.rb, line 63
63: def soap2obj(node, obj_class = nil)
64: begin
65: return any2obj(node, obj_class)
66: rescue MappingError
67: end
68: if @excn_handler_soap2obj
69: begin
70: return @excn_handler_soap2obj.call(node) { |yield_node|
71: Mapping._soap2obj(yield_node, self)
72: }
73: rescue Exception
74: end
75: end
76: raise MappingError.new("cannot map #{node.type.name} to Ruby object")
77: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 234
234: def add_elements2stubobj(node, obj)
235: elements, as_array = schema_element_definition(obj.class)
236: vars = {}
237: node.each do |name, value|
238: item = elements.find { |k, v| k.name == name }
239: if item
240: elename, class_name = item
241: if klass = Mapping.class_from_name(class_name)
242: # klass must be a SOAPBasetype or a class
243: if klass.ancestors.include?(::SOAP::SOAPBasetype)
244: if value.respond_to?(:data)
245: child = klass.new(value.data).data
246: else
247: child = klass.new(nil).data
248: end
249: else
250: child = Mapping._soap2obj(value, self, klass)
251: end
252: elsif klass = Mapping.module_from_name(class_name)
253: # simpletype
254: if value.respond_to?(:data)
255: child = value.data
256: else
257: raise MappingError.new(
258: "cannot map to a module value: #{class_name}")
259: end
260: else
261: raise MappingError.new("unknown class: #{class_name}")
262: end
263: else # untyped element is treated as anyType.
264: child = Mapping._soap2obj(value, self)
265: end
266: vars[name] = child
267: end
268: Mapping.set_attributes(obj, vars)
269: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 214
214: def any2obj(node, obj_class)
215: unless obj_class
216: typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name)
217: obj_class = Mapping.class_from_name(typestr)
218: end
219: if obj_class and obj_class.class_variables.include?('@@schema_element')
220: soap2stubobj(node, obj_class)
221: else
222: Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class)
223: end
224: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 81
81: def any2soap(obj, qname)
82: if obj.nil?
83: SOAPNil.new
84: elsif qname.nil? or qname == XSD::AnyTypeName
85: @rubytype_factory.obj2soap(nil, obj, nil, self)
86: elsif obj.is_a?(XSD::NSDBase)
87: soap2soap(obj, qname)
88: elsif (type = TypeMap[qname])
89: base2soap(obj, type)
90: else
91: nil
92: end
93: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 172
172: def array2soap(obj, type_qname, type)
173: return SOAPNil.new if obj.nil? # ToDo: check nillable.
174: arytype = type.child_type
175: soap_obj = SOAPArray.new(ValueArrayName, 1, arytype)
176: unless obj.nil?
177: mark_marshalled_obj(obj, soap_obj)
178: obj.each do |item|
179: soap_obj.add(Mapping._obj2soap(item, self, arytype))
180: end
181: end
182: soap_obj
183: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 149
149: def base2soap(obj, type)
150: soap_obj = nil
151: if type <= XSD::XSDString
152: str = XSD::Charset.encoding_conv(obj.to_s,
153: Thread.current[:SOAPExternalCES], XSD::Charset.encoding)
154: soap_obj = type.new(str)
155: mark_marshalled_obj(obj, soap_obj)
156: else
157: soap_obj = type.new(obj)
158: end
159: soap_obj
160: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 131
131: def complexobj2soap(obj, type)
132: case type.compoundtype
133: when :TYPE_STRUCT
134: struct2soap(obj, type.name, type)
135: when :TYPE_ARRAY
136: array2soap(obj, type.name, type)
137: when :TYPE_MAP
138: map2soap(obj, type.name, type)
139: when :TYPE_SIMPLE
140: simpleobj2soap(obj, type.simplecontent)
141: when :TYPE_EMPTY
142: raise MappingError.new("should be empty") unless obj.nil?
143: SOAPNil.new
144: else
145: raise MappingError.new("unknown compound type: #{type.compoundtype}")
146: end
147: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 205
205: def elements2soap(obj, soap_obj, elements)
206: elements.each do |element|
207: name = element.name.name
208: child_obj = Mapping.get_attribute(obj, name)
209: soap_obj.add(name,
210: Mapping._obj2soap(child_obj, self, element.type || element.name))
211: end
212: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 187
187: def map2soap(obj, type_qname, type)
188: return SOAPNil.new if obj.nil? # ToDo: check nillable.
189: keytype = type.child_type(MapKeyName) || XSD::AnyTypeName
190: valuetype = type.child_type(MapValueName) || XSD::AnyTypeName
191: soap_obj = SOAPStruct.new(MapQName)
192: unless obj.nil?
193: mark_marshalled_obj(obj, soap_obj)
194: obj.each do |key, value|
195: elem = SOAPStruct.new
196: elem.add("key", Mapping._obj2soap(key, self, keytype))
197: elem.add("value", Mapping._obj2soap(value, self, valuetype))
198: # ApacheAxis allows only 'item' here.
199: soap_obj.add("item", elem)
200: end
201: end
202: soap_obj
203: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 116
116: def obj2typesoap(obj, type)
117: if type.is_a?(::WSDL::XMLSchema::SimpleType)
118: simpleobj2soap(obj, type)
119: else
120: complexobj2soap(obj, type)
121: end
122: end
it caches @@schema_element. this means that @@schema_element must not be changed while a lifetime of a WSDLLiteralRegistry.
# File lib/soap/mapping/wsdlencodedregistry.rb, line 273
273: def schema_element_definition(klass)
274: @schema_element_cache[klass] ||= Mapping.schema_element_definition(klass)
275: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 124
124: def simpleobj2soap(obj, type)
125: type.check_lexical_format(obj)
126: return SOAPNil.new if obj.nil? # ToDo: check nillable.
127: o = base2soap(obj, TypeMap[type.base])
128: o
129: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 95
95: def soap2soap(obj, type_qname)
96: if obj.is_a?(SOAPBasetype)
97: obj
98: elsif obj.is_a?(SOAPStruct) && (type = @definedtypes[type_qname])
99: soap_obj = obj
100: mark_marshalled_obj(obj, soap_obj)
101: elements2soap(obj, soap_obj, type.content.elements)
102: soap_obj
103: elsif obj.is_a?(SOAPArray) && (type = @definedtypes[type_qname])
104: soap_obj = obj
105: contenttype = type.child_type
106: mark_marshalled_obj(obj, soap_obj)
107: obj.replace do |ele|
108: Mapping._obj2soap(ele, self, contenttype)
109: end
110: soap_obj
111: else
112: nil
113: end
114: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 226
226: def soap2stubobj(node, obj_class)
227: obj = Mapping.create_empty_object(obj_class)
228: unless node.is_a?(SOAPNil)
229: add_elements2stubobj(node, obj)
230: end
231: obj
232: end
# File lib/soap/mapping/wsdlencodedregistry.rb, line 162
162: def struct2soap(obj, type_qname, type)
163: return SOAPNil.new if obj.nil? # ToDo: check nillable.
164: soap_obj = SOAPStruct.new(type_qname)
165: unless obj.nil?
166: mark_marshalled_obj(obj, soap_obj)
167: elements2soap(obj, soap_obj, type.content.elements)
168: end
169: soap_obj
170: end