reidiculous-actionwebservice 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/CHANGELOG +320 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/autoloading/google_search_api.rb +50 -0
  7. data/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
  8. data/examples/googlesearch/delegated/google_search_service.rb +108 -0
  9. data/examples/googlesearch/delegated/search_controller.rb +7 -0
  10. data/examples/googlesearch/direct/google_search_api.rb +50 -0
  11. data/examples/googlesearch/direct/search_controller.rb +58 -0
  12. data/examples/metaWeblog/apis/blogger_api.rb +60 -0
  13. data/examples/metaWeblog/apis/blogger_service.rb +34 -0
  14. data/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
  15. data/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
  16. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
  17. data/generators/web_service/USAGE +28 -0
  18. data/generators/web_service/templates/api_definition.rb +5 -0
  19. data/generators/web_service/templates/controller.rb +8 -0
  20. data/generators/web_service/templates/functional_test.rb +19 -0
  21. data/generators/web_service/web_service_generator.rb +29 -0
  22. data/lib/action_web_service.rb +71 -0
  23. data/lib/action_web_service/api.rb +297 -0
  24. data/lib/action_web_service/base.rb +38 -0
  25. data/lib/action_web_service/casting.rb +149 -0
  26. data/lib/action_web_service/client.rb +3 -0
  27. data/lib/action_web_service/client/base.rb +28 -0
  28. data/lib/action_web_service/client/soap_client.rb +113 -0
  29. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  30. data/lib/action_web_service/container.rb +3 -0
  31. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  32. data/lib/action_web_service/container/delegated_container.rb +86 -0
  33. data/lib/action_web_service/container/direct_container.rb +69 -0
  34. data/lib/action_web_service/dispatcher.rb +2 -0
  35. data/lib/action_web_service/dispatcher/abstract.rb +207 -0
  36. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +379 -0
  37. data/lib/action_web_service/invocation.rb +202 -0
  38. data/lib/action_web_service/protocol.rb +4 -0
  39. data/lib/action_web_service/protocol/abstract.rb +115 -0
  40. data/lib/action_web_service/protocol/discovery.rb +37 -0
  41. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  42. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  43. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +122 -0
  44. data/lib/action_web_service/scaffolding.rb +281 -0
  45. data/lib/action_web_service/soap/attachment.rb +107 -0
  46. data/lib/action_web_service/soap/baseData.rb +942 -0
  47. data/lib/action_web_service/soap/element.rb +258 -0
  48. data/lib/action_web_service/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  49. data/lib/action_web_service/soap/encodingstyle/handler.rb +100 -0
  50. data/lib/action_web_service/soap/encodingstyle/literalHandler.rb +226 -0
  51. data/lib/action_web_service/soap/encodingstyle/soapHandler.rb +582 -0
  52. data/lib/action_web_service/soap/generator.rb +268 -0
  53. data/lib/action_web_service/soap/header/handler.rb +57 -0
  54. data/lib/action_web_service/soap/header/handlerset.rb +70 -0
  55. data/lib/action_web_service/soap/header/simplehandler.rb +44 -0
  56. data/lib/action_web_service/soap/httpconfigloader.rb +119 -0
  57. data/lib/action_web_service/soap/mapping.rb +10 -0
  58. data/lib/action_web_service/soap/mapping/factory.rb +355 -0
  59. data/lib/action_web_service/soap/mapping/mapping.rb +381 -0
  60. data/lib/action_web_service/soap/mapping/registry.rb +541 -0
  61. data/lib/action_web_service/soap/mapping/rubytypeFactory.rb +475 -0
  62. data/lib/action_web_service/soap/mapping/typeMap.rb +50 -0
  63. data/lib/action_web_service/soap/mapping/wsdlencodedregistry.rb +280 -0
  64. data/lib/action_web_service/soap/mapping/wsdlliteralregistry.rb +418 -0
  65. data/lib/action_web_service/soap/marshal.rb +59 -0
  66. data/lib/action_web_service/soap/mimemessage.rb +240 -0
  67. data/lib/action_web_service/soap/netHttpClient.rb +190 -0
  68. data/lib/action_web_service/soap/parser.rb +251 -0
  69. data/lib/action_web_service/soap/processor.rb +66 -0
  70. data/lib/action_web_service/soap/property.rb +333 -0
  71. data/lib/action_web_service/soap/rpc/cgistub.rb +206 -0
  72. data/lib/action_web_service/soap/rpc/driver.rb +254 -0
  73. data/lib/action_web_service/soap/rpc/element.rb +325 -0
  74. data/lib/action_web_service/soap/rpc/httpserver.rb +129 -0
  75. data/lib/action_web_service/soap/rpc/proxy.rb +497 -0
  76. data/lib/action_web_service/soap/rpc/router.rb +594 -0
  77. data/lib/action_web_service/soap/rpc/rpc.rb +25 -0
  78. data/lib/action_web_service/soap/rpc/soaplet.rb +162 -0
  79. data/lib/action_web_service/soap/rpc/standaloneServer.rb +43 -0
  80. data/lib/action_web_service/soap/soap.rb +140 -0
  81. data/lib/action_web_service/soap/streamHandler.rb +229 -0
  82. data/lib/action_web_service/soap/wsdlDriver.rb +575 -0
  83. data/lib/action_web_service/struct.rb +64 -0
  84. data/lib/action_web_service/support/class_inheritable_options.rb +28 -0
  85. data/lib/action_web_service/support/signature_types.rb +227 -0
  86. data/lib/action_web_service/test_invoke.rb +110 -0
  87. data/lib/action_web_service/version.rb +9 -0
  88. data/lib/action_web_service/wsdl/binding.rb +65 -0
  89. data/lib/action_web_service/wsdl/data.rb +64 -0
  90. data/lib/action_web_service/wsdl/definitions.rb +250 -0
  91. data/lib/action_web_service/wsdl/documentation.rb +32 -0
  92. data/lib/action_web_service/wsdl/import.rb +80 -0
  93. data/lib/action_web_service/wsdl/importer.rb +38 -0
  94. data/lib/action_web_service/wsdl/info.rb +39 -0
  95. data/lib/action_web_service/wsdl/message.rb +54 -0
  96. data/lib/action_web_service/wsdl/operation.rb +130 -0
  97. data/lib/action_web_service/wsdl/operationBinding.rb +108 -0
  98. data/lib/action_web_service/wsdl/param.rb +85 -0
  99. data/lib/action_web_service/wsdl/parser.rb +163 -0
  100. data/lib/action_web_service/wsdl/part.rb +52 -0
  101. data/lib/action_web_service/wsdl/port.rb +84 -0
  102. data/lib/action_web_service/wsdl/portType.rb +73 -0
  103. data/lib/action_web_service/wsdl/service.rb +61 -0
  104. data/lib/action_web_service/wsdl/soap/address.rb +40 -0
  105. data/lib/action_web_service/wsdl/soap/binding.rb +49 -0
  106. data/lib/action_web_service/wsdl/soap/body.rb +56 -0
  107. data/lib/action_web_service/wsdl/soap/cgiStubCreator.rb +76 -0
  108. data/lib/action_web_service/wsdl/soap/classDefCreator.rb +314 -0
  109. data/lib/action_web_service/wsdl/soap/classDefCreatorSupport.rb +126 -0
  110. data/lib/action_web_service/wsdl/soap/clientSkeltonCreator.rb +78 -0
  111. data/lib/action_web_service/wsdl/soap/complexType.rb +161 -0
  112. data/lib/action_web_service/wsdl/soap/data.rb +42 -0
  113. data/lib/action_web_service/wsdl/soap/definitions.rb +149 -0
  114. data/lib/action_web_service/wsdl/soap/driverCreator.rb +95 -0
  115. data/lib/action_web_service/wsdl/soap/element.rb +28 -0
  116. data/lib/action_web_service/wsdl/soap/fault.rb +56 -0
  117. data/lib/action_web_service/wsdl/soap/header.rb +86 -0
  118. data/lib/action_web_service/wsdl/soap/headerfault.rb +56 -0
  119. data/lib/action_web_service/wsdl/soap/mappingRegistryCreator.rb +92 -0
  120. data/lib/action_web_service/wsdl/soap/methodDefCreator.rb +228 -0
  121. data/lib/action_web_service/wsdl/soap/operation.rb +122 -0
  122. data/lib/action_web_service/wsdl/soap/servantSkeltonCreator.rb +67 -0
  123. data/lib/action_web_service/wsdl/soap/standaloneServerStubCreator.rb +85 -0
  124. data/lib/action_web_service/wsdl/soap/wsdl2ruby.rb +176 -0
  125. data/lib/action_web_service/wsdl/types.rb +43 -0
  126. data/lib/action_web_service/wsdl/wsdl.rb +23 -0
  127. data/lib/action_web_service/wsdl/xmlSchema/all.rb +69 -0
  128. data/lib/action_web_service/wsdl/xmlSchema/annotation.rb +34 -0
  129. data/lib/action_web_service/wsdl/xmlSchema/any.rb +56 -0
  130. data/lib/action_web_service/wsdl/xmlSchema/attribute.rb +127 -0
  131. data/lib/action_web_service/wsdl/xmlSchema/choice.rb +69 -0
  132. data/lib/action_web_service/wsdl/xmlSchema/complexContent.rb +92 -0
  133. data/lib/action_web_service/wsdl/xmlSchema/complexType.rb +139 -0
  134. data/lib/action_web_service/wsdl/xmlSchema/content.rb +96 -0
  135. data/lib/action_web_service/wsdl/xmlSchema/data.rb +80 -0
  136. data/lib/action_web_service/wsdl/xmlSchema/element.rb +154 -0
  137. data/lib/action_web_service/wsdl/xmlSchema/enumeration.rb +36 -0
  138. data/lib/action_web_service/wsdl/xmlSchema/import.rb +65 -0
  139. data/lib/action_web_service/wsdl/xmlSchema/importer.rb +87 -0
  140. data/lib/action_web_service/wsdl/xmlSchema/include.rb +54 -0
  141. data/lib/action_web_service/wsdl/xmlSchema/length.rb +35 -0
  142. data/lib/action_web_service/wsdl/xmlSchema/parser.rb +166 -0
  143. data/lib/action_web_service/wsdl/xmlSchema/pattern.rb +36 -0
  144. data/lib/action_web_service/wsdl/xmlSchema/schema.rb +143 -0
  145. data/lib/action_web_service/wsdl/xmlSchema/sequence.rb +69 -0
  146. data/lib/action_web_service/wsdl/xmlSchema/simpleContent.rb +65 -0
  147. data/lib/action_web_service/wsdl/xmlSchema/simpleExtension.rb +54 -0
  148. data/lib/action_web_service/wsdl/xmlSchema/simpleRestriction.rb +73 -0
  149. data/lib/action_web_service/wsdl/xmlSchema/simpleType.rb +73 -0
  150. data/lib/action_web_service/wsdl/xmlSchema/unique.rb +34 -0
  151. data/lib/action_web_service/wsdl/xmlSchema/xsd2ruby.rb +107 -0
  152. data/lib/action_web_service/xsd/charset.rb +187 -0
  153. data/lib/action_web_service/xsd/codegen.rb +12 -0
  154. data/lib/action_web_service/xsd/codegen/classdef.rb +203 -0
  155. data/lib/action_web_service/xsd/codegen/commentdef.rb +34 -0
  156. data/lib/action_web_service/xsd/codegen/gensupport.rb +166 -0
  157. data/lib/action_web_service/xsd/codegen/methoddef.rb +63 -0
  158. data/lib/action_web_service/xsd/codegen/moduledef.rb +191 -0
  159. data/lib/action_web_service/xsd/datatypes.rb +1269 -0
  160. data/lib/action_web_service/xsd/datatypes1999.rb +20 -0
  161. data/lib/action_web_service/xsd/iconvcharset.rb +33 -0
  162. data/lib/action_web_service/xsd/mapping.rb +42 -0
  163. data/lib/action_web_service/xsd/namedelements.rb +95 -0
  164. data/lib/action_web_service/xsd/ns.rb +140 -0
  165. data/lib/action_web_service/xsd/qname.rb +78 -0
  166. data/lib/action_web_service/xsd/xmlparser.rb +61 -0
  167. data/lib/action_web_service/xsd/xmlparser/parser.rb +96 -0
  168. data/lib/action_web_service/xsd/xmlparser/rexmlparser.rb +54 -0
  169. data/lib/action_web_service/xsd/xmlparser/xmlparser.rb +50 -0
  170. data/lib/action_web_service/xsd/xmlparser/xmlscanner.rb +147 -0
  171. data/lib/actionwebservice.rb +1 -0
  172. data/setup.rb +1379 -0
  173. data/test/abstract_client.rb +183 -0
  174. data/test/abstract_dispatcher.rb +548 -0
  175. data/test/abstract_unit.rb +45 -0
  176. data/test/api_test.rb +103 -0
  177. data/test/apis/auto_load_api.rb +3 -0
  178. data/test/apis/broken_auto_load_api.rb +2 -0
  179. data/test/base_test.rb +42 -0
  180. data/test/casting_test.rb +95 -0
  181. data/test/client_soap_test.rb +156 -0
  182. data/test/client_xmlrpc_test.rb +153 -0
  183. data/test/container_test.rb +73 -0
  184. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  185. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  186. data/test/fixtures/db_definitions/mysql.sql +8 -0
  187. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  188. data/test/fixtures/users.yml +12 -0
  189. data/test/gencov +3 -0
  190. data/test/invocation_test.rb +185 -0
  191. data/test/run +6 -0
  192. data/test/scaffolded_controller_test.rb +146 -0
  193. data/test/struct_test.rb +52 -0
  194. data/test/test_invoke_test.rb +112 -0
  195. metadata +281 -0
@@ -0,0 +1,541 @@
1
+ # SOAP4R - Mapping registry.
2
+ # Copyright (C) 2000, 2001, 2002, 2003 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 'action_web_service/soap/baseData'
10
+ require 'action_web_service/soap/mapping/mapping'
11
+ require 'action_web_service/soap/mapping/typeMap'
12
+ require 'action_web_service/soap/mapping/factory'
13
+ require 'action_web_service/soap/mapping/rubytypeFactory'
14
+
15
+
16
+ module SOAP
17
+
18
+
19
+ module Marshallable
20
+ # @@type_ns = Mapping::RubyCustomTypeNamespace
21
+ end
22
+
23
+
24
+ module Mapping
25
+
26
+
27
+ module MappedException; end
28
+
29
+
30
+ RubyTypeName = XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType')
31
+ RubyExtendName = XSD::QName.new(RubyTypeInstanceNamespace, 'extends')
32
+ RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
33
+
34
+
35
+ # Inner class to pass an exception.
36
+ class SOAPException; include Marshallable
37
+ attr_reader :excn_type_name, :cause
38
+ def initialize(e)
39
+ @excn_type_name = Mapping.name2elename(e.class.to_s)
40
+ @cause = e
41
+ end
42
+
43
+ def to_e
44
+ if @cause.is_a?(::Exception)
45
+ @cause.extend(::SOAP::Mapping::MappedException)
46
+ return @cause
47
+ elsif @cause.respond_to?(:message) and @cause.respond_to?(:backtrace)
48
+ e = RuntimeError.new(@cause.message)
49
+ e.set_backtrace(@cause.backtrace)
50
+ return e
51
+ end
52
+ klass = Mapping.class_from_name(Mapping.elename2name(@excn_type_name.to_s))
53
+ if klass.nil? or not klass <= ::Exception
54
+ return RuntimeError.new(@cause.inspect)
55
+ end
56
+ obj = klass.new(@cause.message)
57
+ obj.extend(::SOAP::Mapping::MappedException)
58
+ obj
59
+ end
60
+ end
61
+
62
+
63
+ # For anyType object: SOAP::Mapping::Object not ::Object
64
+ class Object; include Marshallable
65
+ def initialize
66
+ @__xmlele_type = {}
67
+ @__xmlele = []
68
+ @__xmlattr = {}
69
+ end
70
+
71
+ def inspect
72
+ sprintf("#<%s:0x%x%s>", self.class.name, __id__,
73
+ @__xmlele.collect { |name, value| " #{name}=#{value.inspect}" }.join)
74
+ end
75
+
76
+ def __xmlattr
77
+ @__xmlattr
78
+ end
79
+
80
+ def __xmlele
81
+ @__xmlele
82
+ end
83
+
84
+ def [](qname)
85
+ unless qname.is_a?(XSD::QName)
86
+ qname = XSD::QName.new(nil, qname)
87
+ end
88
+ @__xmlele.each do |k, v|
89
+ return v if k == qname
90
+ end
91
+ # fallback
92
+ @__xmlele.each do |k, v|
93
+ return v if k.name == qname.name
94
+ end
95
+ nil
96
+ end
97
+
98
+ def []=(qname, value)
99
+ unless qname.is_a?(XSD::QName)
100
+ qname = XSD::QName.new(nil, qname)
101
+ end
102
+ found = false
103
+ @__xmlele.each do |pair|
104
+ if pair[0] == qname
105
+ found = true
106
+ pair[1] = value
107
+ end
108
+ end
109
+ unless found
110
+ __define_attr_accessor(qname)
111
+ @__xmlele << [qname, value]
112
+ end
113
+ @__xmlele_type[qname] = :single
114
+ end
115
+
116
+ def __add_xmlele_value(qname, value)
117
+ found = false
118
+ @__xmlele.map! do |k, v|
119
+ if k == qname
120
+ found = true
121
+ [k, __set_xmlele_value(k, v, value)]
122
+ else
123
+ [k, v]
124
+ end
125
+ end
126
+ unless found
127
+ __define_attr_accessor(qname)
128
+ @__xmlele << [qname, value]
129
+ @__xmlele_type[qname] = :single
130
+ end
131
+ value
132
+ end
133
+
134
+ private
135
+
136
+ if RUBY_VERSION > "1.7.0"
137
+ def __define_attr_accessor(qname)
138
+ name = XSD::CodeGen::GenSupport.safemethodname(qname.name)
139
+ Mapping.define_attr_accessor(self, name,
140
+ proc { self[qname] },
141
+ proc { |value| self[qname] = value })
142
+ end
143
+ else
144
+ def __define_attr_accessor(qname)
145
+ name = XSD::CodeGen::GenSupport.safemethodname(qname.name)
146
+ instance_eval <<-EOS
147
+ def #{name}
148
+ self[#{qname.dump}]
149
+ end
150
+
151
+ def #{name}=(value)
152
+ self[#{qname.dump}] = value
153
+ end
154
+ EOS
155
+ end
156
+ end
157
+
158
+ def __set_xmlele_value(key, org, value)
159
+ case @__xmlele_type[key]
160
+ when :multi
161
+ org << value
162
+ org
163
+ when :single
164
+ @__xmlele_type[key] = :multi
165
+ [org, value]
166
+ else
167
+ raise RuntimeError.new("unknown type")
168
+ end
169
+ end
170
+ end
171
+
172
+
173
+ class MappingError < Error; end
174
+
175
+
176
+ class Registry
177
+ class Map
178
+ def initialize(registry)
179
+ @obj2soap = {}
180
+ @soap2obj = {}
181
+ @registry = registry
182
+ end
183
+
184
+ def obj2soap(obj)
185
+ klass = obj.class
186
+ if map = @obj2soap[klass]
187
+ map.each do |soap_class, factory, info|
188
+ ret = factory.obj2soap(soap_class, obj, info, @registry)
189
+ return ret if ret
190
+ end
191
+ end
192
+ ancestors = klass.ancestors
193
+ ancestors.delete(klass)
194
+ ancestors.delete(::Object)
195
+ ancestors.delete(::Kernel)
196
+ ancestors.each do |klass|
197
+ if map = @obj2soap[klass]
198
+ map.each do |soap_class, factory, info|
199
+ if info[:derived_class]
200
+ ret = factory.obj2soap(soap_class, obj, info, @registry)
201
+ return ret if ret
202
+ end
203
+ end
204
+ end
205
+ end
206
+ nil
207
+ end
208
+
209
+ def soap2obj(node, klass = nil)
210
+ if map = @soap2obj[node.class]
211
+ map.each do |obj_class, factory, info|
212
+ next if klass and obj_class != klass
213
+ conv, obj = factory.soap2obj(obj_class, node, info, @registry)
214
+ return true, obj if conv
215
+ end
216
+ end
217
+ return false, nil
218
+ end
219
+
220
+ # Give priority to former entry.
221
+ def init(init_map = [])
222
+ clear
223
+ init_map.reverse_each do |obj_class, soap_class, factory, info|
224
+ add(obj_class, soap_class, factory, info)
225
+ end
226
+ end
227
+
228
+ # Give priority to latter entry.
229
+ def add(obj_class, soap_class, factory, info)
230
+ info ||= {}
231
+ (@obj2soap[obj_class] ||= []).unshift([soap_class, factory, info])
232
+ (@soap2obj[soap_class] ||= []).unshift([obj_class, factory, info])
233
+ end
234
+
235
+ def clear
236
+ @obj2soap.clear
237
+ @soap2obj.clear
238
+ end
239
+
240
+ def find_mapped_soap_class(target_obj_class)
241
+ map = @obj2soap[target_obj_class]
242
+ map.empty? ? nil : map[0][1]
243
+ end
244
+
245
+ def find_mapped_obj_class(target_soap_class)
246
+ map = @soap2obj[target_soap_class]
247
+ map.empty? ? nil : map[0][0]
248
+ end
249
+ end
250
+
251
+ StringFactory = StringFactory_.new
252
+ BasetypeFactory = BasetypeFactory_.new
253
+ DateTimeFactory = DateTimeFactory_.new
254
+ ArrayFactory = ArrayFactory_.new
255
+ Base64Factory = Base64Factory_.new
256
+ URIFactory = URIFactory_.new
257
+ TypedArrayFactory = TypedArrayFactory_.new
258
+ TypedStructFactory = TypedStructFactory_.new
259
+
260
+ HashFactory = HashFactory_.new
261
+
262
+ SOAPBaseMap = [
263
+ [::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
264
+ [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
265
+ [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
266
+ [::String, ::SOAP::SOAPString, StringFactory],
267
+ [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
268
+ [::Date, ::SOAP::SOAPDate, DateTimeFactory],
269
+ [::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
270
+ [::Time, ::SOAP::SOAPTime, DateTimeFactory],
271
+ [::Float, ::SOAP::SOAPDouble, BasetypeFactory,
272
+ {:derived_class => true}],
273
+ [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
274
+ {:derived_class => true}],
275
+ [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
276
+ {:derived_class => true}],
277
+ [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
278
+ {:derived_class => true}],
279
+ [::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
280
+ {:derived_class => true}],
281
+ [::Integer, ::SOAP::SOAPShort, BasetypeFactory,
282
+ {:derived_class => true}],
283
+ [::Integer, ::SOAP::SOAPByte, BasetypeFactory,
284
+ {:derived_class => true}],
285
+ [::Integer, ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,
286
+ {:derived_class => true}],
287
+ [::Integer, ::SOAP::SOAPNegativeInteger, BasetypeFactory,
288
+ {:derived_class => true}],
289
+ [::Integer, ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,
290
+ {:derived_class => true}],
291
+ [::Integer, ::SOAP::SOAPPositiveInteger, BasetypeFactory,
292
+ {:derived_class => true}],
293
+ [::Integer, ::SOAP::SOAPUnsignedLong, BasetypeFactory,
294
+ {:derived_class => true}],
295
+ [::Integer, ::SOAP::SOAPUnsignedInt, BasetypeFactory,
296
+ {:derived_class => true}],
297
+ [::Integer, ::SOAP::SOAPUnsignedShort, BasetypeFactory,
298
+ {:derived_class => true}],
299
+ [::Integer, ::SOAP::SOAPUnsignedByte, BasetypeFactory,
300
+ {:derived_class => true}],
301
+ [::URI::Generic, ::SOAP::SOAPAnyURI, URIFactory,
302
+ {:derived_class => true}],
303
+ [::String, ::SOAP::SOAPBase64, Base64Factory],
304
+ [::String, ::SOAP::SOAPHexBinary, Base64Factory],
305
+ [::String, ::SOAP::SOAPDecimal, BasetypeFactory],
306
+ [::String, ::SOAP::SOAPDuration, BasetypeFactory],
307
+ [::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
308
+ [::String, ::SOAP::SOAPGYear, BasetypeFactory],
309
+ [::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
310
+ [::String, ::SOAP::SOAPGDay, BasetypeFactory],
311
+ [::String, ::SOAP::SOAPGMonth, BasetypeFactory],
312
+ [::String, ::SOAP::SOAPQName, BasetypeFactory],
313
+
314
+ [::Hash, ::SOAP::SOAPArray, HashFactory],
315
+ [::Hash, ::SOAP::SOAPStruct, HashFactory],
316
+
317
+ [::Array, ::SOAP::SOAPArray, ArrayFactory,
318
+ {:derived_class => true}],
319
+
320
+ [::SOAP::Mapping::SOAPException,
321
+ ::SOAP::SOAPStruct, TypedStructFactory,
322
+ {:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
323
+ ]
324
+
325
+ RubyOriginalMap = [
326
+ [::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
327
+ [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
328
+ [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
329
+ [::String, ::SOAP::SOAPString, StringFactory],
330
+ [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
331
+ [::Date, ::SOAP::SOAPDate, DateTimeFactory],
332
+ [::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
333
+ [::Time, ::SOAP::SOAPTime, DateTimeFactory],
334
+ [::Float, ::SOAP::SOAPDouble, BasetypeFactory,
335
+ {:derived_class => true}],
336
+ [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
337
+ {:derived_class => true}],
338
+ [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
339
+ {:derived_class => true}],
340
+ [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
341
+ {:derived_class => true}],
342
+ [::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
343
+ {:derived_class => true}],
344
+ [::Integer, ::SOAP::SOAPShort, BasetypeFactory,
345
+ {:derived_class => true}],
346
+ [::Integer, ::SOAP::SOAPByte, BasetypeFactory,
347
+ {:derived_class => true}],
348
+ [::Integer, ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,
349
+ {:derived_class => true}],
350
+ [::Integer, ::SOAP::SOAPNegativeInteger, BasetypeFactory,
351
+ {:derived_class => true}],
352
+ [::Integer, ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,
353
+ {:derived_class => true}],
354
+ [::Integer, ::SOAP::SOAPPositiveInteger, BasetypeFactory,
355
+ {:derived_class => true}],
356
+ [::Integer, ::SOAP::SOAPUnsignedLong, BasetypeFactory,
357
+ {:derived_class => true}],
358
+ [::Integer, ::SOAP::SOAPUnsignedInt, BasetypeFactory,
359
+ {:derived_class => true}],
360
+ [::Integer, ::SOAP::SOAPUnsignedShort, BasetypeFactory,
361
+ {:derived_class => true}],
362
+ [::Integer, ::SOAP::SOAPUnsignedByte, BasetypeFactory,
363
+ {:derived_class => true}],
364
+ [::URI::Generic, ::SOAP::SOAPAnyURI, URIFactory,
365
+ {:derived_class => true}],
366
+ [::String, ::SOAP::SOAPBase64, Base64Factory],
367
+ [::String, ::SOAP::SOAPHexBinary, Base64Factory],
368
+ [::String, ::SOAP::SOAPDecimal, BasetypeFactory],
369
+ [::String, ::SOAP::SOAPDuration, BasetypeFactory],
370
+ [::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
371
+ [::String, ::SOAP::SOAPGYear, BasetypeFactory],
372
+ [::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
373
+ [::String, ::SOAP::SOAPGDay, BasetypeFactory],
374
+ [::String, ::SOAP::SOAPGMonth, BasetypeFactory],
375
+ [::String, ::SOAP::SOAPQName, BasetypeFactory],
376
+
377
+ [::Hash, ::SOAP::SOAPArray, HashFactory],
378
+ [::Hash, ::SOAP::SOAPStruct, HashFactory],
379
+
380
+ # Does not allow Array's subclass here.
381
+ [::Array, ::SOAP::SOAPArray, ArrayFactory],
382
+
383
+ [::SOAP::Mapping::SOAPException,
384
+ ::SOAP::SOAPStruct, TypedStructFactory,
385
+ {:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
386
+ ]
387
+
388
+ attr_accessor :default_factory
389
+ attr_accessor :excn_handler_obj2soap
390
+ attr_accessor :excn_handler_soap2obj
391
+
392
+ def initialize(config = {})
393
+ @config = config
394
+ @map = Map.new(self)
395
+ if @config[:allow_original_mapping]
396
+ @allow_original_mapping = true
397
+ @map.init(RubyOriginalMap)
398
+ else
399
+ @allow_original_mapping = false
400
+ @map.init(SOAPBaseMap)
401
+ end
402
+ @allow_untyped_struct = @config.key?(:allow_untyped_struct) ?
403
+ @config[:allow_untyped_struct] : true
404
+ @rubytype_factory = RubytypeFactory.new(
405
+ :allow_untyped_struct => @allow_untyped_struct,
406
+ :allow_original_mapping => @allow_original_mapping
407
+ )
408
+ @default_factory = @rubytype_factory
409
+ @excn_handler_obj2soap = nil
410
+ @excn_handler_soap2obj = nil
411
+ end
412
+
413
+ def add(obj_class, soap_class, factory, info = nil)
414
+ @map.add(obj_class, soap_class, factory, info)
415
+ end
416
+ alias set add
417
+
418
+ # general Registry ignores type_qname
419
+ def obj2soap(obj, type_qname = nil)
420
+ soap = _obj2soap(obj)
421
+ if @allow_original_mapping
422
+ addextend2soap(soap, obj)
423
+ end
424
+ soap
425
+ end
426
+
427
+ def soap2obj(node, klass = nil)
428
+ obj = _soap2obj(node, klass)
429
+ if @allow_original_mapping
430
+ addextend2obj(obj, node.extraattr[RubyExtendName])
431
+ addiv2obj(obj, node.extraattr[RubyIVarName])
432
+ end
433
+ obj
434
+ end
435
+
436
+ def find_mapped_soap_class(obj_class)
437
+ @map.find_mapped_soap_class(obj_class)
438
+ end
439
+
440
+ def find_mapped_obj_class(soap_class)
441
+ @map.find_mapped_obj_class(soap_class)
442
+ end
443
+
444
+ private
445
+
446
+ def _obj2soap(obj)
447
+ ret = nil
448
+ if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray)
449
+ obj.replace do |ele|
450
+ Mapping._obj2soap(ele, self)
451
+ end
452
+ return obj
453
+ elsif obj.is_a?(SOAPBasetype)
454
+ return obj
455
+ end
456
+ begin
457
+ ret = @map.obj2soap(obj) ||
458
+ @default_factory.obj2soap(nil, obj, nil, self)
459
+ return ret if ret
460
+ rescue MappingError
461
+ end
462
+ if @excn_handler_obj2soap
463
+ ret = @excn_handler_obj2soap.call(obj) { |yield_obj|
464
+ Mapping._obj2soap(yield_obj, self)
465
+ }
466
+ return ret if ret
467
+ end
468
+ raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.")
469
+ end
470
+
471
+ # Might return nil as a mapping result.
472
+ def _soap2obj(node, klass = nil)
473
+ if node.extraattr.key?(RubyTypeName)
474
+ conv, obj = @rubytype_factory.soap2obj(nil, node, nil, self)
475
+ return obj if conv
476
+ else
477
+ conv, obj = @map.soap2obj(node, klass)
478
+ return obj if conv
479
+ conv, obj = @default_factory.soap2obj(nil, node, nil, self)
480
+ return obj if conv
481
+ end
482
+ if @excn_handler_soap2obj
483
+ begin
484
+ return @excn_handler_soap2obj.call(node) { |yield_node|
485
+ Mapping._soap2obj(yield_node, self)
486
+ }
487
+ rescue Exception
488
+ end
489
+ end
490
+ raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.")
491
+ end
492
+
493
+ def addiv2obj(obj, attr)
494
+ return unless attr
495
+ vars = {}
496
+ attr.__getobj__.each do |name, value|
497
+ vars[name] = Mapping._soap2obj(value, self)
498
+ end
499
+ Mapping.set_attributes(obj, vars)
500
+ end
501
+
502
+ if RUBY_VERSION >= '1.8.0'
503
+ def addextend2obj(obj, attr)
504
+ return unless attr
505
+ attr.split(/ /).reverse_each do |mstr|
506
+ obj.extend(Mapping.module_from_name(mstr))
507
+ end
508
+ end
509
+ else
510
+ # (class < false; self; end).ancestors includes "TrueClass" under 1.6...
511
+ def addextend2obj(obj, attr)
512
+ return unless attr
513
+ attr.split(/ /).reverse_each do |mstr|
514
+ m = Mapping.module_from_name(mstr)
515
+ obj.extend(m)
516
+ end
517
+ end
518
+ end
519
+
520
+ def addextend2soap(node, obj)
521
+ return if obj.is_a?(Symbol) or obj.is_a?(Fixnum)
522
+ list = (class << obj; self; end).ancestors - obj.class.ancestors
523
+ unless list.empty?
524
+ node.extraattr[RubyExtendName] = list.collect { |c|
525
+ if c.name.empty?
526
+ raise TypeError.new("singleton can't be dumped #{ obj }")
527
+ end
528
+ c.name
529
+ }.join(" ")
530
+ end
531
+ end
532
+
533
+ end
534
+
535
+
536
+ DefaultRegistry = Registry.new
537
+ RubyOriginalRegistry = Registry.new(:allow_original_mapping => true)
538
+
539
+
540
+ end
541
+ end