| Class | WS::Marshaling::SoapMarshaler |
| In: |
vendor/actionwebservice/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb
|
| Parent: | AbstractMarshaler |
| registry | [R] | |
| type_namespace | [RW] |
# File vendor/actionwebservice/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb, line 15
15: def initialize(type_namespace='')
16: @type_namespace = type_namespace
17: @registry = SOAP::Mapping::Registry.new
18: @spec2binding = {}
19: end
# File vendor/actionwebservice/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb, line 21
21: def marshal(param)
22: annotate_arrays(param.info.data, param.value)
23: if param.value.is_a?(Exception)
24: detail = SOAP::Mapping::SOAPException.new(param.value)
25: soap_obj = SOAP::SOAPFault.new(
26: SOAP::SOAPString.new('Server'),
27: SOAP::SOAPString.new(param.value.to_s),
28: SOAP::SOAPString.new(self.class.name),
29: SOAP::Mapping.obj2soap(detail))
30: else
31: soap_obj = SOAP::Mapping.obj2soap(param.value, @registry)
32: end
33: SoapForeignObject.new(param, soap_obj)
34: end
# File vendor/actionwebservice/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb, line 52
52: def register_type(spec)
53: if @spec2binding.has_key?(spec)
54: return @spec2binding[spec]
55: end
56:
57: klass = BaseTypes.canonical_param_type_class(spec)
58: if klass.is_a?(Array)
59: type_class = klass[0]
60: else
61: type_class = klass
62: end
63:
64: type_binding = nil
65: if (mapping = @registry.find_mapped_soap_class(type_class) rescue nil)
66: qname = mapping[2] ? mapping[2][:type] : nil
67: qname ||= soap_base_type_name(mapping[0])
68: type_binding = SoapBinding.new(self, qname, type_class, mapping)
69: else
70: qname = XSD::QName.new(@type_namespace, soap_type_name(type_class.name))
71: @registry.add(type_class,
72: SOAP::SOAPStruct,
73: typed_struct_factory(type_class),
74: { :type => qname })
75: mapping = @registry.find_mapped_soap_class(type_class)
76: type_binding = SoapBinding.new(self, qname, type_class, mapping)
77: end
78:
79: array_binding = nil
80: if klass.is_a?(Array)
81: array_mapping = @registry.find_mapped_soap_class(Array) rescue nil
82: if (array_mapping && !array_mapping[1].is_a?(SoapTypedArrayFactory)) || array_mapping.nil?
83: @registry.set(Array,
84: SOAP::SOAPArray,
85: SoapTypedArrayFactory.new)
86: array_mapping = @registry.find_mapped_soap_class(Array)
87: end
88: qname = XSD::QName.new(@type_namespace, soap_type_name(type_class.name) + 'Array')
89: array_binding = SoapBinding.new(self, qname, Array, array_mapping, type_binding)
90: end
91:
92: @spec2binding[spec] = array_binding ? array_binding : type_binding
93: @spec2binding[spec]
94: end
# File vendor/actionwebservice/lib/action_web_service/vendor/ws/marshaling/soap_marshaling.rb, line 36
36: def unmarshal(obj)
37: param = obj.param
38: soap_object = obj.soap_object
39: soap_type = soap_object ? soap_object.type : nil
40: value = soap_object ? SOAP::Mapping.soap2obj(soap_object, @registry) : nil
41: param.value = value
42: param.info.type = value.class
43: mapping = @registry.find_mapped_soap_class(param.info.type) rescue nil
44: if soap_type && soap_type.name == 'Array' && soap_type.namespace == SoapEncodingNS
45: param.info.data = SoapBinding.new(self, soap_object.arytype, Array, mapping)
46: else
47: param.info.data = SoapBinding.new(self, soap_type, value.class, mapping)
48: end
49: param
50: end