soap4r_es 0.0.1
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.
- checksums.yaml +7 -0
- data/bin/wsdl2ruby.rb +140 -0
- data/bin/wsdl2ruby_rails.rb +140 -0
- data/bin/xsd2ruby.rb +92 -0
- data/lib/soap/attachment.rb +109 -0
- data/lib/soap/attrproxy.rb +35 -0
- data/lib/soap/baseData.rb +1095 -0
- data/lib/soap/element.rb +278 -0
- data/lib/soap/encodingstyle/aspDotNetHandler.rb +208 -0
- data/lib/soap/encodingstyle/handler.rb +121 -0
- data/lib/soap/encodingstyle/literalHandler.rb +196 -0
- data/lib/soap/encodingstyle/soapHandler.rb +560 -0
- data/lib/soap/filter/filterchain.rb +52 -0
- data/lib/soap/filter/handler.rb +32 -0
- data/lib/soap/filter/streamhandler.rb +30 -0
- data/lib/soap/filter.rb +14 -0
- data/lib/soap/generator.rb +299 -0
- data/lib/soap/header/handler.rb +64 -0
- data/lib/soap/header/handlerset.rb +78 -0
- data/lib/soap/header/mappinghandler.rb +48 -0
- data/lib/soap/header/simplehandler.rb +45 -0
- data/lib/soap/httpconfigloader.rb +140 -0
- data/lib/soap/mapping/encodedregistry.rb +541 -0
- data/lib/soap/mapping/factory.rb +389 -0
- data/lib/soap/mapping/literalregistry.rb +392 -0
- data/lib/soap/mapping/mapping.rb +577 -0
- data/lib/soap/mapping/registry.rb +297 -0
- data/lib/soap/mapping/rubytypeFactory.rb +446 -0
- data/lib/soap/mapping/schemadefinition.rb +171 -0
- data/lib/soap/mapping/typeMap.rb +107 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +212 -0
- data/lib/soap/mapping/wsdlliteralregistry.rb +249 -0
- data/lib/soap/mapping.rb +13 -0
- data/lib/soap/marshal.rb +60 -0
- data/lib/soap/mimemessage.rb +243 -0
- data/lib/soap/nestedexception.rb +43 -0
- data/lib/soap/netHttpClient.rb +242 -0
- data/lib/soap/ns.rb +39 -0
- data/lib/soap/parser.rb +253 -0
- data/lib/soap/processor.rb +67 -0
- data/lib/soap/property.rb +330 -0
- data/lib/soap/proxy.rb +15 -0
- data/lib/soap/rpc/cgistub.rb +249 -0
- data/lib/soap/rpc/driver.rb +222 -0
- data/lib/soap/rpc/element.rb +375 -0
- data/lib/soap/rpc/httpserver.rb +144 -0
- data/lib/soap/rpc/methodDef.rb +69 -0
- data/lib/soap/rpc/proxy.rb +573 -0
- data/lib/soap/rpc/router.rb +672 -0
- data/lib/soap/rpc/rpc.rb +26 -0
- data/lib/soap/rpc/soaplet.rb +201 -0
- data/lib/soap/rpc/standaloneServer.rb +44 -0
- data/lib/soap/soap.rb +163 -0
- data/lib/soap/streamHandler.rb +302 -0
- data/lib/soap/version.rb +12 -0
- data/lib/soap/wsdlDriver.rb +165 -0
- data/lib/wsdl/binding.rb +66 -0
- data/lib/wsdl/data.rb +65 -0
- data/lib/wsdl/definitions.rb +237 -0
- data/lib/wsdl/documentation.rb +33 -0
- data/lib/wsdl/import.rb +81 -0
- data/lib/wsdl/importer.rb +39 -0
- data/lib/wsdl/info.rb +51 -0
- data/lib/wsdl/message.rb +55 -0
- data/lib/wsdl/operation.rb +152 -0
- data/lib/wsdl/operationBinding.rb +241 -0
- data/lib/wsdl/param.rb +94 -0
- data/lib/wsdl/parser.rb +180 -0
- data/lib/wsdl/part.rb +53 -0
- data/lib/wsdl/port.rb +67 -0
- data/lib/wsdl/portType.rb +76 -0
- data/lib/wsdl/service.rb +62 -0
- data/lib/wsdl/soap/address.rb +41 -0
- data/lib/wsdl/soap/binding.rb +50 -0
- data/lib/wsdl/soap/body.rb +59 -0
- data/lib/wsdl/soap/cgiStubCreator.rb +93 -0
- data/lib/wsdl/soap/classDefCreator.rb +529 -0
- data/lib/wsdl/soap/classDefCreatorSupport.rb +242 -0
- data/lib/wsdl/soap/classNameCreator.rb +57 -0
- data/lib/wsdl/soap/clientSkeltonCreator.rb +107 -0
- data/lib/wsdl/soap/complexType.rb +174 -0
- data/lib/wsdl/soap/data.rb +43 -0
- data/lib/wsdl/soap/definitions.rb +201 -0
- data/lib/wsdl/soap/driverCreator.rb +121 -0
- data/lib/wsdl/soap/element.rb +34 -0
- data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +74 -0
- data/lib/wsdl/soap/fault.rb +57 -0
- data/lib/wsdl/soap/header.rb +87 -0
- data/lib/wsdl/soap/headerfault.rb +57 -0
- data/lib/wsdl/soap/literalMappingRegistryCreator.rb +116 -0
- data/lib/wsdl/soap/mappingRegistryCreator.rb +59 -0
- data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +380 -0
- data/lib/wsdl/soap/methodDefCreator.rb +200 -0
- data/lib/wsdl/soap/operation.rb +113 -0
- data/lib/wsdl/soap/servantSkeltonCreator.rb +92 -0
- data/lib/wsdl/soap/servletStubCreator.rb +105 -0
- data/lib/wsdl/soap/standaloneServerStubCreator.rb +101 -0
- data/lib/wsdl/soap/wsdl2ruby.rb +249 -0
- data/lib/wsdl/types.rb +45 -0
- data/lib/wsdl/wsdl.rb +25 -0
- data/lib/wsdl/xmlSchema/all.rb +25 -0
- data/lib/wsdl/xmlSchema/annotation.rb +35 -0
- data/lib/wsdl/xmlSchema/any.rb +62 -0
- data/lib/wsdl/xmlSchema/anyAttribute.rb +49 -0
- data/lib/wsdl/xmlSchema/attribute.rb +105 -0
- data/lib/wsdl/xmlSchema/attributeGroup.rb +69 -0
- data/lib/wsdl/xmlSchema/choice.rb +59 -0
- data/lib/wsdl/xmlSchema/complexContent.rb +98 -0
- data/lib/wsdl/xmlSchema/complexExtension.rb +120 -0
- data/lib/wsdl/xmlSchema/complexRestriction.rb +105 -0
- data/lib/wsdl/xmlSchema/complexType.rb +194 -0
- data/lib/wsdl/xmlSchema/content.rb +96 -0
- data/lib/wsdl/xmlSchema/data.rb +117 -0
- data/lib/wsdl/xmlSchema/element.rb +154 -0
- data/lib/wsdl/xmlSchema/enumeration.rb +37 -0
- data/lib/wsdl/xmlSchema/fractiondigits.rb +38 -0
- data/lib/wsdl/xmlSchema/group.rb +101 -0
- data/lib/wsdl/xmlSchema/import.rb +53 -0
- data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
- data/lib/wsdl/xmlSchema/importer.rb +103 -0
- data/lib/wsdl/xmlSchema/include.rb +48 -0
- data/lib/wsdl/xmlSchema/length.rb +38 -0
- data/lib/wsdl/xmlSchema/list.rb +49 -0
- data/lib/wsdl/xmlSchema/maxexclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/maxinclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/maxlength.rb +38 -0
- data/lib/wsdl/xmlSchema/minexclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/mininclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/minlength.rb +38 -0
- data/lib/wsdl/xmlSchema/parser.rb +168 -0
- data/lib/wsdl/xmlSchema/pattern.rb +37 -0
- data/lib/wsdl/xmlSchema/ref.rb +34 -0
- data/lib/wsdl/xmlSchema/schema.rb +179 -0
- data/lib/wsdl/xmlSchema/sequence.rb +55 -0
- data/lib/wsdl/xmlSchema/simpleContent.rb +70 -0
- data/lib/wsdl/xmlSchema/simpleExtension.rb +63 -0
- data/lib/wsdl/xmlSchema/simpleRestriction.rb +133 -0
- data/lib/wsdl/xmlSchema/simpleType.rb +88 -0
- data/lib/wsdl/xmlSchema/totaldigits.rb +38 -0
- data/lib/wsdl/xmlSchema/union.rb +36 -0
- data/lib/wsdl/xmlSchema/unique.rb +35 -0
- data/lib/wsdl/xmlSchema/whitespace.rb +38 -0
- data/lib/wsdl/xmlSchema/xsd2ruby.rb +177 -0
- data/lib/xsd/charset.rb +190 -0
- data/lib/xsd/codegen/classdef.rb +230 -0
- data/lib/xsd/codegen/commentdef.rb +35 -0
- data/lib/xsd/codegen/gensupport.rb +277 -0
- data/lib/xsd/codegen/methoddef.rb +71 -0
- data/lib/xsd/codegen/moduledef.rb +209 -0
- data/lib/xsd/codegen.rb +13 -0
- data/lib/xsd/datatypes.rb +1465 -0
- data/lib/xsd/datatypes1999.rb +21 -0
- data/lib/xsd/iconvcharset.rb +33 -0
- data/lib/xsd/mapping.rb +69 -0
- data/lib/xsd/namedelements.rb +133 -0
- data/lib/xsd/ns.rb +183 -0
- data/lib/xsd/qname.rb +80 -0
- data/lib/xsd/xmlparser/libxmlparser.rb +136 -0
- data/lib/xsd/xmlparser/nokogiriparser.rb +63 -0
- data/lib/xsd/xmlparser/ogaparser.rb +53 -0
- data/lib/xsd/xmlparser/oxparser.rb +97 -0
- data/lib/xsd/xmlparser/parser.rb +101 -0
- data/lib/xsd/xmlparser/rexmlparser.rb +54 -0
- data/lib/xsd/xmlparser.rb +81 -0
- metadata +240 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# SOAP4R - literal mapping registry.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require 'soap/baseData'
|
|
11
|
+
require 'soap/mapping/mapping'
|
|
12
|
+
require 'soap/mapping/typeMap'
|
|
13
|
+
require 'xsd/codegen/gensupport'
|
|
14
|
+
require 'xsd/namedelements'
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
module SOAP
|
|
18
|
+
module Mapping
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LiteralRegistry
|
|
22
|
+
include RegistrySupport
|
|
23
|
+
|
|
24
|
+
attr_accessor :excn_handler_obj2soap
|
|
25
|
+
attr_accessor :excn_handler_soap2obj
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
super()
|
|
29
|
+
@excn_handler_obj2soap = nil
|
|
30
|
+
@excn_handler_soap2obj = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def obj2soap(obj, qname, obj_class = nil)
|
|
34
|
+
soap_obj = nil
|
|
35
|
+
if obj.is_a?(SOAPElement)
|
|
36
|
+
soap_obj = obj
|
|
37
|
+
else
|
|
38
|
+
soap_obj = any2soap(obj, qname, obj_class)
|
|
39
|
+
end
|
|
40
|
+
return soap_obj if soap_obj
|
|
41
|
+
if @excn_handler_obj2soap
|
|
42
|
+
soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
|
|
43
|
+
Mapping.obj2soap(yield_obj, nil, nil, MAPPING_OPT)
|
|
44
|
+
}
|
|
45
|
+
return soap_obj if soap_obj
|
|
46
|
+
end
|
|
47
|
+
raise MappingError.new("cannot map #{obj.class.name} as #{qname}")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# node should be a SOAPElement
|
|
51
|
+
def soap2obj(node, obj_class = nil)
|
|
52
|
+
cause = nil
|
|
53
|
+
begin
|
|
54
|
+
return any2obj(node, obj_class)
|
|
55
|
+
rescue MappingError
|
|
56
|
+
cause = $!
|
|
57
|
+
end
|
|
58
|
+
if @excn_handler_soap2obj
|
|
59
|
+
begin
|
|
60
|
+
return @excn_handler_soap2obj.call(node) { |yield_node|
|
|
61
|
+
Mapping.soap2obj(yield_node, nil, nil, MAPPING_OPT)
|
|
62
|
+
}
|
|
63
|
+
rescue Exception
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object", cause)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
MAPPING_OPT = { :no_reference => true }
|
|
72
|
+
|
|
73
|
+
def definedobj2soap(obj, definition)
|
|
74
|
+
obj2soap(obj, definition.elename, definition.mapped_class)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def any2soap(obj, qname, obj_class)
|
|
78
|
+
ele = nil
|
|
79
|
+
if obj.is_a?(SOAP::Mapping::Object)
|
|
80
|
+
return mappingobj2soap(obj, qname)
|
|
81
|
+
end
|
|
82
|
+
class_definition = schema_definition_from_class(obj.class)
|
|
83
|
+
if class_definition.nil? and obj_class
|
|
84
|
+
class_definition = schema_definition_from_class(obj_class)
|
|
85
|
+
end
|
|
86
|
+
elename_definition = schema_definition_from_elename(qname)
|
|
87
|
+
if !class_definition and !elename_definition
|
|
88
|
+
# no definition found
|
|
89
|
+
return anyobj2soap(obj, qname)
|
|
90
|
+
end
|
|
91
|
+
if !class_definition or !elename_definition
|
|
92
|
+
# use found one
|
|
93
|
+
return stubobj2soap(obj, qname, class_definition || elename_definition)
|
|
94
|
+
end
|
|
95
|
+
# found both:
|
|
96
|
+
if class_definition.class_for == elename_definition.class_for
|
|
97
|
+
# if two definitions are for the same class, give qname a priority.
|
|
98
|
+
return stubobj2soap(obj, qname, elename_definition)
|
|
99
|
+
end
|
|
100
|
+
# it should be a derived class
|
|
101
|
+
return stubobj2soap(obj, qname, class_definition)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def anyobj2soap(obj, qname)
|
|
105
|
+
ele = nil
|
|
106
|
+
case obj
|
|
107
|
+
when Hash
|
|
108
|
+
ele = SOAPElement.from_obj(obj, nil)
|
|
109
|
+
ele.elename = qname
|
|
110
|
+
when Array
|
|
111
|
+
# treat as a list of simpletype
|
|
112
|
+
ele = SOAPElement.new(qname, obj.join(" "))
|
|
113
|
+
when XSD::QName
|
|
114
|
+
ele = SOAPElement.new(qname)
|
|
115
|
+
ele.text = obj
|
|
116
|
+
else
|
|
117
|
+
# expected to be a basetype or an anyType.
|
|
118
|
+
# SOAPStruct, etc. is used instead of SOAPElement.
|
|
119
|
+
begin
|
|
120
|
+
ele = Mapping.obj2soap(obj, nil, nil, MAPPING_OPT)
|
|
121
|
+
ele.elename = qname
|
|
122
|
+
rescue MappingError
|
|
123
|
+
ele = SOAPElement.new(qname, obj.to_s)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
add_attributes2soap(obj, ele)
|
|
127
|
+
ele
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def stubobj2soap(obj, qname, definition)
|
|
131
|
+
if obj.nil?
|
|
132
|
+
ele = SOAPNil.new
|
|
133
|
+
ele.elename = qname
|
|
134
|
+
elsif obj.is_a?(::String)
|
|
135
|
+
ele = SOAPElement.new(qname, obj)
|
|
136
|
+
else
|
|
137
|
+
ele = SOAPElement.new(qname)
|
|
138
|
+
end
|
|
139
|
+
ele.qualified = definition.qualified
|
|
140
|
+
if definition.type
|
|
141
|
+
ele.type = definition.type
|
|
142
|
+
if definition.basetype or Mapping.root_type_hint
|
|
143
|
+
Mapping.reset_root_type_hint
|
|
144
|
+
ele.force_typed = true
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
if qname.nil? and definition.elename
|
|
148
|
+
ele.elename = definition.elename
|
|
149
|
+
end
|
|
150
|
+
return ele if obj.nil?
|
|
151
|
+
stubobj2soap_elements(obj, ele, definition.elements)
|
|
152
|
+
add_definedattributes2soap(obj, ele, definition)
|
|
153
|
+
ele
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def stubobj2soap_elements(obj, ele, definition, is_choice = false)
|
|
157
|
+
added = false
|
|
158
|
+
case definition
|
|
159
|
+
when SchemaSequenceDefinition, SchemaEmptyDefinition
|
|
160
|
+
definition.each do |eledef|
|
|
161
|
+
ele_added = stubobj2soap_elements(obj, ele, eledef, is_choice)
|
|
162
|
+
added = true if ele_added
|
|
163
|
+
end
|
|
164
|
+
when SchemaChoiceDefinition
|
|
165
|
+
definition.each do |eledef|
|
|
166
|
+
added = stubobj2soap_elements(obj, ele, eledef, true)
|
|
167
|
+
break if added
|
|
168
|
+
end
|
|
169
|
+
else
|
|
170
|
+
added = true
|
|
171
|
+
if definition.as_any?
|
|
172
|
+
any = Mapping.get_attributes_for_any(obj)
|
|
173
|
+
SOAPElement.from_objs(any).each do |child|
|
|
174
|
+
ele.add(child)
|
|
175
|
+
end
|
|
176
|
+
elsif obj.respond_to?(:each) and definition.as_array?
|
|
177
|
+
obj.each do |item|
|
|
178
|
+
ele.add(definedobj2soap(item, definition))
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
child = Mapping.get_attribute(obj, definition.varname)
|
|
182
|
+
if child.nil? and (is_choice or definition.minoccurs == 0)
|
|
183
|
+
added = false
|
|
184
|
+
else
|
|
185
|
+
if child.respond_to?(:each) and definition.as_array?
|
|
186
|
+
if child.empty?
|
|
187
|
+
added = false
|
|
188
|
+
else
|
|
189
|
+
child.each do |item|
|
|
190
|
+
ele.add(definedobj2soap(item, definition))
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
else
|
|
194
|
+
ele.add(definedobj2soap(child, definition))
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
added
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def mappingobj2soap(obj, qname)
|
|
203
|
+
ele = SOAPElement.new(qname)
|
|
204
|
+
obj.__xmlele.each do |key, value|
|
|
205
|
+
if value.is_a?(::Array)
|
|
206
|
+
value.each do |item|
|
|
207
|
+
ele.add(obj2soap(item, key))
|
|
208
|
+
end
|
|
209
|
+
else
|
|
210
|
+
ele.add(obj2soap(value, key))
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
obj.__xmlattr.each do |key, value|
|
|
214
|
+
ele.extraattr[key] = value
|
|
215
|
+
end
|
|
216
|
+
ele
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def any2obj(node, obj_class = nil)
|
|
220
|
+
is_compound = node.is_a?(::SOAP::SOAPCompoundtype)
|
|
221
|
+
# trust xsi:type first
|
|
222
|
+
if is_compound and node.type
|
|
223
|
+
definition = schema_definition_from_type(node.type)
|
|
224
|
+
end
|
|
225
|
+
# element name next
|
|
226
|
+
definition ||= schema_definition_from_elename(node.elename)
|
|
227
|
+
# class defined in parent type last
|
|
228
|
+
if obj_class
|
|
229
|
+
definition ||= schema_definition_from_class(obj_class)
|
|
230
|
+
end
|
|
231
|
+
if definition
|
|
232
|
+
obj_class = definition.class_for
|
|
233
|
+
end
|
|
234
|
+
if is_compound
|
|
235
|
+
if definition
|
|
236
|
+
return elesoap2stubobj(node, obj_class, definition)
|
|
237
|
+
elsif node.is_a?(::SOAP::SOAPNameAccessible)
|
|
238
|
+
return elesoap2plainobj(node)
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
obj = Mapping.soap2obj(node, nil, obj_class, MAPPING_OPT)
|
|
242
|
+
add_attributes2obj(node, obj)
|
|
243
|
+
obj
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def elesoap2stubobj(node, obj_class, definition)
|
|
247
|
+
obj = nil
|
|
248
|
+
if obj_class == ::String
|
|
249
|
+
obj = node.text
|
|
250
|
+
elsif obj_class < ::String and node.respond_to?(:text)
|
|
251
|
+
obj = obj_class.new(node.text)
|
|
252
|
+
else
|
|
253
|
+
obj = Mapping.create_empty_object(obj_class)
|
|
254
|
+
add_elesoap2stubobj(node, obj, definition)
|
|
255
|
+
end
|
|
256
|
+
add_attributes2stubobj(node, obj, definition)
|
|
257
|
+
obj
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def elesoap2plainobj(node)
|
|
261
|
+
obj = nil
|
|
262
|
+
if !node.have_member
|
|
263
|
+
obj = base2obj(node, ::SOAP::SOAPString)
|
|
264
|
+
else
|
|
265
|
+
obj = anytype2obj(node)
|
|
266
|
+
add_elesoap2plainobj(node, obj)
|
|
267
|
+
end
|
|
268
|
+
add_attributes2obj(node, obj)
|
|
269
|
+
obj
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def anytype2obj(node)
|
|
273
|
+
if node.is_a?(::SOAP::SOAPBasetype)
|
|
274
|
+
return node.data
|
|
275
|
+
end
|
|
276
|
+
::SOAP::Mapping::Object.new
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def add_elesoap2stubobj(node, obj, definition)
|
|
280
|
+
vars = {}
|
|
281
|
+
node.each do |name, value|
|
|
282
|
+
item = definition.elements.find_element(value.elename)
|
|
283
|
+
if item
|
|
284
|
+
child = elesoapchild2obj(value, item)
|
|
285
|
+
else
|
|
286
|
+
# unknown element is treated as anyType.
|
|
287
|
+
child = any2obj(value)
|
|
288
|
+
end
|
|
289
|
+
if item and item.as_array?
|
|
290
|
+
(vars[name] ||= []) << child
|
|
291
|
+
elsif vars.key?(name)
|
|
292
|
+
vars[name] = [vars[name], child].flatten
|
|
293
|
+
else
|
|
294
|
+
vars[name] = child
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
|
|
298
|
+
Array.instance_method(:replace).bind(obj).call(vars.values[0])
|
|
299
|
+
else
|
|
300
|
+
Mapping.set_attributes(obj, vars)
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def elesoapchild2obj(value, eledef)
|
|
305
|
+
if eledef.mapped_class
|
|
306
|
+
if eledef.mapped_class.include?(::SOAP::SOAPBasetype)
|
|
307
|
+
base2obj(value, eledef.mapped_class)
|
|
308
|
+
else
|
|
309
|
+
any2obj(value, eledef.mapped_class)
|
|
310
|
+
end
|
|
311
|
+
else
|
|
312
|
+
child_definition = schema_definition_from_elename(eledef.elename)
|
|
313
|
+
if child_definition
|
|
314
|
+
any2obj(value, child_definition.class_for)
|
|
315
|
+
else
|
|
316
|
+
# untyped element is treated as anyType.
|
|
317
|
+
any2obj(value)
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def add_attributes2stubobj(node, obj, definition)
|
|
323
|
+
return if obj.nil? or node.extraattr.empty?
|
|
324
|
+
if attributes = definition.attributes
|
|
325
|
+
define_xmlattr(obj)
|
|
326
|
+
attributes.each do |qname, class_name|
|
|
327
|
+
child = node.extraattr[qname]
|
|
328
|
+
next if child.nil?
|
|
329
|
+
if class_name
|
|
330
|
+
klass = Mapping.class_from_name(class_name)
|
|
331
|
+
if klass.include?(::SOAP::SOAPBasetype)
|
|
332
|
+
child = klass.to_data(child)
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
obj.__xmlattr[qname] = child
|
|
336
|
+
define_xmlattr_accessor(obj, qname)
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def add_elesoap2plainobj(node, obj)
|
|
342
|
+
node.each do |name, value|
|
|
343
|
+
obj.__add_xmlele_value(value.elename, any2obj(value))
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def add_attributes2obj(node, obj)
|
|
348
|
+
return if obj.nil? or node.extraattr.empty?
|
|
349
|
+
define_xmlattr(obj)
|
|
350
|
+
node.extraattr.each do |qname, value|
|
|
351
|
+
obj.__xmlattr[qname] = value
|
|
352
|
+
define_xmlattr_accessor(obj, qname)
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# Mapping.define_attr_accessor calls define_method with proc and it exhausts
|
|
357
|
+
# much memory for each singleton Object. just instance_eval instead of it.
|
|
358
|
+
def define_xmlattr_accessor(obj, qname)
|
|
359
|
+
# untaint depends GenSupport.safemethodname
|
|
360
|
+
name = Mapping.safemethodname('xmlattr_' + qname.name).untaint
|
|
361
|
+
unless obj.respond_to?(name)
|
|
362
|
+
# untaint depends QName#dump
|
|
363
|
+
qnamedump = qname.dump.untaint
|
|
364
|
+
obj.instance_eval <<-EOS
|
|
365
|
+
def #{name}
|
|
366
|
+
@__xmlattr[#{qnamedump}]
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def #{name}=(value)
|
|
370
|
+
@__xmlattr[#{qnamedump}] = value
|
|
371
|
+
end
|
|
372
|
+
EOS
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
# Mapping.define_attr_accessor calls define_method with proc and it exhausts
|
|
377
|
+
# much memory for each singleton Object. just instance_eval instead of it.
|
|
378
|
+
def define_xmlattr(obj)
|
|
379
|
+
obj.instance_variable_set('@__xmlattr', {})
|
|
380
|
+
unless obj.respond_to?(:__xmlattr)
|
|
381
|
+
obj.instance_eval <<-EOS
|
|
382
|
+
def __xmlattr
|
|
383
|
+
@__xmlattr
|
|
384
|
+
end
|
|
385
|
+
EOS
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
end
|
|
392
|
+
end
|