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,28 @@
1
+ # WSDL4R - XMLSchema element definition for WSDL.
2
+ # Copyright (C) 2004 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/wsdl/xmlSchema/element'
10
+
11
+
12
+ module WSDL
13
+ module XMLSchema
14
+
15
+
16
+ class Element < Info
17
+ def map_as_array?
18
+ maxoccurs != '1'
19
+ end
20
+
21
+ def attributes
22
+ @local_complextype.attributes
23
+ end
24
+ end
25
+
26
+
27
+ end
28
+ end
@@ -0,0 +1,56 @@
1
+ # WSDL4R - WSDL SOAP body definition.
2
+ # Copyright (C) 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/wsdl/info'
10
+
11
+
12
+ module WSDL
13
+ module SOAP
14
+
15
+
16
+ class Fault < Info
17
+ attr_reader :name # required
18
+ attr_reader :use # required
19
+ attr_reader :encodingstyle
20
+ attr_reader :namespace
21
+
22
+ def initialize
23
+ super
24
+ @name = nil
25
+ @use = nil
26
+ @encodingstyle = nil
27
+ @namespace = nil
28
+ end
29
+
30
+ def targetnamespace
31
+ parent.targetnamespace
32
+ end
33
+
34
+ def parse_element(element)
35
+ nil
36
+ end
37
+
38
+ def parse_attr(attr, value)
39
+ case attr
40
+ when NameAttrName
41
+ @name = XSD::QName.new(targetnamespace, value.source)
42
+ when UseAttrName
43
+ @use = value.source
44
+ when EncodingStyleAttrName
45
+ @encodingstyle = value.source
46
+ when NamespaceAttrName
47
+ @namespace = value.source
48
+ else
49
+ nil
50
+ end
51
+ end
52
+ end
53
+
54
+
55
+ end
56
+ end
@@ -0,0 +1,86 @@
1
+ # WSDL4R - WSDL SOAP body definition.
2
+ # Copyright (C) 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/wsdl/info'
10
+
11
+
12
+ module WSDL
13
+ module SOAP
14
+
15
+
16
+ class Header < Info
17
+ attr_reader :headerfault
18
+
19
+ attr_reader :message # required
20
+ attr_reader :part # required
21
+ attr_reader :use # required
22
+ attr_reader :encodingstyle
23
+ attr_reader :namespace
24
+
25
+ def initialize
26
+ super
27
+ @message = nil
28
+ @part = nil
29
+ @use = nil
30
+ @encodingstyle = nil
31
+ @namespace = nil
32
+ @headerfault = nil
33
+ end
34
+
35
+ def targetnamespace
36
+ parent.targetnamespace
37
+ end
38
+
39
+ def find_message
40
+ root.message(@message) or raise RuntimeError.new("#{@message} not found")
41
+ end
42
+
43
+ def find_part
44
+ find_message.parts.each do |part|
45
+ if part.name == @part
46
+ return part
47
+ end
48
+ end
49
+ raise RuntimeError.new("#{@part} not found")
50
+ end
51
+
52
+ def parse_element(element)
53
+ case element
54
+ when HeaderFaultName
55
+ o = WSDL::SOAP::HeaderFault.new
56
+ @headerfault = o
57
+ o
58
+ else
59
+ nil
60
+ end
61
+ end
62
+
63
+ def parse_attr(attr, value)
64
+ case attr
65
+ when MessageAttrName
66
+ if value.namespace.nil?
67
+ value = XSD::QName.new(targetnamespace, value.source)
68
+ end
69
+ @message = value
70
+ when PartAttrName
71
+ @part = value.source
72
+ when UseAttrName
73
+ @use = value.source
74
+ when EncodingStyleAttrName
75
+ @encodingstyle = value.source
76
+ when NamespaceAttrName
77
+ @namespace = value.source
78
+ else
79
+ nil
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ end
86
+ end
@@ -0,0 +1,56 @@
1
+ # WSDL4R - WSDL SOAP body definition.
2
+ # Copyright (C) 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/wsdl/info'
10
+
11
+
12
+ module WSDL
13
+ module SOAP
14
+
15
+
16
+ class HeaderFault < Info
17
+ attr_reader :message # required
18
+ attr_reader :part # required
19
+ attr_reader :use # required
20
+ attr_reader :encodingstyle
21
+ attr_reader :namespace
22
+
23
+ def initialize
24
+ super
25
+ @message = nil
26
+ @part = nil
27
+ @use = nil
28
+ @encodingstyle = nil
29
+ @namespace = nil
30
+ end
31
+
32
+ def parse_element(element)
33
+ nil
34
+ end
35
+
36
+ def parse_attr(attr, value)
37
+ case attr
38
+ when MessageAttrName
39
+ @message = value
40
+ when PartAttrName
41
+ @part = value.source
42
+ when UseAttrName
43
+ @use = value.source
44
+ when EncodingStyleAttrName
45
+ @encodingstyle = value.source
46
+ when NamespaceAttrName
47
+ @namespace = value.source
48
+ else
49
+ nil
50
+ end
51
+ end
52
+ end
53
+
54
+
55
+ end
56
+ end
@@ -0,0 +1,92 @@
1
+ # WSDL4R - Creating MappingRegistry code from WSDL.
2
+ # Copyright (C) 2002, 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
+ require 'action_web_service/wsdl/info'
10
+ require 'action_web_service/wsdl/soap/classDefCreatorSupport'
11
+
12
+
13
+ module WSDL
14
+ module SOAP
15
+
16
+
17
+ class MappingRegistryCreator
18
+ include ClassDefCreatorSupport
19
+
20
+ attr_reader :definitions
21
+
22
+ def initialize(definitions)
23
+ @definitions = definitions
24
+ @complextypes = @definitions.collect_complextypes
25
+ @types = nil
26
+ end
27
+
28
+ def dump(types)
29
+ @types = types
30
+ map_cache = []
31
+ map = ""
32
+ @types.each do |type|
33
+ if map_cache.index(type).nil?
34
+ map_cache << type
35
+ if type.namespace != XSD::Namespace
36
+ if typemap = dump_typemap(type)
37
+ map << typemap
38
+ end
39
+ end
40
+ end
41
+ end
42
+ return map
43
+ end
44
+
45
+ private
46
+
47
+ def dump_typemap(type)
48
+ if definedtype = @complextypes[type]
49
+ case definedtype.compoundtype
50
+ when :TYPE_STRUCT
51
+ dump_struct_typemap(definedtype)
52
+ when :TYPE_ARRAY
53
+ dump_array_typemap(definedtype)
54
+ when :TYPE_MAP, :TYPE_EMPTY
55
+ nil
56
+ else
57
+ raise NotImplementedError.new("must not reach here")
58
+ end
59
+ end
60
+ end
61
+
62
+ def dump_struct_typemap(definedtype)
63
+ ele = definedtype.name
64
+ return <<__EOD__
65
+ MappingRegistry.set(
66
+ #{create_class_name(ele)},
67
+ ::SOAP::SOAPStruct,
68
+ ::SOAP::Mapping::Registry::TypedStructFactory,
69
+ { :type => #{dqname(ele)} }
70
+ )
71
+ __EOD__
72
+ end
73
+
74
+ def dump_array_typemap(definedtype)
75
+ ele = definedtype.name
76
+ arytype = definedtype.find_arytype || XSD::AnyTypeName
77
+ type = XSD::QName.new(arytype.namespace, arytype.name.sub(/\[(?:,)*\]$/, ''))
78
+ @types << type
79
+ return <<__EOD__
80
+ MappingRegistry.set(
81
+ #{create_class_name(ele)},
82
+ ::SOAP::SOAPArray,
83
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
84
+ { :type => #{dqname(type)} }
85
+ )
86
+ __EOD__
87
+ end
88
+ end
89
+
90
+
91
+ end
92
+ end
@@ -0,0 +1,228 @@
1
+ # WSDL4R - Creating driver code from WSDL.
2
+ # Copyright (C) 2002, 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
+ require 'action_web_service/wsdl/info'
10
+ require 'action_web_service/wsdl/soap/classDefCreatorSupport'
11
+ require 'action_web_service/soap/rpc/element'
12
+
13
+
14
+ module WSDL
15
+ module SOAP
16
+
17
+
18
+ class MethodDefCreator
19
+ include ClassDefCreatorSupport
20
+
21
+ attr_reader :definitions
22
+
23
+ def initialize(definitions)
24
+ @definitions = definitions
25
+ @simpletypes = @definitions.collect_simpletypes
26
+ @complextypes = @definitions.collect_complextypes
27
+ @elements = @definitions.collect_elements
28
+ @types = []
29
+ end
30
+
31
+ def dump(porttype)
32
+ @types.clear
33
+ result = ""
34
+ operations = @definitions.porttype(porttype).operations
35
+ binding = @definitions.porttype_binding(porttype)
36
+ operations.each do |operation|
37
+ op_bind = binding.operations[operation.name]
38
+ next unless op_bind # no binding is defined
39
+ next unless op_bind.soapoperation # not a SOAP operation binding
40
+ result << ",\n" unless result.empty?
41
+ result << dump_method(operation, op_bind).chomp
42
+ end
43
+ return result, @types
44
+ end
45
+
46
+ def collect_rpcparameter(operation)
47
+ result = operation.inputparts.collect { |part|
48
+ collect_type(part.type)
49
+ param_set(::SOAP::RPC::SOAPMethod::IN, part.name, rpcdefinedtype(part))
50
+ }
51
+ outparts = operation.outputparts
52
+ if outparts.size > 0
53
+ retval = outparts[0]
54
+ collect_type(retval.type)
55
+ result << param_set(::SOAP::RPC::SOAPMethod::RETVAL, retval.name,
56
+ rpcdefinedtype(retval))
57
+ cdr(outparts).each { |part|
58
+ collect_type(part.type)
59
+ result << param_set(::SOAP::RPC::SOAPMethod::OUT, part.name,
60
+ rpcdefinedtype(part))
61
+ }
62
+ end
63
+ result
64
+ end
65
+
66
+ def collect_documentparameter(operation)
67
+ param = []
68
+ operation.inputparts.each do |input|
69
+ param << param_set(::SOAP::RPC::SOAPMethod::IN, input.name,
70
+ documentdefinedtype(input), elementqualified(input))
71
+ end
72
+ operation.outputparts.each do |output|
73
+ param << param_set(::SOAP::RPC::SOAPMethod::OUT, output.name,
74
+ documentdefinedtype(output), elementqualified(output))
75
+ end
76
+ param
77
+ end
78
+
79
+ private
80
+
81
+ def dump_method(operation, binding)
82
+ name = safemethodname(operation.name.name)
83
+ name_as = operation.name.name
84
+ style = binding.soapoperation_style
85
+ inputuse = binding.input.soapbody_use
86
+ outputuse = binding.output.soapbody_use
87
+ namespace = binding.input.soapbody.namespace
88
+ if style == :rpc
89
+ qname = XSD::QName.new(namespace, name_as)
90
+ paramstr = param2str(collect_rpcparameter(operation))
91
+ else
92
+ qname = nil
93
+ paramstr = param2str(collect_documentparameter(operation))
94
+ end
95
+ if paramstr.empty?
96
+ paramstr = '[]'
97
+ else
98
+ paramstr = "[ " << paramstr.split(/\r?\n/).join("\n ") << " ]"
99
+ end
100
+ definitions = <<__EOD__
101
+ #{ndq(binding.soapaction)},
102
+ #{dq(name)},
103
+ #{paramstr},
104
+ { :request_style => #{sym(style.id2name)}, :request_use => #{sym(inputuse.id2name)},
105
+ :response_style => #{sym(style.id2name)}, :response_use => #{sym(outputuse.id2name)} }
106
+ __EOD__
107
+ if style == :rpc
108
+ return <<__EOD__
109
+ [ #{qname.dump},
110
+ #{definitions}]
111
+ __EOD__
112
+ else
113
+ return <<__EOD__
114
+ [ #{definitions}]
115
+ __EOD__
116
+ end
117
+ end
118
+
119
+ def rpcdefinedtype(part)
120
+ if mapped = basetype_mapped_class(part.type)
121
+ ['::' + mapped.name]
122
+ elsif definedtype = @simpletypes[part.type]
123
+ ['::' + basetype_mapped_class(definedtype.base).name]
124
+ elsif definedtype = @elements[part.element]
125
+ #['::SOAP::SOAPStruct', part.element.namespace, part.element.name]
126
+ ['nil', part.element.namespace, part.element.name]
127
+ elsif definedtype = @complextypes[part.type]
128
+ case definedtype.compoundtype
129
+ when :TYPE_STRUCT, :TYPE_EMPTY # ToDo: empty should be treated as void.
130
+ type = create_class_name(part.type)
131
+ [type, part.type.namespace, part.type.name]
132
+ when :TYPE_MAP
133
+ [Hash.name, part.type.namespace, part.type.name]
134
+ when :TYPE_ARRAY
135
+ arytype = definedtype.find_arytype || XSD::AnyTypeName
136
+ ns = arytype.namespace
137
+ name = arytype.name.sub(/\[(?:,)*\]$/, '')
138
+ type = create_class_name(XSD::QName.new(ns, name))
139
+ [type + '[]', ns, name]
140
+ else
141
+ raise NotImplementedError.new("must not reach here")
142
+ end
143
+ else
144
+ raise RuntimeError.new("part: #{part.name} cannot be resolved")
145
+ end
146
+ end
147
+
148
+ def documentdefinedtype(part)
149
+ if mapped = basetype_mapped_class(part.type)
150
+ ['::' + mapped.name, nil, part.name]
151
+ elsif definedtype = @simpletypes[part.type]
152
+ ['::' + basetype_mapped_class(definedtype.base).name, nil, part.name]
153
+ elsif definedtype = @elements[part.element]
154
+ ['::SOAP::SOAPElement', part.element.namespace, part.element.name]
155
+ elsif definedtype = @complextypes[part.type]
156
+ ['::SOAP::SOAPElement', part.type.namespace, part.type.name]
157
+ else
158
+ raise RuntimeError.new("part: #{part.name} cannot be resolved")
159
+ end
160
+ end
161
+
162
+ def elementqualified(part)
163
+ if mapped = basetype_mapped_class(part.type)
164
+ false
165
+ elsif definedtype = @simpletypes[part.type]
166
+ false
167
+ elsif definedtype = @elements[part.element]
168
+ definedtype.elementform == 'qualified'
169
+ elsif definedtype = @complextypes[part.type]
170
+ false
171
+ else
172
+ raise RuntimeError.new("part: #{part.name} cannot be resolved")
173
+ end
174
+ end
175
+
176
+ def param_set(io_type, name, type, ele = nil)
177
+ [io_type, name, type, ele]
178
+ end
179
+
180
+ def collect_type(type)
181
+ # ignore inline type definition.
182
+ return if type.nil?
183
+ return if @types.include?(type)
184
+ @types << type
185
+ return unless @complextypes[type]
186
+ @complextypes[type].each_element do |element|
187
+ collect_type(element.type)
188
+ end
189
+ end
190
+
191
+ def param2str(params)
192
+ params.collect { |param|
193
+ io, name, type, ele = param
194
+ unless ele.nil?
195
+ "[#{dq(io)}, #{dq(name)}, #{type2str(type)}, #{ele2str(ele)}]"
196
+ else
197
+ "[#{dq(io)}, #{dq(name)}, #{type2str(type)}]"
198
+ end
199
+ }.join(",\n")
200
+ end
201
+
202
+ def type2str(type)
203
+ if type.size == 1
204
+ "[#{dq(type[0])}]"
205
+ else
206
+ "[#{dq(type[0])}, #{ndq(type[1])}, #{dq(type[2])}]"
207
+ end
208
+ end
209
+
210
+ def ele2str(ele)
211
+ qualified = ele
212
+ if qualified
213
+ "true"
214
+ else
215
+ "false"
216
+ end
217
+ end
218
+
219
+ def cdr(ary)
220
+ result = ary.dup
221
+ result.shift
222
+ result
223
+ end
224
+ end
225
+
226
+
227
+ end
228
+ end