soap4r 1.5.5.20061022 → 1.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. data/bin/wsdl2ruby.rb +8 -8
  2. data/lib/soap/XMLSchemaDatatypes.rb +1 -1
  3. data/lib/soap/XMLSchemaDatatypes1999.rb +1 -1
  4. data/lib/soap/attachment.rb +1 -1
  5. data/lib/soap/baseData.rb +102 -54
  6. data/lib/soap/cgistub.rb +1 -1
  7. data/lib/soap/charset.rb +1 -1
  8. data/lib/soap/driver.rb +1 -1
  9. data/lib/soap/element.rb +20 -12
  10. data/lib/soap/encodingstyle/aspDotNetHandler.rb +2 -2
  11. data/lib/soap/encodingstyle/handler.rb +1 -1
  12. data/lib/soap/encodingstyle/literalHandler.rb +29 -73
  13. data/lib/soap/encodingstyle/soapHandler.rb +8 -7
  14. data/lib/soap/filter.rb +10 -0
  15. data/lib/soap/filter/filterchain.rb +51 -0
  16. data/lib/soap/filter/handler.rb +31 -0
  17. data/lib/soap/generator.rb +11 -3
  18. data/lib/soap/header/handler.rb +6 -5
  19. data/lib/soap/header/handlerset.rb +7 -7
  20. data/lib/soap/header/simplehandler.rb +1 -1
  21. data/lib/soap/httpconfigloader.rb +7 -2
  22. data/lib/soap/mapping.rb +1 -1
  23. data/lib/soap/mapping/encodedregistry.rb +36 -26
  24. data/lib/soap/mapping/encodedregistry.rb~ +531 -0
  25. data/lib/soap/mapping/factory.rb +2 -2
  26. data/lib/soap/mapping/literalregistry.rb +107 -67
  27. data/lib/soap/mapping/mapping.rb +92 -112
  28. data/lib/soap/mapping/registry.rb +25 -8
  29. data/lib/soap/mapping/rubytypeFactory.rb +1 -1
  30. data/lib/soap/mapping/schemadefinition.rb +163 -0
  31. data/lib/soap/mapping/typeMap.rb +7 -1
  32. data/lib/soap/mapping/wsdlencodedregistry.rb +2 -2
  33. data/lib/soap/mapping/wsdlliteralregistry.rb +14 -23
  34. data/lib/soap/mappingRegistry.rb +1 -1
  35. data/lib/soap/marshal.rb +1 -1
  36. data/lib/soap/namespace.rb +1 -1
  37. data/lib/soap/netHttpClient.rb +43 -13
  38. data/lib/soap/parser.rb +40 -42
  39. data/lib/soap/processor.rb +1 -1
  40. data/lib/soap/property.rb +7 -7
  41. data/lib/soap/proxy.rb +1 -1
  42. data/lib/soap/qname.rb +1 -1
  43. data/lib/soap/rpc/cgistub.rb +34 -1
  44. data/lib/soap/rpc/driver.rb +2 -1
  45. data/lib/soap/rpc/element.rb +42 -15
  46. data/lib/soap/rpc/httpserver.rb +13 -1
  47. data/lib/soap/rpc/proxy.rb +51 -41
  48. data/lib/soap/rpc/router.rb +88 -33
  49. data/lib/soap/rpc/rpc.rb +1 -1
  50. data/lib/soap/rpc/soaplet.rb +51 -3
  51. data/lib/soap/rpc/standaloneServer.rb +1 -1
  52. data/lib/soap/rpcRouter.rb +1 -1
  53. data/lib/soap/rpcUtils.rb +1 -1
  54. data/lib/soap/server.rb +1 -1
  55. data/lib/soap/soap.rb +2 -2
  56. data/lib/soap/standaloneServer.rb +1 -1
  57. data/lib/soap/streamHandler.rb +13 -4
  58. data/lib/soap/wsdlDriver.rb +11 -15
  59. data/lib/tags +5144 -0
  60. data/lib/wsdl/binding.rb +1 -1
  61. data/lib/wsdl/data.rb +1 -1
  62. data/lib/wsdl/definitions.rb +1 -1
  63. data/lib/wsdl/documentation.rb +1 -1
  64. data/lib/wsdl/import.rb +1 -1
  65. data/lib/wsdl/importer.rb +1 -1
  66. data/lib/wsdl/info.rb +1 -1
  67. data/lib/wsdl/message.rb +1 -1
  68. data/lib/wsdl/operation.rb +10 -7
  69. data/lib/wsdl/operationBinding.rb +19 -5
  70. data/lib/wsdl/param.rb +11 -3
  71. data/lib/wsdl/parser.rb +4 -3
  72. data/lib/wsdl/part.rb +1 -1
  73. data/lib/wsdl/port.rb +1 -1
  74. data/lib/wsdl/portType.rb +1 -1
  75. data/lib/wsdl/service.rb +1 -1
  76. data/lib/wsdl/soap/address.rb +1 -1
  77. data/lib/wsdl/soap/binding.rb +1 -1
  78. data/lib/wsdl/soap/body.rb +3 -1
  79. data/lib/wsdl/soap/cgiStubCreator.rb +1 -1
  80. data/lib/wsdl/soap/classDefCreator.rb +78 -14
  81. data/lib/wsdl/soap/classDefCreatorSupport.rb +28 -11
  82. data/lib/wsdl/soap/clientSkeltonCreator.rb +3 -2
  83. data/lib/wsdl/soap/complexType.rb +8 -11
  84. data/lib/wsdl/soap/data.rb +1 -1
  85. data/lib/wsdl/soap/definitions.rb +49 -4
  86. data/lib/wsdl/soap/driverCreator.rb +1 -1
  87. data/lib/wsdl/soap/element.rb +3 -2
  88. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +1 -1
  89. data/lib/wsdl/soap/fault.rb +1 -1
  90. data/lib/wsdl/soap/header.rb +1 -1
  91. data/lib/wsdl/soap/headerfault.rb +1 -1
  92. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +41 -21
  93. data/lib/wsdl/soap/mappingRegistryCreator.rb +2 -1
  94. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +45 -19
  95. data/lib/wsdl/soap/methodDefCreator.rb +28 -17
  96. data/lib/wsdl/soap/operation.rb +11 -11
  97. data/lib/wsdl/soap/servantSkeltonCreator.rb +3 -2
  98. data/lib/wsdl/soap/standaloneServerStubCreator.rb +1 -1
  99. data/lib/wsdl/soap/wsdl2ruby.rb +8 -2
  100. data/lib/wsdl/types.rb +1 -1
  101. data/lib/wsdl/wsdl.rb +1 -1
  102. data/lib/wsdl/xmlSchema/all.rb +1 -1
  103. data/lib/wsdl/xmlSchema/annotation.rb +1 -1
  104. data/lib/wsdl/xmlSchema/any.rb +10 -5
  105. data/lib/wsdl/xmlSchema/attribute.rb +1 -1
  106. data/lib/wsdl/xmlSchema/choice.rb +1 -1
  107. data/lib/wsdl/xmlSchema/complexContent.rb +11 -2
  108. data/lib/wsdl/xmlSchema/complexExtension.rb +8 -1
  109. data/lib/wsdl/xmlSchema/complexRestriction.rb +6 -2
  110. data/lib/wsdl/xmlSchema/complexType.rb +9 -1
  111. data/lib/wsdl/xmlSchema/content.rb +26 -5
  112. data/lib/wsdl/xmlSchema/data.rb +4 -1
  113. data/lib/wsdl/xmlSchema/element.rb +12 -9
  114. data/lib/wsdl/xmlSchema/enumeration.rb +1 -1
  115. data/lib/wsdl/xmlSchema/import.rb +1 -1
  116. data/lib/wsdl/xmlSchema/importer.rb +9 -6
  117. data/lib/wsdl/xmlSchema/include.rb +1 -1
  118. data/lib/wsdl/xmlSchema/length.rb +1 -1
  119. data/lib/wsdl/xmlSchema/list.rb +1 -1
  120. data/lib/wsdl/xmlSchema/maxlength.rb +1 -1
  121. data/lib/wsdl/xmlSchema/minlength.rb +1 -1
  122. data/lib/wsdl/xmlSchema/parser.rb +4 -3
  123. data/lib/wsdl/xmlSchema/pattern.rb +1 -1
  124. data/lib/wsdl/xmlSchema/schema.rb +1 -1
  125. data/lib/wsdl/xmlSchema/sequence.rb +1 -1
  126. data/lib/wsdl/xmlSchema/simpleContent.rb +1 -1
  127. data/lib/wsdl/xmlSchema/simpleExtension.rb +1 -1
  128. data/lib/wsdl/xmlSchema/simpleRestriction.rb +1 -1
  129. data/lib/wsdl/xmlSchema/simpleType.rb +8 -1
  130. data/lib/wsdl/xmlSchema/union.rb +35 -0
  131. data/lib/wsdl/xmlSchema/unique.rb +1 -1
  132. data/lib/wsdl/xmlSchema/xsd2ruby.rb +6 -1
  133. data/lib/xsd/charset.rb +1 -1
  134. data/lib/xsd/classloader.rb +26 -0
  135. data/lib/xsd/codegen.rb +1 -1
  136. data/lib/xsd/codegen/classdef.rb +1 -1
  137. data/lib/xsd/codegen/commentdef.rb +1 -1
  138. data/lib/xsd/codegen/gensupport.rb +119 -14
  139. data/lib/xsd/codegen/methoddef.rb +1 -1
  140. data/lib/xsd/codegen/moduledef.rb +1 -1
  141. data/lib/xsd/datatypes.rb +52 -13
  142. data/lib/xsd/datatypes1999.rb +1 -1
  143. data/lib/xsd/iconvcharset.rb +1 -1
  144. data/lib/xsd/mapping.rb +1 -1
  145. data/lib/xsd/namedelements.rb +1 -1
  146. data/lib/xsd/ns.rb +2 -2
  147. data/lib/xsd/qname.rb +1 -1
  148. data/lib/xsd/xmlparser.rb +16 -3
  149. data/lib/xsd/xmlparser/parser.rb +6 -2
  150. data/lib/xsd/xmlparser/rexmlparser.rb +5 -1
  151. data/lib/xsd/xmlparser/xmlparser.rb +1 -1
  152. data/lib/xsd/xmlparser/xmlscanner.rb +4 -2
  153. data/test/interopR2/InteropTest.rb +83 -0
  154. data/test/interopR2/InteropTest.wsdl +315 -0
  155. data/test/interopR2/InteropTestC.wsdl +208 -0
  156. data/test/interopR2/InteropTestDriver.rb +328 -0
  157. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2.wsdl +461 -0
  158. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2GroupB.wsdl +20 -0
  159. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2GroupCClient.rb +178 -0
  160. data/test/interopR2/SOAPBuildersInterop_R2GrC.wsdl +17 -0
  161. data/test/interopR2/clientBase.rb +0 -3
  162. data/test/interopR2/groupc.wsdl +17 -0
  163. data/test/interopR2/result_client.NetRemoting.txt +0 -4593
  164. data/test/interopR2/test.sh +9 -9
  165. data/test/runner.rb +1 -3
  166. data/test/soap/asp.net/test_aspdotnet.rb +20 -9
  167. data/test/soap/case/test_mapping.rb +57 -0
  168. data/test/soap/filter/test_filter.rb +146 -0
  169. data/test/soap/literalArrayMapping/test_definedarray.rb +7 -9
  170. data/test/soap/marshal/marshaltestlib.rb +1 -1
  171. data/test/soap/ssl/test_ssl.rb +0 -10
  172. data/test/soap/struct/test_struct.rb +2 -9
  173. data/test/soap/test_basetype.rb +114 -0
  174. data/test/soap/test_empty.rb +26 -2
  175. data/test/soap/test_envelopenamespace.rb +2 -9
  176. data/test/soap/test_extraattr.rb +55 -0
  177. data/test/soap/test_httpconfigloader.rb +17 -0
  178. data/test/soap/test_property.rb +4 -1
  179. data/test/soap/test_response_as_xml.rb +31 -9
  180. data/test/soap/test_soapelement.rb +21 -3
  181. data/test/soap/test_streamhandler.rb +3 -10
  182. data/test/soap/test_styleuse.rb +2 -9
  183. data/test/soap/wsdlDriver/test_calc.rb +3 -20
  184. data/test/soap/wsdlDriver/test_document.rb +2 -9
  185. data/test/soap/wsdlDriver/test_simpletype.rb +2 -9
  186. data/test/testutil.rb +54 -0
  187. data/test/wsdl/abstract/abstract.wsdl +82 -3
  188. data/test/wsdl/abstract/test_abstract.rb +48 -19
  189. data/test/wsdl/any/any.wsdl +63 -0
  190. data/test/wsdl/any/expectedDriver.rb +22 -1
  191. data/test/wsdl/any/expectedEcho.rb +19 -0
  192. data/test/wsdl/any/expectedService.rb +29 -4
  193. data/test/wsdl/any/test_any.rb +36 -31
  194. data/test/wsdl/choice/choice.wsdl +37 -0
  195. data/test/wsdl/choice/test_choice.rb +66 -17
  196. data/test/wsdl/complexcontent/test_echo.rb +7 -18
  197. data/test/wsdl/document/array/test_array.rb +8 -18
  198. data/test/wsdl/document/ping_nosoapaction.wsdl +1 -1
  199. data/test/wsdl/document/test_nosoapaction.rb +2 -9
  200. data/test/wsdl/document/test_number.rb +3 -10
  201. data/test/wsdl/document/test_rpc.rb +96 -21
  202. data/test/wsdl/fault/fault.wsdl +79 -0
  203. data/test/wsdl/fault/multifault.wsdl +96 -0
  204. data/test/wsdl/fault/test_fault.rb +119 -0
  205. data/test/wsdl/fault/test_multifault.rb +134 -0
  206. data/test/wsdl/list/test_list.rb +6 -16
  207. data/test/wsdl/marshal/test_wsdlmarshal.rb +10 -13
  208. data/test/wsdl/oneway/oneway.wsdl +36 -0
  209. data/test/wsdl/oneway/test_oneway.rb +108 -0
  210. data/test/wsdl/overload/test_overload.rb +3 -10
  211. data/test/wsdl/qualified/test_qualified.rb +9 -17
  212. data/test/wsdl/qualified/test_unqualified.rb +14 -21
  213. data/test/wsdl/ref/expectedDriver.rb +51 -0
  214. data/test/wsdl/ref/expectedProduct.rb +71 -71
  215. data/test/wsdl/ref/test_ref.rb +13 -35
  216. data/test/wsdl/rpc/rpc.wsdl +27 -1
  217. data/test/wsdl/rpc/test-rpc-lit-qualified.wsdl +74 -0
  218. data/test/wsdl/rpc/test-rpc-lit.wsdl +11 -4
  219. data/test/wsdl/rpc/test-rpc-lit12.wsdl +455 -0
  220. data/test/wsdl/rpc/test_rpc.rb +20 -19
  221. data/test/wsdl/rpc/test_rpc_lit.rb +82 -29
  222. data/test/wsdl/simplecontent/simplecontent.wsdl +1 -0
  223. data/test/wsdl/simplecontent/test_simplecontent.rb +5 -19
  224. data/test/wsdl/simpletype/rpc/expectedDriver.rb +6 -4
  225. data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +15 -0
  226. data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +64 -0
  227. data/test/wsdl/simpletype/rpc/expectedService.rb +6 -4
  228. data/test/wsdl/simpletype/rpc/rpc.wsdl +18 -0
  229. data/test/wsdl/simpletype/rpc/test_rpc.rb +6 -16
  230. data/test/wsdl/simpletype/simpletype.wsdl +19 -0
  231. data/test/wsdl/simpletype/test_simpletype.rb +2 -9
  232. data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +6 -4
  233. data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +40 -0
  234. data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +6 -4
  235. data/test/wsdl/soap/wsdl2ruby/expectedService.rb +6 -4
  236. data/test/wsdl/soap/wsdl2ruby/section/test_section.rb +5 -6
  237. data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +3 -16
  238. data/test/wsdl/soap/wsdl2ruby/test_wsdl2ruby.rb +9 -17
  239. data/test/wsdl/soaptype/test_soaptype.rb +29 -11
  240. data/test/xsd/test_xsd.rb +115 -1
  241. metadata +421 -454
  242. data/test/interopR2/client.NetRemoting.rb.result +0 -3410
  243. data/test/interopR2/client.NetRemoting_Base.log +0 -6279
  244. data/test/interopR2/client.NetRemoting_GroupB.log +0 -1188
  245. data/test/interopR2/client4S4C2_Base.log +0 -4955
  246. data/test/interopR2/client4S4C2_GroupB.log +0 -1000
  247. data/test/interopR2/client4S4C_Base.log +0 -4635
  248. data/test/interopR2/client4S4C_GroupB.log +0 -900
  249. data/test/interopR2/clientASP.NET_Base.log +0 -5468
  250. data/test/interopR2/clientASP.NET_GroupB.log +0 -977
  251. data/test/interopR2/clientApacheAxis_Base.log +0 -3171
  252. data/test/interopR2/clientApacheAxis_GroupB.log +0 -498
  253. data/test/interopR2/clientApacheSOAP_Base.log +0 -3171
  254. data/test/interopR2/clientBEAWebLogic_Base.log +0 -3171
  255. data/test/interopR2/clientBEAWebLogic_GroupB.log +0 -498
  256. data/test/interopR2/clientCapeConnect_Base.log +0 -2126
  257. data/test/interopR2/clientDelphi_Base.log +0 -0
  258. data/test/interopR2/clientEasySoap_Base.log +0 -6187
  259. data/test/interopR2/clientEasySoap_GroupB.log +0 -1076
  260. data/test/interopR2/clientFrontier_Base.log +0 -5188
  261. data/test/interopR2/clientHP_Base.log +0 -3171
  262. data/test/interopR2/clientHP_GroupB.log +0 -498
  263. data/test/interopR2/clientJSOAP_Base.log +0 -4465
  264. data/test/interopR2/clientJSOAP_GroupB.log +0 -824
  265. data/test/interopR2/clientKafkaXSLT_Base.log +0 -10299
  266. data/test/interopR2/clientKafkaXSLT_GroupB.log +0 -1739
  267. data/test/interopR2/clientMSSOAPToolkit2.0_Base.log +0 -4805
  268. data/test/interopR2/clientMSSOAPToolkit2.0_GroupB.log +0 -871
  269. data/test/interopR2/clientMSSOAPToolkit3.0_Base.log +0 -5076
  270. data/test/interopR2/clientMSSOAPToolkit3.0_GroupB.log +0 -908
  271. data/test/interopR2/clientNuSOAP_Base.log +0 -5076
  272. data/test/interopR2/clientNuSOAP_GroupB.log +0 -958
  273. data/test/interopR2/clientNuWave_Base.log +0 -2019
  274. data/test/interopR2/clientOpenLink_Base.log +0 -6171
  275. data/test/interopR2/clientOpenLink_GroupB.log +0 -1094
  276. data/test/interopR2/clientOracle_Base.log +0 -5594
  277. data/test/interopR2/clientPEAR_Base.log +0 -6261
  278. data/test/interopR2/clientPEAR_GroupB.log +0 -1106
  279. data/test/interopR2/clientPhalanx_Base.log +0 -41036
  280. data/test/interopR2/clientPhalanx_GroupB.log +0 -6519
  281. data/test/interopR2/clientSIMACE_Base.log +0 -6171
  282. data/test/interopR2/clientSIMACE_GroupB.log +0 -1093
  283. data/test/interopR2/clientSOAP4R.rb.result +0 -3409
  284. data/test/interopR2/clientSOAP4R_Base.log +0 -6366
  285. data/test/interopR2/clientSOAP4R_GroupB.log +0 -1112
  286. data/test/interopR2/clientSQLData_Base.log +0 -4857
  287. data/test/interopR2/clientSQLData_GroupB.log +0 -770
  288. data/test/interopR2/clientSilverStream_Base.log +0 -3171
  289. data/test/interopR2/clientSpray2001_Base.log +0 -8187
  290. data/test/interopR2/clientSpray2001_GroupB.log +0 -1408
  291. data/test/interopR2/clientSun_Base.log +0 -4641
  292. data/test/interopR2/clientSun_GroupB.log +0 -856
  293. data/test/interopR2/clientVWOpentalkSoap_Base.log +0 -5402
  294. data/test/interopR2/clientVWOpentalkSoap_GroupB.log +0 -972
  295. data/test/interopR2/clientWASPC_Base.log +0 -4187
  296. data/test/interopR2/clientWASPC_GroupB.log +0 -763
  297. data/test/interopR2/clientWASP_Base.log +0 -5414
  298. data/test/interopR2/clientWASP_GroupB.log +0 -970
  299. data/test/interopR2/clientWebMethods_Base.log +0 -3075
  300. data/test/interopR2/clientWebMethods_GroupB.log +0 -483
  301. data/test/interopR2/clientWhiteMesa_Base.log +0 -4359
  302. data/test/interopR2/clientWhiteMesa_GroupB.log +0 -808
  303. data/test/interopR2/clientWingfoot_Base.log +0 -4445
  304. data/test/interopR2/clientWingfoot_GroupB.log +0 -848
  305. data/test/interopR2/clientXMLBus_Base.log +0 -3075
  306. data/test/interopR2/clientXMLBus_GroupB.log +0 -483
  307. data/test/interopR2/clientXSOAP_Base.log +0 -4445
  308. data/test/interopR2/clienteSOAP_Base.log +0 -8728
  309. data/test/interopR2/clientgSOAP_Base.log +0 -4689
  310. data/test/interopR2/clientgSOAP_GroupB.log +0 -1014
  311. data/test/interopR2/clientkSOAP_Base.log +0 -5625
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - Mapping factory.
2
- # Copyright (C) 2000-2003, 2006 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -63,7 +63,7 @@ private
63
63
  value = child
64
64
  else
65
65
  klass = Mapping.class_from_name(eledef.type)
66
- if klass && klass.ancestors.include?(::SOAP::SOAPBasetype)
66
+ if klass && klass.include?(::SOAP::SOAPBasetype)
67
67
  value = klass.new(child)
68
68
  else
69
69
  # should check klass matches an actual object?
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - literal mapping registry.
2
- # Copyright (C) 2004-2006 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -48,9 +48,8 @@ class LiteralRegistry
48
48
 
49
49
  # node should be a SOAPElement
50
50
  def soap2obj(node, obj_class = nil)
51
- # obj_class is given when rpc/literal service. but ignored for now.
52
51
  begin
53
- return any2obj(node)
52
+ return any2obj(node, obj_class)
54
53
  rescue MappingError
55
54
  end
56
55
  if @excn_handler_soap2obj
@@ -70,17 +69,30 @@ private
70
69
 
71
70
  def any2soap(obj, qname)
72
71
  ele = nil
73
- if definition = schema_definition_from_class(obj.class)
74
- ele = stubobj2soap(obj, qname, definition)
75
- elsif obj.is_a?(SOAP::Mapping::Object)
72
+ if obj.is_a?(SOAP::Mapping::Object)
76
73
  ele = mappingobj2soap(obj, qname)
77
- elsif obj.is_a?(Hash)
78
- ele = SOAPElement.from_obj(obj)
74
+ elsif definition = schema_definition_from_class(obj.class)
75
+ # search with class first. obj can be an instance of a subclass of
76
+ # defined class.
77
+ ele = stubobj2soap(obj, qname, definition)
78
+ elsif definition = schema_definition_from_elename(qname)
79
+ ele = stubobj2soap(obj, qname, definition)
80
+ else
81
+ ele = anyobj2soap(obj, qname)
82
+ end
83
+ ele
84
+ end
85
+
86
+ def anyobj2soap(obj, qname)
87
+ ele = nil
88
+ case obj
89
+ when Hash
90
+ ele = SOAPElement.from_obj(obj, nil)
79
91
  ele.elename = qname
80
- elsif obj.is_a?(Array)
92
+ when Array
81
93
  # treat as a list of simpletype
82
94
  ele = SOAPElement.new(qname, obj.join(" "))
83
- elsif obj.is_a?(XSD::QName)
95
+ when XSD::QName
84
96
  ele = SOAPElement.new(qname)
85
97
  ele.text = obj
86
98
  else
@@ -107,41 +119,58 @@ private
107
119
  if definition.type
108
120
  ele.extraattr[XSD::AttrTypeName] = definition.type
109
121
  end
110
- any = nil
111
- if definition.have_any?
112
- any = Mapping.get_attributes_for_any(obj, definition.elements)
113
- end
114
- definition.elements.each do |eledef|
115
- if eledef.elename == XSD::AnyTypeName
116
- if any
117
- SOAPElement.from_objs(any).each do |child|
118
- ele.add(child)
119
- end
120
- end
121
- elsif child = Mapping.get_attribute(obj, eledef.varname)
122
- if eledef.as_array?
123
- child.each do |item|
124
- ele.add(obj2soap(item, eledef.elename))
125
- end
126
- else
127
- ele.add(obj2soap(child, eledef.elename))
128
- end
129
- elsif obj.respond_to?(:each) and eledef.as_array?
130
- obj.each do |item|
131
- ele.add(obj2soap(item, eledef.elename))
132
- end
133
- end
134
- end
122
+ stubobj2soap_elements(obj, ele, definition.elements)
135
123
  if definition.attributes
136
124
  definition.attributes.each do |qname, param|
137
- at = obj.__send__(
138
- XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name))
125
+ at = Mapping.get_attribute(obj, XSD::CodeGen::GenSupport.safemethodname('xmlattr_' + qname.name))
139
126
  ele.extraattr[qname] = at
140
127
  end
141
128
  end
142
129
  ele
143
130
  end
144
131
 
132
+ def stubobj2soap_elements(obj, ele, definition, is_choice = false)
133
+ added = false
134
+ case definition
135
+ when SchemaSequenceDefinition, SchemaEmptyDefinition
136
+ definition.each do |eledef|
137
+ ele_added = stubobj2soap_elements(obj, ele, eledef, is_choice)
138
+ added = true if ele_added
139
+ end
140
+ when SchemaChoiceDefinition
141
+ definition.each do |eledef|
142
+ added = stubobj2soap_elements(obj, ele, eledef, true)
143
+ break if added
144
+ end
145
+ else
146
+ added = true
147
+ if definition.as_any?
148
+ any = Mapping.get_attributes_for_any(obj)
149
+ SOAPElement.from_objs(any).each do |child|
150
+ ele.add(child)
151
+ end
152
+ elsif obj.respond_to?(:each) and definition.as_array?
153
+ obj.each do |item|
154
+ ele.add(obj2soap(item, definition.elename))
155
+ end
156
+ else
157
+ child = Mapping.get_attribute(obj, definition.varname)
158
+ if child.nil? and (is_choice or definition.minoccurs == 0)
159
+ added = false
160
+ else
161
+ if child.respond_to?(:each) and definition.as_array?
162
+ child.each do |item|
163
+ ele.add(obj2soap(item, definition.elename))
164
+ end
165
+ else
166
+ ele.add(obj2soap(child, definition.elename))
167
+ end
168
+ end
169
+ end
170
+ end
171
+ added
172
+ end
173
+
145
174
  def mappingobj2soap(obj, qname)
146
175
  ele = SOAPElement.new(qname)
147
176
  obj.__xmlele.each do |key, value|
@@ -153,23 +182,29 @@ private
153
182
  ele.add(obj2soap(value, key))
154
183
  end
155
184
  end
185
+ add_attributes2soap(obj, ele)
156
186
  ele
157
187
  end
158
188
 
159
189
  def any2obj(node, obj_class = nil)
190
+ is_compound = node.is_a?(::SOAP::SOAPCompoundtype)
191
+ # trust xsi:type first
192
+ if is_compound and node.type
193
+ definition = schema_definition_from_type(node.type)
194
+ end
195
+ # element name next
196
+ definition ||= schema_definition_from_elename(node.elename)
197
+ # class defined in parent type last
160
198
  if obj_class
161
- definition = schema_definition_from_class(obj_class)
162
- else
163
- definition = schema_definition_from_elename(node.elename)
164
- if definition
165
- obj_class = definition.class_for
166
- end
199
+ definition ||= schema_definition_from_class(obj_class)
167
200
  end
168
- if node.is_a?(::SOAP::SOAPElement) or node.is_a?(::SOAP::SOAPStruct)
201
+ if definition
202
+ obj_class = definition.class_for
203
+ end
204
+ if is_compound
169
205
  if definition
170
206
  return elesoap2stubobj(node, obj_class, definition)
171
207
  else
172
- # SOAPArray for literal?
173
208
  return elesoap2plainobj(node)
174
209
  end
175
210
  end
@@ -179,15 +214,25 @@ private
179
214
  end
180
215
 
181
216
  def elesoap2stubobj(node, obj_class, definition)
182
- obj = Mapping.create_empty_object(obj_class)
183
- add_elesoap2stubobj(node, obj, definition)
217
+ obj = nil
218
+ if obj_class < ::String
219
+ obj = node.text
220
+ else
221
+ obj = Mapping.create_empty_object(obj_class)
222
+ add_elesoap2stubobj(node, obj, definition)
223
+ end
184
224
  add_attributes2stubobj(node, obj, definition)
185
225
  obj
186
226
  end
187
227
 
188
228
  def elesoap2plainobj(node)
189
- obj = anytype2obj(node)
190
- add_elesoap2plainobj(node, obj)
229
+ obj = nil
230
+ if node.members.empty?
231
+ obj = base2obj(node, ::SOAP::SOAPString)
232
+ else
233
+ obj = anytype2obj(node)
234
+ add_elesoap2plainobj(node, obj)
235
+ end
191
236
  add_attributes2obj(node, obj)
192
237
  obj
193
238
  end
@@ -204,9 +249,7 @@ private
204
249
  def add_elesoap2stubobj(node, obj, definition)
205
250
  vars = {}
206
251
  node.each do |name, value|
207
- item = definition.elements.find { |k, v|
208
- k.elename == value.elename
209
- }
252
+ item = definition.elements.find_element(value.elename)
210
253
  if item
211
254
  child = elesoapchild2obj(value, item)
212
255
  else
@@ -221,7 +264,7 @@ private
221
264
  vars[name] = child
222
265
  end
223
266
  end
224
- if obj.is_a?(::Array) and vars.keys.size == 1
267
+ if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
225
268
  obj.replace(vars.values[0])
226
269
  else
227
270
  Mapping.set_attributes(obj, vars)
@@ -229,23 +272,20 @@ private
229
272
  end
230
273
 
231
274
  def elesoapchild2obj(value, eledef)
232
- child_definition = schema_definition_from_elename(eledef.elename)
233
- if child_definition
234
- any2obj(value, child_definition.class_for)
235
- elsif eledef.mapped_class
236
- child_definition = schema_definition_from_class(eledef.mapped_class)
275
+ if eledef.mapped_class
276
+ if eledef.mapped_class.include?(::SOAP::SOAPBasetype)
277
+ base2obj(value, eledef.mapped_class)
278
+ else
279
+ any2obj(value, eledef.mapped_class)
280
+ end
281
+ else
282
+ child_definition = schema_definition_from_elename(eledef.elename)
237
283
  if child_definition
238
284
  any2obj(value, child_definition.class_for)
239
285
  else
240
- if eledef.mapped_class.ancestors.include?(::SOAP::SOAPBasetype)
241
- base2obj(value, eledef.mapped_class)
242
- else
243
- any2obj(value, eledef.mapped_class)
244
- end
286
+ # untyped element is treated as anyType.
287
+ any2obj(value)
245
288
  end
246
- else
247
- # untyped element is treated as anyType.
248
- any2obj(value)
249
289
  end
250
290
  end
251
291
 
@@ -259,7 +299,7 @@ private
259
299
  child = attr
260
300
  if class_name
261
301
  klass = Mapping.class_from_name(class_name)
262
- if klass.ancestors.include?(::SOAP::SOAPBasetype)
302
+ if klass.include?(::SOAP::SOAPBasetype)
263
303
  child = klass.new(attr).data
264
304
  end
265
305
  end
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - Ruby type mapping utility.
2
- # Copyright (C) 2000, 2001, 2003-2006 NAKAMURA Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -7,6 +7,7 @@
7
7
 
8
8
 
9
9
  require 'xsd/codegen/gensupport'
10
+ require 'soap/mapping/schemadefinition'
10
11
 
11
12
 
12
13
  module SOAP
@@ -44,6 +45,19 @@ module Mapping
44
45
  soap_obj
45
46
  end
46
47
 
48
+ def self.objs2soap(objs, registry = nil, types = nil, opt = EMPTY_OPT)
49
+ registry ||= Mapping::DefaultRegistry
50
+ ary = []
51
+ protect_mapping(opt) do
52
+ 0.upto(objs.length - 1) do |idx|
53
+ type = types ? types[idx] : nil
54
+ soap = _obj2soap(objs[idx], registry, type)
55
+ ary << soap
56
+ end
57
+ end
58
+ ary
59
+ end
60
+
47
61
  def self.soap2obj(node, registry = nil, klass = nil, opt = EMPTY_OPT)
48
62
  registry ||= Mapping::DefaultRegistry
49
63
  obj = nil
@@ -106,7 +120,11 @@ module Mapping
106
120
  end
107
121
 
108
122
  def self._obj2soap(obj, registry, type = nil)
109
- if referent = Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] and
123
+ if obj.respond_to?(:to_xmlpart)
124
+ SOAPRawData.new(obj)
125
+ elsif defined?(::REXML) and obj.is_a?(::REXML::Element)
126
+ SOAPRawData.new(SOAPREXMLElementWrap.new(obj))
127
+ elsif referent = Thread.current[:SOAPMapping][:MarshalKey][obj.__id__] and
110
128
  !Thread.current[:SOAPMapping][:NoReference]
111
129
  SOAPReference.new(referent)
112
130
  elsif registry
@@ -186,16 +204,18 @@ module Mapping
186
204
  def self.const_from_name(name, lenient = false)
187
205
  const = ::Object
188
206
  name.sub(/\A::/, '').split('::').each do |const_str|
189
- if XSD::CodeGen::GenSupport.safeconstname?(const_str)
207
+ begin
190
208
  if const.const_defined?(const_str)
191
209
  const = const.const_get(const_str)
192
210
  next
193
211
  end
194
- elsif lenient
195
- const_str = XSD::CodeGen::GenSupport.safeconstname(const_str)
196
- if const.const_defined?(const_str)
197
- const = const.const_get(const_str)
198
- next
212
+ rescue NameError
213
+ if lenient
214
+ const_str = XSD::CodeGen::GenSupport.safeconstname(const_str)
215
+ if const.const_defined?(const_str)
216
+ const = const.const_get(const_str)
217
+ next
218
+ end
199
219
  end
200
220
  end
201
221
  return nil
@@ -269,20 +289,12 @@ module Mapping
269
289
  end
270
290
  end
271
291
 
272
- def self.get_attributes_for_any(obj, elements)
292
+ EMPTY_ATTRIBUTES = {}.freeze
293
+ def self.get_attributes_for_any(obj)
273
294
  if obj.respond_to?(:__xmlele_any)
274
- obj.__xmlele_any
295
+ obj.__xmlele_any || EMPTY_ATTRIBUTES
275
296
  else
276
- any = get_attributes(obj)
277
- if elements
278
- elements.each do |child_ele|
279
- child = get_attribute(obj, child_ele.name.name)
280
- if k = any.key(child)
281
- any.delete(k)
282
- end
283
- end
284
- end
285
- any
297
+ get_attributes(obj)
286
298
  end
287
299
  end
288
300
 
@@ -293,6 +305,9 @@ module Mapping
293
305
  when ::Hash
294
306
  return obj[attr_name] || obj[attr_name.intern]
295
307
  else
308
+ if obj.respond_to?(attr_name)
309
+ return obj.__send__(attr_name)
310
+ end
296
311
  iv = obj.instance_variables
297
312
  name = XSD::CodeGen::GenSupport.safevarname(attr_name)
298
313
  if iv.include?("@#{name}")
@@ -300,12 +315,8 @@ module Mapping
300
315
  elsif iv.include?("@#{attr_name}")
301
316
  return obj.instance_variable_get("@#{attr_name}")
302
317
  end
303
- if obj.is_a?(::Struct) or obj.is_a?(Marshallable)
304
- if obj.respond_to?(name)
305
- return obj.__send__(name)
306
- elsif obj.respond_to?(attr_name)
307
- return obj.__send__(attr_name)
308
- end
318
+ if obj.respond_to?(name)
319
+ return obj.__send__(name)
309
320
  end
310
321
  nil
311
322
  end
@@ -374,8 +385,8 @@ module Mapping
374
385
  end
375
386
 
376
387
  def self.schema_definition_classdef(klass)
377
- if definition = Thread.current[:SOAPMapping][:SchemaDefinition][klass]
378
- return definition
388
+ if Thread.current[:SOAPMapping][:SchemaDefinition].key?(klass)
389
+ return Thread.current[:SOAPMapping][:SchemaDefinition][klass]
379
390
  end
380
391
  ns = schema_ns_definition(klass)
381
392
  name = schema_name_definition(klass)
@@ -410,24 +421,52 @@ module Mapping
410
421
  if schema_element
411
422
  if schema_element.respond_to?(:is_concrete_definition) and
412
423
  schema_element.is_concrete_definition
413
- definition.elements.replace(schema_element)
424
+ definition.elements = schema_element
414
425
  else
415
- parse_schema_element_definition(klass, definition, schema_element)
426
+ default_ns = elename.namespace if elename
427
+ default_ns ||= type.namespace if type
428
+ definition.elements = parse_schema_definition(schema_element, default_ns)
429
+ if klass < ::Array
430
+ definition.elements.set_array
431
+ end
416
432
  end
417
433
  end
418
434
  definition
419
435
  end
420
436
 
421
437
  # for backward compatibility
422
- def self.parse_schema_element_definition(klass, definition, schema_element)
438
+ # returns SchemaComplexTypeDefinition
439
+ def self.parse_schema_definition(schema_element, default_ns)
440
+ definition = nil
423
441
  if schema_element[0] == :choice
424
442
  schema_element.shift
425
- definition.set_choice
443
+ definition = SchemaChoiceDefinition.new
444
+ else
445
+ definition = SchemaSequenceDefinition.new
446
+ end
447
+ schema_element.each do |ele|
448
+ element_definition = parse_schema_element_definition(ele, default_ns)
449
+ definition << element_definition
426
450
  end
427
- schema_element.each do |element|
428
- varname, info = element
451
+ definition
452
+ end
453
+
454
+ # returns SchemaElementDefinition
455
+ def self.parse_schema_element_definition(schema_element, default_ns)
456
+ if schema_element[0] == :choice
457
+ parse_schema_definition(schema_element, default_ns)
458
+ elsif schema_element[0].is_a?(Array)
459
+ parse_schema_definition(schema_element, default_ns)
460
+ else
461
+ varname, info, occurrence = schema_element
429
462
  mapped_class_str, elename = info
430
- as_array = klass.ancestors.include?(::Array)
463
+ if occurrence
464
+ minoccurs, maxoccurs = occurrence
465
+ else
466
+ # for backward compatibility
467
+ minoccurs, maxoccurs = 1, 1
468
+ end
469
+ as_any = as_array = false
431
470
  if /\[\]$/ =~ mapped_class_str
432
471
  mapped_class_str = mapped_class_str.sub(/\[\]$/, '')
433
472
  if mapped_class_str.empty?
@@ -442,77 +481,32 @@ module Mapping
442
481
  end
443
482
  end
444
483
  if elename == XSD::AnyTypeName
445
- definition.set_any
484
+ as_any = true
446
485
  elsif elename.nil?
447
- ns ||= definition.elename.namespace if definition.elename
448
- ns ||= definition.type.namespace if definition.type
449
- elename = XSD::QName.new(ns, varname)
486
+ elename = XSD::QName.new(default_ns, varname)
450
487
  end
451
- definition.elements <<
452
- SchemaElementDefinition.new(varname, mapped_class, elename, as_array)
453
- end
454
- end
455
-
456
- class SchemaElementDefinition
457
- attr_reader :varname, :mapped_class, :elename
458
-
459
- def initialize(varname, mapped_class, elename, as_array)
460
- @varname = varname
461
- @mapped_class = mapped_class
462
- @elename = elename
463
- @as_array = as_array
464
- end
465
-
466
- def as_array?
467
- @as_array
468
- end
469
-
470
- def is_concrete_definition
471
- true
472
- end
473
- end
474
-
475
- class SchemaElementChoiceDefinition < ::Array
476
- def is_concrete_definition
477
- true
488
+ SchemaElementDefinition.new(
489
+ varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array)
478
490
  end
479
491
  end
480
492
 
481
- class SchemaDefinition
482
- attr_reader :class_for
483
- attr_reader :elename, :type
484
- attr_reader :qualified, :elements
485
- attr_accessor :attributes
486
-
487
- def initialize(class_for, elename, type, qualified)
488
- @class_for = class_for
489
- @elename = elename
490
- @type = type
491
- @qualified = qualified
492
- @elements = []
493
- @attributes = nil
494
- @choice = false
495
- @any = false
496
- end
497
-
498
- def choice?
499
- @choice
500
- end
501
-
502
- def have_any?
503
- @any
504
- end
505
-
506
- def set_choice
507
- @choice = true
508
- end
493
+ class << Mapping
494
+ public
509
495
 
510
- def set_any
511
- @any = true
496
+ def protect_threadvars(*symbols)
497
+ backup = {}
498
+ begin
499
+ symbols.each do |sym|
500
+ backup[sym] = Thread.current[sym]
501
+ end
502
+ yield
503
+ ensure
504
+ symbols.each do |sym|
505
+ Thread.current[sym] = backup[sym]
506
+ end
507
+ end
512
508
  end
513
- end
514
509
 
515
- class << Mapping
516
510
  private
517
511
 
518
512
  def class_schema_variable(sym, klass)
@@ -531,20 +525,6 @@ module Mapping
531
525
  end
532
526
  end
533
527
 
534
- def protect_threadvars(*symbols)
535
- backup = {}
536
- begin
537
- symbols.each do |sym|
538
- backup[sym] = Thread.current[sym]
539
- end
540
- yield
541
- ensure
542
- symbols.each do |sym|
543
- Thread.current[sym] = backup[sym]
544
- end
545
- end
546
- end
547
-
548
528
  def add_md_ary(md_ary, ary, indices, registry)
549
529
  for idx in 0..(ary.size - 1)
550
530
  if ary[idx].is_a?(Array)