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,161 @@
1
+ # WSDL4R - SOAP complexType definition for WSDL.
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/xmlSchema/complexType'
10
+ require 'action_web_service/soap/mapping'
11
+
12
+
13
+ module WSDL
14
+ module XMLSchema
15
+
16
+
17
+ class ComplexType < Info
18
+ def compoundtype
19
+ @compoundtype ||= check_type
20
+ end
21
+
22
+ def check_type
23
+ if content
24
+ if attributes.empty? and
25
+ content.elements.size == 1 and content.elements[0].maxoccurs != '1'
26
+ if name == ::SOAP::Mapping::MapQName
27
+ :TYPE_MAP
28
+ else
29
+ :TYPE_ARRAY
30
+ end
31
+ else
32
+ :TYPE_STRUCT
33
+ end
34
+ elsif complexcontent
35
+ if complexcontent.base == ::SOAP::ValueArrayName
36
+ :TYPE_ARRAY
37
+ else
38
+ complexcontent.basetype.check_type
39
+ end
40
+ elsif simplecontent
41
+ :TYPE_SIMPLE
42
+ elsif !attributes.empty?
43
+ :TYPE_STRUCT
44
+ else # empty complexType definition (seen in partner.wsdl of salesforce)
45
+ :TYPE_EMPTY
46
+ end
47
+ end
48
+
49
+ def child_type(name = nil)
50
+ case compoundtype
51
+ when :TYPE_STRUCT
52
+ if ele = find_element(name)
53
+ ele.type
54
+ elsif ele = find_element_by_name(name.name)
55
+ ele.type
56
+ end
57
+ when :TYPE_ARRAY
58
+ @contenttype ||= content_arytype
59
+ when :TYPE_MAP
60
+ item_ele = find_element_by_name("item") or
61
+ raise RuntimeError.new("'item' element not found in Map definition.")
62
+ content = item_ele.local_complextype or
63
+ raise RuntimeError.new("No complexType definition for 'item'.")
64
+ if ele = content.find_element(name)
65
+ ele.type
66
+ elsif ele = content.find_element_by_name(name.name)
67
+ ele.type
68
+ end
69
+ else
70
+ raise NotImplementedError.new("Unknown kind of complexType.")
71
+ end
72
+ end
73
+
74
+ def child_defined_complextype(name)
75
+ ele = nil
76
+ case compoundtype
77
+ when :TYPE_STRUCT, :TYPE_MAP
78
+ unless ele = find_element(name)
79
+ if name.namespace.nil?
80
+ ele = find_element_by_name(name.name)
81
+ end
82
+ end
83
+ when :TYPE_ARRAY
84
+ if content.elements.size == 1
85
+ ele = content.elements[0]
86
+ else
87
+ raise RuntimeError.new("Assert: must not reach.")
88
+ end
89
+ else
90
+ raise RuntimeError.new("Assert: Not implemented.")
91
+ end
92
+ unless ele
93
+ raise RuntimeError.new("Cannot find #{name} as a children of #{@name}.")
94
+ end
95
+ ele.local_complextype
96
+ end
97
+
98
+ def find_arytype
99
+ unless compoundtype == :TYPE_ARRAY
100
+ raise RuntimeError.new("Assert: not for array")
101
+ end
102
+ if complexcontent
103
+ complexcontent.attributes.each do |attribute|
104
+ if attribute.ref == ::SOAP::AttrArrayTypeName
105
+ return attribute.arytype
106
+ end
107
+ end
108
+ if check_array_content(complexcontent.content)
109
+ return element_simpletype(complexcontent.content.elements[0])
110
+ end
111
+ elsif check_array_content(content)
112
+ return element_simpletype(content.elements[0])
113
+ end
114
+ raise RuntimeError.new("Assert: Unknown array definition.")
115
+ end
116
+
117
+ def find_aryelement
118
+ unless compoundtype == :TYPE_ARRAY
119
+ raise RuntimeError.new("Assert: not for array")
120
+ end
121
+ if complexcontent
122
+ if check_array_content(complexcontent.content)
123
+ return complexcontent.content.elements[0]
124
+ end
125
+ elsif check_array_content(content)
126
+ return content.elements[0]
127
+ end
128
+ nil # use default item name
129
+ end
130
+
131
+ private
132
+
133
+ def element_simpletype(element)
134
+ if element.type
135
+ element.type
136
+ elsif element.local_simpletype
137
+ element.local_simpletype.base
138
+ else
139
+ nil
140
+ end
141
+ end
142
+
143
+ def check_array_content(content)
144
+ content and content.elements.size == 1 and
145
+ content.elements[0].maxoccurs != '1'
146
+ end
147
+
148
+ def content_arytype
149
+ if arytype = find_arytype
150
+ ns = arytype.namespace
151
+ name = arytype.name.sub(/\[(?:,)*\]$/, '')
152
+ XSD::QName.new(ns, name)
153
+ else
154
+ nil
155
+ end
156
+ end
157
+ end
158
+
159
+
160
+ end
161
+ end
@@ -0,0 +1,42 @@
1
+ # WSDL4R - WSDL SOAP binding data definitions.
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/xsd/qname'
10
+ require 'action_web_service/wsdl/soap/definitions'
11
+ require 'action_web_service/wsdl/soap/binding'
12
+ require 'action_web_service/wsdl/soap/operation'
13
+ require 'action_web_service/wsdl/soap/body'
14
+ require 'action_web_service/wsdl/soap/element'
15
+ require 'action_web_service/wsdl/soap/header'
16
+ require 'action_web_service/wsdl/soap/headerfault'
17
+ require 'action_web_service/wsdl/soap/fault'
18
+ require 'action_web_service/wsdl/soap/address'
19
+ require 'action_web_service/wsdl/soap/complexType'
20
+
21
+
22
+ module WSDL
23
+ module SOAP
24
+
25
+
26
+ HeaderFaultName = XSD::QName.new(SOAPBindingNamespace, 'headerfault')
27
+
28
+ LocationAttrName = XSD::QName.new(nil, 'location')
29
+ StyleAttrName = XSD::QName.new(nil, 'style')
30
+ TransportAttrName = XSD::QName.new(nil, 'transport')
31
+ UseAttrName = XSD::QName.new(nil, 'use')
32
+ PartsAttrName = XSD::QName.new(nil, 'parts')
33
+ PartAttrName = XSD::QName.new(nil, 'part')
34
+ NameAttrName = XSD::QName.new(nil, 'name')
35
+ MessageAttrName = XSD::QName.new(nil, 'message')
36
+ EncodingStyleAttrName = XSD::QName.new(nil, 'encodingStyle')
37
+ NamespaceAttrName = XSD::QName.new(nil, 'namespace')
38
+ SOAPActionAttrName = XSD::QName.new(nil, 'action_web_service/soapAction')
39
+
40
+
41
+ end
42
+ end
@@ -0,0 +1,149 @@
1
+ # WSDL4R - WSDL additional definitions for SOAP.
2
+ # Copyright (C) 2002-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/xsd/namedelements'
11
+ require 'action_web_service/soap/mapping'
12
+
13
+
14
+ module WSDL
15
+
16
+
17
+ class Definitions < Info
18
+ def self.soap_rpc_complextypes
19
+ types = XSD::NamedElements.new
20
+ types << array_complextype
21
+ types << fault_complextype
22
+ types << exception_complextype
23
+ types
24
+ end
25
+
26
+ def self.array_complextype
27
+ type = XMLSchema::ComplexType.new(::SOAP::ValueArrayName)
28
+ type.complexcontent = XMLSchema::ComplexContent.new
29
+ type.complexcontent.base = ::SOAP::ValueArrayName
30
+ attr = XMLSchema::Attribute.new
31
+ attr.ref = ::SOAP::AttrArrayTypeName
32
+ anytype = XSD::AnyTypeName.dup
33
+ anytype.name += '[]'
34
+ attr.arytype = anytype
35
+ type.complexcontent.attributes << attr
36
+ type
37
+ end
38
+
39
+ =begin
40
+ <xs:complexType name="Fault" final="extension">
41
+ <xs:sequence>
42
+ <xs:element name="faultcode" type="xs:QName" />
43
+ <xs:element name="faultstring" type="xs:string" />
44
+ <xs:element name="faultactor" type="xs:anyURI" minOccurs="0" />
45
+ <xs:element name="detail" type="tns:detail" minOccurs="0" />
46
+ </xs:sequence>
47
+ </xs:complexType>
48
+ =end
49
+ def self.fault_complextype
50
+ type = XMLSchema::ComplexType.new(::SOAP::EleFaultName)
51
+ faultcode = XMLSchema::Element.new(::SOAP::EleFaultCodeName, XSD::XSDQName::Type)
52
+ faultstring = XMLSchema::Element.new(::SOAP::EleFaultStringName, XSD::XSDString::Type)
53
+ faultactor = XMLSchema::Element.new(::SOAP::EleFaultActorName, XSD::XSDAnyURI::Type)
54
+ faultactor.minoccurs = 0
55
+ detail = XMLSchema::Element.new(::SOAP::EleFaultDetailName, XSD::AnyTypeName)
56
+ detail.minoccurs = 0
57
+ type.all_elements = [faultcode, faultstring, faultactor, detail]
58
+ type.final = 'extension'
59
+ type
60
+ end
61
+
62
+ def self.exception_complextype
63
+ type = XMLSchema::ComplexType.new(XSD::QName.new(
64
+ ::SOAP::Mapping::RubyCustomTypeNamespace, 'SOAPException'))
65
+ excn_name = XMLSchema::Element.new(XSD::QName.new(nil, 'excn_type_name'), XSD::XSDString::Type)
66
+ cause = XMLSchema::Element.new(XSD::QName.new(nil, 'cause'), XSD::AnyTypeName)
67
+ backtrace = XMLSchema::Element.new(XSD::QName.new(nil, 'backtrace'), ::SOAP::ValueArrayName)
68
+ message = XMLSchema::Element.new(XSD::QName.new(nil, 'message'), XSD::XSDString::Type)
69
+ type.all_elements = [excn_name, cause, backtrace, message]
70
+ type
71
+ end
72
+
73
+ def soap_rpc_complextypes(binding)
74
+ types = rpc_operation_complextypes(binding)
75
+ types + self.class.soap_rpc_complextypes
76
+ end
77
+
78
+ def collect_faulttypes
79
+ result = []
80
+ collect_fault_messages.each do |name|
81
+ faultparts = message(name).parts
82
+ if faultparts.size != 1
83
+ raise RuntimeError.new("expecting fault message to have only 1 part")
84
+ end
85
+ if result.index(faultparts[0].type).nil?
86
+ result << faultparts[0].type
87
+ end
88
+ end
89
+ result
90
+ end
91
+
92
+ private
93
+
94
+ def collect_fault_messages
95
+ result = []
96
+ porttypes.each do |porttype|
97
+ porttype.operations.each do |operation|
98
+ operation.fault.each do |fault|
99
+ if result.index(fault.message).nil?
100
+ result << fault.message
101
+ end
102
+ end
103
+ end
104
+ end
105
+ result
106
+ end
107
+
108
+ def rpc_operation_complextypes(binding)
109
+ types = XSD::NamedElements.new
110
+ binding.operations.each do |op_bind|
111
+ if op_bind_rpc?(op_bind)
112
+ operation = op_bind.find_operation
113
+ if op_bind.input
114
+ type = XMLSchema::ComplexType.new(op_bind.soapoperation_name)
115
+ message = messages[operation.input.message]
116
+ type.sequence_elements = elements_from_message(message)
117
+ types << type
118
+ end
119
+ if op_bind.output
120
+ type = XMLSchema::ComplexType.new(operation.outputname)
121
+ message = messages[operation.output.message]
122
+ type.sequence_elements = elements_from_message(message)
123
+ types << type
124
+ end
125
+ end
126
+ end
127
+ types
128
+ end
129
+
130
+ def op_bind_rpc?(op_bind)
131
+ op_bind.soapoperation_style == :rpc
132
+ end
133
+
134
+ def elements_from_message(message)
135
+ message.parts.collect { |part|
136
+ if part.element
137
+ collect_elements[part.element]
138
+ elsif part.name.nil? or part.type.nil?
139
+ raise RuntimeError.new("part of a message must be an element or typed")
140
+ else
141
+ qname = XSD::QName.new(nil, part.name)
142
+ XMLSchema::Element.new(qname, part.type)
143
+ end
144
+ }
145
+ end
146
+ end
147
+
148
+
149
+ end
@@ -0,0 +1,95 @@
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/mappingRegistryCreator'
11
+ require 'action_web_service/wsdl/soap/methodDefCreator'
12
+ require 'action_web_service/wsdl/soap/classDefCreatorSupport'
13
+ require 'action_web_service/xsd/codegen'
14
+
15
+
16
+ module WSDL
17
+ module SOAP
18
+
19
+
20
+ class DriverCreator
21
+ include ClassDefCreatorSupport
22
+
23
+ attr_reader :definitions
24
+
25
+ def initialize(definitions)
26
+ @definitions = definitions
27
+ end
28
+
29
+ def dump(porttype = nil)
30
+ if porttype.nil?
31
+ result = ""
32
+ @definitions.porttypes.each do |type|
33
+ result << dump_porttype(type.name)
34
+ result << "\n"
35
+ end
36
+ else
37
+ result = dump_porttype(porttype)
38
+ end
39
+ result
40
+ end
41
+
42
+ private
43
+
44
+ def dump_porttype(name)
45
+ class_name = create_class_name(name)
46
+ methoddef, types = MethodDefCreator.new(@definitions).dump(name)
47
+ mr_creator = MappingRegistryCreator.new(@definitions)
48
+ binding = @definitions.bindings.find { |item| item.type == name }
49
+ return '' unless binding.soapbinding # not a SOAP binding
50
+ address = @definitions.porttype(name).locations[0]
51
+
52
+ c = XSD::CodeGen::ClassDef.new(class_name, "::SOAP::RPC::Driver")
53
+ c.def_require("soap/rpc/driver")
54
+ c.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
55
+ c.def_const("DefaultEndpointUrl", ndq(address))
56
+ c.def_code(mr_creator.dump(types))
57
+ c.def_code <<-EOD
58
+ Methods = [
59
+ #{methoddef.gsub(/^/, " ")}
60
+ ]
61
+ EOD
62
+ c.def_method("initialize", "endpoint_url = nil") do
63
+ <<-EOD
64
+ endpoint_url ||= DefaultEndpointUrl
65
+ super(endpoint_url, nil)
66
+ self.mapping_registry = MappingRegistry
67
+ init_methods
68
+ EOD
69
+ end
70
+ c.def_privatemethod("init_methods") do
71
+ <<-EOD
72
+ Methods.each do |definitions|
73
+ opt = definitions.last
74
+ if opt[:request_style] == :document
75
+ add_document_operation(*definitions)
76
+ else
77
+ add_rpc_operation(*definitions)
78
+ qname = definitions[0]
79
+ name = definitions[2]
80
+ if qname.name != name and qname.name.capitalize == name.capitalize
81
+ ::SOAP::Mapping.define_singleton_method(self, qname.name) do |*arg|
82
+ __send__(name, *arg)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ EOD
88
+ end
89
+ c.dump
90
+ end
91
+ end
92
+
93
+
94
+ end
95
+ end