reidiculous-actionwebservice-client 3.0.4

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.
Files changed (179) 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/lib/action_web_service.rb +71 -0
  7. data/lib/action_web_service/api.rb +297 -0
  8. data/lib/action_web_service/base.rb +38 -0
  9. data/lib/action_web_service/casting.rb +149 -0
  10. data/lib/action_web_service/client.rb +3 -0
  11. data/lib/action_web_service/client/base.rb +28 -0
  12. data/lib/action_web_service/client/soap_client.rb +113 -0
  13. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  14. data/lib/action_web_service/container.rb +3 -0
  15. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  16. data/lib/action_web_service/container/delegated_container.rb +86 -0
  17. data/lib/action_web_service/container/direct_container.rb +69 -0
  18. data/lib/action_web_service/dispatcher.rb +2 -0
  19. data/lib/action_web_service/dispatcher/abstract.rb +207 -0
  20. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +379 -0
  21. data/lib/action_web_service/invocation.rb +202 -0
  22. data/lib/action_web_service/protocol.rb +4 -0
  23. data/lib/action_web_service/protocol/abstract.rb +115 -0
  24. data/lib/action_web_service/protocol/discovery.rb +37 -0
  25. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  26. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  27. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +122 -0
  28. data/lib/action_web_service/scaffolding.rb +281 -0
  29. data/lib/action_web_service/soap/attachment.rb +107 -0
  30. data/lib/action_web_service/soap/baseData.rb +942 -0
  31. data/lib/action_web_service/soap/element.rb +258 -0
  32. data/lib/action_web_service/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  33. data/lib/action_web_service/soap/encodingstyle/handler.rb +100 -0
  34. data/lib/action_web_service/soap/encodingstyle/literalHandler.rb +226 -0
  35. data/lib/action_web_service/soap/encodingstyle/soapHandler.rb +582 -0
  36. data/lib/action_web_service/soap/generator.rb +268 -0
  37. data/lib/action_web_service/soap/header/handler.rb +57 -0
  38. data/lib/action_web_service/soap/header/handlerset.rb +70 -0
  39. data/lib/action_web_service/soap/header/simplehandler.rb +44 -0
  40. data/lib/action_web_service/soap/httpconfigloader.rb +119 -0
  41. data/lib/action_web_service/soap/mapping.rb +10 -0
  42. data/lib/action_web_service/soap/mapping/factory.rb +355 -0
  43. data/lib/action_web_service/soap/mapping/mapping.rb +381 -0
  44. data/lib/action_web_service/soap/mapping/registry.rb +541 -0
  45. data/lib/action_web_service/soap/mapping/rubytypeFactory.rb +475 -0
  46. data/lib/action_web_service/soap/mapping/typeMap.rb +50 -0
  47. data/lib/action_web_service/soap/mapping/wsdlencodedregistry.rb +280 -0
  48. data/lib/action_web_service/soap/mapping/wsdlliteralregistry.rb +418 -0
  49. data/lib/action_web_service/soap/marshal.rb +59 -0
  50. data/lib/action_web_service/soap/mimemessage.rb +240 -0
  51. data/lib/action_web_service/soap/netHttpClient.rb +190 -0
  52. data/lib/action_web_service/soap/parser.rb +251 -0
  53. data/lib/action_web_service/soap/processor.rb +66 -0
  54. data/lib/action_web_service/soap/property.rb +333 -0
  55. data/lib/action_web_service/soap/rpc/cgistub.rb +206 -0
  56. data/lib/action_web_service/soap/rpc/driver.rb +254 -0
  57. data/lib/action_web_service/soap/rpc/element.rb +325 -0
  58. data/lib/action_web_service/soap/rpc/httpserver.rb +129 -0
  59. data/lib/action_web_service/soap/rpc/proxy.rb +497 -0
  60. data/lib/action_web_service/soap/rpc/router.rb +594 -0
  61. data/lib/action_web_service/soap/rpc/rpc.rb +25 -0
  62. data/lib/action_web_service/soap/rpc/soaplet.rb +162 -0
  63. data/lib/action_web_service/soap/rpc/standaloneServer.rb +43 -0
  64. data/lib/action_web_service/soap/soap.rb +140 -0
  65. data/lib/action_web_service/soap/streamHandler.rb +229 -0
  66. data/lib/action_web_service/soap/wsdlDriver.rb +575 -0
  67. data/lib/action_web_service/struct.rb +64 -0
  68. data/lib/action_web_service/support/class_inheritable_options.rb +28 -0
  69. data/lib/action_web_service/support/signature_types.rb +227 -0
  70. data/lib/action_web_service/test_invoke.rb +110 -0
  71. data/lib/action_web_service/version.rb +9 -0
  72. data/lib/action_web_service/wsdl/binding.rb +65 -0
  73. data/lib/action_web_service/wsdl/data.rb +64 -0
  74. data/lib/action_web_service/wsdl/definitions.rb +250 -0
  75. data/lib/action_web_service/wsdl/documentation.rb +32 -0
  76. data/lib/action_web_service/wsdl/import.rb +80 -0
  77. data/lib/action_web_service/wsdl/importer.rb +38 -0
  78. data/lib/action_web_service/wsdl/info.rb +39 -0
  79. data/lib/action_web_service/wsdl/message.rb +54 -0
  80. data/lib/action_web_service/wsdl/operation.rb +130 -0
  81. data/lib/action_web_service/wsdl/operationBinding.rb +108 -0
  82. data/lib/action_web_service/wsdl/param.rb +85 -0
  83. data/lib/action_web_service/wsdl/parser.rb +163 -0
  84. data/lib/action_web_service/wsdl/part.rb +52 -0
  85. data/lib/action_web_service/wsdl/port.rb +84 -0
  86. data/lib/action_web_service/wsdl/portType.rb +73 -0
  87. data/lib/action_web_service/wsdl/service.rb +61 -0
  88. data/lib/action_web_service/wsdl/soap/address.rb +40 -0
  89. data/lib/action_web_service/wsdl/soap/binding.rb +49 -0
  90. data/lib/action_web_service/wsdl/soap/body.rb +56 -0
  91. data/lib/action_web_service/wsdl/soap/cgiStubCreator.rb +76 -0
  92. data/lib/action_web_service/wsdl/soap/classDefCreator.rb +314 -0
  93. data/lib/action_web_service/wsdl/soap/classDefCreatorSupport.rb +126 -0
  94. data/lib/action_web_service/wsdl/soap/clientSkeltonCreator.rb +78 -0
  95. data/lib/action_web_service/wsdl/soap/complexType.rb +161 -0
  96. data/lib/action_web_service/wsdl/soap/data.rb +42 -0
  97. data/lib/action_web_service/wsdl/soap/definitions.rb +149 -0
  98. data/lib/action_web_service/wsdl/soap/driverCreator.rb +95 -0
  99. data/lib/action_web_service/wsdl/soap/element.rb +28 -0
  100. data/lib/action_web_service/wsdl/soap/fault.rb +56 -0
  101. data/lib/action_web_service/wsdl/soap/header.rb +86 -0
  102. data/lib/action_web_service/wsdl/soap/headerfault.rb +56 -0
  103. data/lib/action_web_service/wsdl/soap/mappingRegistryCreator.rb +92 -0
  104. data/lib/action_web_service/wsdl/soap/methodDefCreator.rb +228 -0
  105. data/lib/action_web_service/wsdl/soap/operation.rb +122 -0
  106. data/lib/action_web_service/wsdl/soap/servantSkeltonCreator.rb +67 -0
  107. data/lib/action_web_service/wsdl/soap/standaloneServerStubCreator.rb +85 -0
  108. data/lib/action_web_service/wsdl/soap/wsdl2ruby.rb +176 -0
  109. data/lib/action_web_service/wsdl/types.rb +43 -0
  110. data/lib/action_web_service/wsdl/wsdl.rb +23 -0
  111. data/lib/action_web_service/wsdl/xmlSchema/all.rb +69 -0
  112. data/lib/action_web_service/wsdl/xmlSchema/annotation.rb +34 -0
  113. data/lib/action_web_service/wsdl/xmlSchema/any.rb +56 -0
  114. data/lib/action_web_service/wsdl/xmlSchema/attribute.rb +127 -0
  115. data/lib/action_web_service/wsdl/xmlSchema/choice.rb +69 -0
  116. data/lib/action_web_service/wsdl/xmlSchema/complexContent.rb +92 -0
  117. data/lib/action_web_service/wsdl/xmlSchema/complexType.rb +139 -0
  118. data/lib/action_web_service/wsdl/xmlSchema/content.rb +96 -0
  119. data/lib/action_web_service/wsdl/xmlSchema/data.rb +80 -0
  120. data/lib/action_web_service/wsdl/xmlSchema/element.rb +154 -0
  121. data/lib/action_web_service/wsdl/xmlSchema/enumeration.rb +36 -0
  122. data/lib/action_web_service/wsdl/xmlSchema/import.rb +65 -0
  123. data/lib/action_web_service/wsdl/xmlSchema/importer.rb +87 -0
  124. data/lib/action_web_service/wsdl/xmlSchema/include.rb +54 -0
  125. data/lib/action_web_service/wsdl/xmlSchema/length.rb +35 -0
  126. data/lib/action_web_service/wsdl/xmlSchema/parser.rb +166 -0
  127. data/lib/action_web_service/wsdl/xmlSchema/pattern.rb +36 -0
  128. data/lib/action_web_service/wsdl/xmlSchema/schema.rb +143 -0
  129. data/lib/action_web_service/wsdl/xmlSchema/sequence.rb +69 -0
  130. data/lib/action_web_service/wsdl/xmlSchema/simpleContent.rb +65 -0
  131. data/lib/action_web_service/wsdl/xmlSchema/simpleExtension.rb +54 -0
  132. data/lib/action_web_service/wsdl/xmlSchema/simpleRestriction.rb +73 -0
  133. data/lib/action_web_service/wsdl/xmlSchema/simpleType.rb +73 -0
  134. data/lib/action_web_service/wsdl/xmlSchema/unique.rb +34 -0
  135. data/lib/action_web_service/wsdl/xmlSchema/xsd2ruby.rb +107 -0
  136. data/lib/action_web_service/xsd/charset.rb +187 -0
  137. data/lib/action_web_service/xsd/codegen.rb +12 -0
  138. data/lib/action_web_service/xsd/codegen/classdef.rb +203 -0
  139. data/lib/action_web_service/xsd/codegen/commentdef.rb +34 -0
  140. data/lib/action_web_service/xsd/codegen/gensupport.rb +166 -0
  141. data/lib/action_web_service/xsd/codegen/methoddef.rb +63 -0
  142. data/lib/action_web_service/xsd/codegen/moduledef.rb +191 -0
  143. data/lib/action_web_service/xsd/datatypes.rb +1269 -0
  144. data/lib/action_web_service/xsd/datatypes1999.rb +20 -0
  145. data/lib/action_web_service/xsd/iconvcharset.rb +33 -0
  146. data/lib/action_web_service/xsd/mapping.rb +42 -0
  147. data/lib/action_web_service/xsd/namedelements.rb +95 -0
  148. data/lib/action_web_service/xsd/ns.rb +140 -0
  149. data/lib/action_web_service/xsd/qname.rb +78 -0
  150. data/lib/action_web_service/xsd/xmlparser.rb +61 -0
  151. data/lib/action_web_service/xsd/xmlparser/parser.rb +96 -0
  152. data/lib/action_web_service/xsd/xmlparser/rexmlparser.rb +54 -0
  153. data/lib/action_web_service/xsd/xmlparser/xmlparser.rb +50 -0
  154. data/lib/action_web_service/xsd/xmlparser/xmlscanner.rb +147 -0
  155. data/lib/actionwebservice.rb +1 -0
  156. data/setup.rb +1379 -0
  157. data/test/abstract_client.rb +183 -0
  158. data/test/abstract_dispatcher.rb +548 -0
  159. data/test/abstract_unit.rb +45 -0
  160. data/test/api_test.rb +103 -0
  161. data/test/apis/auto_load_api.rb +3 -0
  162. data/test/apis/broken_auto_load_api.rb +2 -0
  163. data/test/base_test.rb +42 -0
  164. data/test/casting_test.rb +95 -0
  165. data/test/client_soap_test.rb +156 -0
  166. data/test/client_xmlrpc_test.rb +153 -0
  167. data/test/container_test.rb +73 -0
  168. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  169. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  170. data/test/fixtures/db_definitions/mysql.sql +8 -0
  171. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  172. data/test/fixtures/users.yml +12 -0
  173. data/test/gencov +3 -0
  174. data/test/invocation_test.rb +185 -0
  175. data/test/run +6 -0
  176. data/test/scaffolded_controller_test.rb +146 -0
  177. data/test/struct_test.rb +52 -0
  178. data/test/test_invoke_test.rb +112 -0
  179. metadata +265 -0
@@ -0,0 +1,475 @@
1
+ # SOAP4R - Ruby type mapping factory.
2
+ # Copyright (C) 2000-2003, 2005 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
+ module SOAP
10
+ module Mapping
11
+
12
+
13
+ class RubytypeFactory < Factory
14
+ TYPE_STRING = XSD::QName.new(RubyTypeNamespace, 'String')
15
+ TYPE_TIME = XSD::QName.new(RubyTypeNamespace, 'Time')
16
+ TYPE_ARRAY = XSD::QName.new(RubyTypeNamespace, 'Array')
17
+ TYPE_REGEXP = XSD::QName.new(RubyTypeNamespace, 'Regexp')
18
+ TYPE_RANGE = XSD::QName.new(RubyTypeNamespace, 'Range')
19
+ TYPE_CLASS = XSD::QName.new(RubyTypeNamespace, 'Class')
20
+ TYPE_MODULE = XSD::QName.new(RubyTypeNamespace, 'Module')
21
+ TYPE_SYMBOL = XSD::QName.new(RubyTypeNamespace, 'Symbol')
22
+ TYPE_STRUCT = XSD::QName.new(RubyTypeNamespace, 'Struct')
23
+ TYPE_HASH = XSD::QName.new(RubyTypeNamespace, 'Map')
24
+
25
+ def initialize(config = {})
26
+ @config = config
27
+ @allow_untyped_struct = @config.key?(:allow_untyped_struct) ?
28
+ @config[:allow_untyped_struct] : true
29
+ @allow_original_mapping = @config.key?(:allow_original_mapping) ?
30
+ @config[:allow_original_mapping] : false
31
+ @string_factory = StringFactory_.new(true)
32
+ @basetype_factory = BasetypeFactory_.new(true)
33
+ @datetime_factory = DateTimeFactory_.new(true)
34
+ @array_factory = ArrayFactory_.new(true)
35
+ @hash_factory = HashFactory_.new(true)
36
+ end
37
+
38
+ def obj2soap(soap_class, obj, info, map)
39
+ param = nil
40
+ case obj
41
+ when ::String
42
+ unless @allow_original_mapping
43
+ return nil
44
+ end
45
+ param = @string_factory.obj2soap(SOAPString, obj, info, map)
46
+ if obj.class != String
47
+ param.extraattr[RubyTypeName] = obj.class.name
48
+ end
49
+ addiv2soapattr(param, obj, map)
50
+ when ::Time
51
+ unless @allow_original_mapping
52
+ return nil
53
+ end
54
+ param = @datetime_factory.obj2soap(SOAPDateTime, obj, info, map)
55
+ if obj.class != Time
56
+ param.extraattr[RubyTypeName] = obj.class.name
57
+ end
58
+ addiv2soapattr(param, obj, map)
59
+ when ::Array
60
+ unless @allow_original_mapping
61
+ return nil
62
+ end
63
+ param = @array_factory.obj2soap(nil, obj, info, map)
64
+ if obj.class != Array
65
+ param.extraattr[RubyTypeName] = obj.class.name
66
+ end
67
+ addiv2soapattr(param, obj, map)
68
+ when ::NilClass
69
+ unless @allow_original_mapping
70
+ return nil
71
+ end
72
+ param = @basetype_factory.obj2soap(SOAPNil, obj, info, map)
73
+ addiv2soapattr(param, obj, map)
74
+ when ::FalseClass, ::TrueClass
75
+ unless @allow_original_mapping
76
+ return nil
77
+ end
78
+ param = @basetype_factory.obj2soap(SOAPBoolean, obj, info, map)
79
+ addiv2soapattr(param, obj, map)
80
+ when ::Integer
81
+ unless @allow_original_mapping
82
+ return nil
83
+ end
84
+ param = @basetype_factory.obj2soap(SOAPInt, obj, info, map)
85
+ param ||= @basetype_factory.obj2soap(SOAPInteger, obj, info, map)
86
+ param ||= @basetype_factory.obj2soap(SOAPDecimal, obj, info, map)
87
+ addiv2soapattr(param, obj, map)
88
+ when ::Float
89
+ unless @allow_original_mapping
90
+ return nil
91
+ end
92
+ param = @basetype_factory.obj2soap(SOAPDouble, obj, info, map)
93
+ if obj.class != Float
94
+ param.extraattr[RubyTypeName] = obj.class.name
95
+ end
96
+ addiv2soapattr(param, obj, map)
97
+ when ::Hash
98
+ unless @allow_original_mapping
99
+ return nil
100
+ end
101
+ if obj.respond_to?(:default_proc) && obj.default_proc
102
+ raise TypeError.new("cannot dump hash with default proc")
103
+ end
104
+ param = SOAPStruct.new(TYPE_HASH)
105
+ mark_marshalled_obj(obj, param)
106
+ if obj.class != Hash
107
+ param.extraattr[RubyTypeName] = obj.class.name
108
+ end
109
+ obj.each do |key, value|
110
+ elem = SOAPStruct.new # Undefined type.
111
+ elem.add("key", Mapping._obj2soap(key, map))
112
+ elem.add("value", Mapping._obj2soap(value, map))
113
+ param.add("item", elem)
114
+ end
115
+ param.add('default', Mapping._obj2soap(obj.default, map))
116
+ addiv2soapattr(param, obj, map)
117
+ when ::Regexp
118
+ unless @allow_original_mapping
119
+ return nil
120
+ end
121
+ param = SOAPStruct.new(TYPE_REGEXP)
122
+ mark_marshalled_obj(obj, param)
123
+ if obj.class != Regexp
124
+ param.extraattr[RubyTypeName] = obj.class.name
125
+ end
126
+ param.add('source', SOAPBase64.new(obj.source))
127
+ if obj.respond_to?('options')
128
+ # Regexp#options is from Ruby/1.7
129
+ options = obj.options
130
+ else
131
+ options = 0
132
+ obj.inspect.sub(/^.*\//, '').each_byte do |c|
133
+ options += case c
134
+ when ?i
135
+ 1
136
+ when ?x
137
+ 2
138
+ when ?m
139
+ 4
140
+ when ?n
141
+ 16
142
+ when ?e
143
+ 32
144
+ when ?s
145
+ 48
146
+ when ?u
147
+ 64
148
+ end
149
+ end
150
+ end
151
+ param.add('options', SOAPInt.new(options))
152
+ addiv2soapattr(param, obj, map)
153
+ when ::Range
154
+ unless @allow_original_mapping
155
+ return nil
156
+ end
157
+ param = SOAPStruct.new(TYPE_RANGE)
158
+ mark_marshalled_obj(obj, param)
159
+ if obj.class != Range
160
+ param.extraattr[RubyTypeName] = obj.class.name
161
+ end
162
+ param.add('begin', Mapping._obj2soap(obj.begin, map))
163
+ param.add('end', Mapping._obj2soap(obj.end, map))
164
+ param.add('exclude_end', SOAP::SOAPBoolean.new(obj.exclude_end?))
165
+ addiv2soapattr(param, obj, map)
166
+ when ::Class
167
+ unless @allow_original_mapping
168
+ return nil
169
+ end
170
+ if obj.to_s[0] == ?#
171
+ raise TypeError.new("can't dump anonymous class #{obj}")
172
+ end
173
+ param = SOAPStruct.new(TYPE_CLASS)
174
+ mark_marshalled_obj(obj, param)
175
+ param.add('name', SOAPString.new(obj.name))
176
+ addiv2soapattr(param, obj, map)
177
+ when ::Module
178
+ unless @allow_original_mapping
179
+ return nil
180
+ end
181
+ if obj.to_s[0] == ?#
182
+ raise TypeError.new("can't dump anonymous module #{obj}")
183
+ end
184
+ param = SOAPStruct.new(TYPE_MODULE)
185
+ mark_marshalled_obj(obj, param)
186
+ param.add('name', SOAPString.new(obj.name))
187
+ addiv2soapattr(param, obj, map)
188
+ when ::Symbol
189
+ unless @allow_original_mapping
190
+ return nil
191
+ end
192
+ param = SOAPStruct.new(TYPE_SYMBOL)
193
+ mark_marshalled_obj(obj, param)
194
+ param.add('id', SOAPString.new(obj.id2name))
195
+ addiv2soapattr(param, obj, map)
196
+ when ::Struct
197
+ unless @allow_original_mapping
198
+ # treat it as an user defined class. [ruby-talk:104980]
199
+ #param = unknownobj2soap(soap_class, obj, info, map)
200
+ param = SOAPStruct.new(XSD::AnyTypeName)
201
+ mark_marshalled_obj(obj, param)
202
+ obj.members.each do |member|
203
+ param.add(Mapping.name2elename(member),
204
+ Mapping._obj2soap(obj[member], map))
205
+ end
206
+ else
207
+ param = SOAPStruct.new(TYPE_STRUCT)
208
+ mark_marshalled_obj(obj, param)
209
+ param.add('type', ele_type = SOAPString.new(obj.class.to_s))
210
+ ele_member = SOAPStruct.new
211
+ obj.members.each do |member|
212
+ ele_member.add(Mapping.name2elename(member),
213
+ Mapping._obj2soap(obj[member], map))
214
+ end
215
+ param.add('member', ele_member)
216
+ addiv2soapattr(param, obj, map)
217
+ end
218
+ when ::IO, ::Binding, ::Continuation, ::Data, ::Dir, ::File::Stat,
219
+ ::MatchData, Method, ::Proc, ::Thread, ::ThreadGroup
220
+ # from 1.8: Process::Status, UnboundMethod
221
+ return nil
222
+ when ::SOAP::Mapping::Object
223
+ param = SOAPStruct.new(XSD::AnyTypeName)
224
+ mark_marshalled_obj(obj, param)
225
+ obj.__xmlele.each do |key, value|
226
+ param.add(key.name, Mapping._obj2soap(value, map))
227
+ end
228
+ obj.__xmlattr.each do |key, value|
229
+ param.extraattr[key] = value
230
+ end
231
+ when ::Exception
232
+ typestr = Mapping.name2elename(obj.class.to_s)
233
+ param = SOAPStruct.new(XSD::QName.new(RubyTypeNamespace, typestr))
234
+ mark_marshalled_obj(obj, param)
235
+ param.add('message', Mapping._obj2soap(obj.message, map))
236
+ param.add('backtrace', Mapping._obj2soap(obj.backtrace, map))
237
+ addiv2soapattr(param, obj, map)
238
+ else
239
+ param = unknownobj2soap(soap_class, obj, info, map)
240
+ end
241
+ param
242
+ end
243
+
244
+ def soap2obj(obj_class, node, info, map)
245
+ rubytype = node.extraattr[RubyTypeName]
246
+ if rubytype or node.type.namespace == RubyTypeNamespace
247
+ rubytype2obj(node, info, map, rubytype)
248
+ elsif node.type == XSD::AnyTypeName or node.type == XSD::AnySimpleTypeName
249
+ anytype2obj(node, info, map)
250
+ else
251
+ unknowntype2obj(node, info, map)
252
+ end
253
+ end
254
+
255
+ private
256
+
257
+ def addiv2soapattr(node, obj, map)
258
+ return if obj.instance_variables.empty?
259
+ ivars = SOAPStruct.new # Undefined type.
260
+ setiv2soap(ivars, obj, map)
261
+ node.extraattr[RubyIVarName] = ivars
262
+ end
263
+
264
+ def unknownobj2soap(soap_class, obj, info, map)
265
+ if obj.class.name.empty?
266
+ raise TypeError.new("can't dump anonymous class #{obj}")
267
+ end
268
+ singleton_class = class << obj; self; end
269
+ if !singleton_methods_true(obj).empty? or
270
+ !singleton_class.instance_variables.empty?
271
+ raise TypeError.new("singleton can't be dumped #{obj}")
272
+ end
273
+ if !(singleton_class.ancestors - obj.class.ancestors).empty?
274
+ typestr = Mapping.name2elename(obj.class.to_s)
275
+ type = XSD::QName.new(RubyTypeNamespace, typestr)
276
+ else
277
+ type = Mapping.class2element(obj.class)
278
+ end
279
+ param = SOAPStruct.new(type)
280
+ mark_marshalled_obj(obj, param)
281
+ setiv2soap(param, obj, map)
282
+ param
283
+ end
284
+
285
+ if RUBY_VERSION >= '1.8.0'
286
+ def singleton_methods_true(obj)
287
+ obj.singleton_methods(true)
288
+ end
289
+ else
290
+ def singleton_methods_true(obj)
291
+ obj.singleton_methods
292
+ end
293
+ end
294
+
295
+ def rubytype2obj(node, info, map, rubytype)
296
+ klass = rubytype ? Mapping.class_from_name(rubytype) : nil
297
+ obj = nil
298
+ case node
299
+ when SOAPString
300
+ return @string_factory.soap2obj(klass || String, node, info, map)
301
+ when SOAPDateTime
302
+ #return @datetime_factory.soap2obj(klass || Time, node, info, map)
303
+ klass ||= Time
304
+ t = node.to_time
305
+ arg = [t.year, t.month, t.mday, t.hour, t.min, t.sec, t.usec]
306
+ obj = t.gmt? ? klass.gm(*arg) : klass.local(*arg)
307
+ mark_unmarshalled_obj(node, obj)
308
+ return true, obj
309
+ when SOAPArray
310
+ return @array_factory.soap2obj(klass || Array, node, info, map)
311
+ when SOAPNil, SOAPBoolean, SOAPInt, SOAPInteger, SOAPDecimal, SOAPDouble
312
+ return @basetype_factory.soap2obj(nil, node, info, map)
313
+ when SOAPStruct
314
+ return rubytypestruct2obj(node, info, map, rubytype)
315
+ else
316
+ raise
317
+ end
318
+ end
319
+
320
+ def rubytypestruct2obj(node, info, map, rubytype)
321
+ klass = rubytype ? Mapping.class_from_name(rubytype) : nil
322
+ obj = nil
323
+ case node.type
324
+ when TYPE_HASH
325
+ klass = rubytype ? Mapping.class_from_name(rubytype) : Hash
326
+ obj = Mapping.create_empty_object(klass)
327
+ mark_unmarshalled_obj(node, obj)
328
+ node.each do |key, value|
329
+ next unless key == 'item'
330
+ obj[Mapping._soap2obj(value['key'], map)] =
331
+ Mapping._soap2obj(value['value'], map)
332
+ end
333
+ if node.key?('default')
334
+ obj.default = Mapping._soap2obj(node['default'], map)
335
+ end
336
+ when TYPE_REGEXP
337
+ klass = rubytype ? Mapping.class_from_name(rubytype) : Regexp
338
+ obj = Mapping.create_empty_object(klass)
339
+ mark_unmarshalled_obj(node, obj)
340
+ source = node['source'].string
341
+ options = node['options'].data || 0
342
+ Regexp.instance_method(:initialize).bind(obj).call(source, options)
343
+ when TYPE_RANGE
344
+ klass = rubytype ? Mapping.class_from_name(rubytype) : Range
345
+ obj = Mapping.create_empty_object(klass)
346
+ mark_unmarshalled_obj(node, obj)
347
+ first = Mapping._soap2obj(node['begin'], map)
348
+ last = Mapping._soap2obj(node['end'], map)
349
+ exclude_end = node['exclude_end'].data
350
+ Range.instance_method(:initialize).bind(obj).call(first, last, exclude_end)
351
+ when TYPE_CLASS
352
+ obj = Mapping.class_from_name(node['name'].data)
353
+ when TYPE_MODULE
354
+ obj = Mapping.class_from_name(node['name'].data)
355
+ when TYPE_SYMBOL
356
+ obj = node['id'].data.intern
357
+ when TYPE_STRUCT
358
+ typestr = Mapping.elename2name(node['type'].data)
359
+ klass = Mapping.class_from_name(typestr)
360
+ if klass.nil?
361
+ return false
362
+ end
363
+ unless klass <= ::Struct
364
+ return false
365
+ end
366
+ obj = Mapping.create_empty_object(klass)
367
+ mark_unmarshalled_obj(node, obj)
368
+ node['member'].each do |name, value|
369
+ obj[Mapping.elename2name(name)] = Mapping._soap2obj(value, map)
370
+ end
371
+ else
372
+ return unknowntype2obj(node, info, map)
373
+ end
374
+ return true, obj
375
+ end
376
+
377
+ def anytype2obj(node, info, map)
378
+ case node
379
+ when SOAPBasetype
380
+ return true, node.data
381
+ when SOAPStruct
382
+ klass = ::SOAP::Mapping::Object
383
+ obj = klass.new
384
+ mark_unmarshalled_obj(node, obj)
385
+ node.each do |name, value|
386
+ obj.__add_xmlele_value(XSD::QName.new(nil, name),
387
+ Mapping._soap2obj(value, map))
388
+ end
389
+ unless node.extraattr.empty?
390
+ obj.instance_variable_set('@__xmlattr', node.extraattr)
391
+ end
392
+ return true, obj
393
+ else
394
+ return false
395
+ end
396
+ end
397
+
398
+ def unknowntype2obj(node, info, map)
399
+ case node
400
+ when SOAPBasetype
401
+ return true, node.data
402
+ when SOAPArray
403
+ return @array_factory.soap2obj(Array, node, info, map)
404
+ when SOAPStruct
405
+ obj = unknownstruct2obj(node, info, map)
406
+ return true, obj if obj
407
+ if !@allow_untyped_struct
408
+ return false
409
+ end
410
+ return anytype2obj(node, info, map)
411
+ else
412
+ # Basetype which is not defined...
413
+ return false
414
+ end
415
+ end
416
+
417
+ def unknownstruct2obj(node, info, map)
418
+ unless node.type.name
419
+ return nil
420
+ end
421
+ typestr = Mapping.elename2name(node.type.name)
422
+ klass = Mapping.class_from_name(typestr)
423
+ if klass.nil? and @allow_untyped_struct
424
+ klass = Mapping.class_from_name(typestr, true) # lenient
425
+ end
426
+ if klass.nil?
427
+ return nil
428
+ end
429
+ if klass <= ::Exception
430
+ return exception2obj(klass, node, map)
431
+ end
432
+ klass_type = Mapping.class2qname(klass)
433
+ return nil unless node.type.match(klass_type)
434
+ obj = nil
435
+ begin
436
+ obj = Mapping.create_empty_object(klass)
437
+ rescue
438
+ # type name "data" tries Data.new which raises TypeError
439
+ nil
440
+ end
441
+ mark_unmarshalled_obj(node, obj)
442
+ setiv2obj(obj, node, map)
443
+ obj
444
+ end
445
+
446
+ def exception2obj(klass, node, map)
447
+ message = Mapping._soap2obj(node['message'], map)
448
+ backtrace = Mapping._soap2obj(node['backtrace'], map)
449
+ obj = Mapping.create_empty_object(klass)
450
+ obj = obj.exception(message)
451
+ mark_unmarshalled_obj(node, obj)
452
+ obj.set_backtrace(backtrace)
453
+ obj
454
+ end
455
+
456
+ # Only creates empty array. Do String#replace it with real string.
457
+ def array2obj(node, map, rubytype)
458
+ klass = rubytype ? Mapping.class_from_name(rubytype) : Array
459
+ obj = Mapping.create_empty_object(klass)
460
+ mark_unmarshalled_obj(node, obj)
461
+ obj
462
+ end
463
+
464
+ # Only creates empty string. Do String#replace it with real string.
465
+ def string2obj(node, map, rubytype)
466
+ klass = rubytype ? Mapping.class_from_name(rubytype) : String
467
+ obj = Mapping.create_empty_object(klass)
468
+ mark_unmarshalled_obj(node, obj)
469
+ obj
470
+ end
471
+ end
472
+
473
+
474
+ end
475
+ end