Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

root/tags/RELEASE_1_4_7/bin/wsdl2ruby.rb

Revision 578, 7.0 kB (checked in by nahi, 6 years ago)

Use getoptlong.
Added several creators.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to author date id revision
Line 
1 #!/usr/bin/env ruby
2
3 require 'getoptlong'
4 require 'wsdl/xmlparser'
5 require 'wsdl/name'
6 require 'wsdl/soap/classDefCreator'
7 require 'wsdl/soap/servantSkeltonCreator'
8 require 'wsdl/soap/driverCreator'
9 require 'wsdl/soap/clientSkeltonCreator'
10 require 'wsdl/soap/standaloneServerStubCreator'
11 require 'wsdl/soap/cgiStubCreator'
12 require 'wsdl/soap/webrickStubCreator'
13
14 require 'devel/logger'
15
16 class WSDL2RubyApp < Devel::Application
17 private
18
19   OptSet = [
20     ['--wsdl','-w', GetoptLong::REQUIRED_ARGUMENT],
21     ['--type','-t', GetoptLong::REQUIRED_ARGUMENT],
22     ['--classDef','-f', GetoptLong::NO_ARGUMENT],
23     ['--clientSkelton','-c', GetoptLong::OPTIONAL_ARGUMENT],
24     ['--servantSkelton','-s', GetoptLong::OPTIONAL_ARGUMENT],
25     ['--cgiStub','-g', GetoptLong::OPTIONAL_ARGUMENT],
26     ['--webrickStub','-b', GetoptLong::OPTIONAL_ARGUMENT],
27     ['--standaloneServerStub','-a', GetoptLong::OPTIONAL_ARGUMENT],
28     ['--driver','-d', GetoptLong::OPTIONAL_ARGUMENT]
29   ]
30
31   def initialize
32     super( 'app' )
33     @wsdlFile = nil
34     @opt = {}
35     @wsdl = nil
36     @name = nil
37   end
38
39   def run
40     @wsdlFile, @opt = parseOpt( GetoptLong.new( *OptSet ))
41     usageExit unless @wsdlFile
42     @wsdl = WSDL::WSDLXMLParser.new.parse( File.open( @wsdlFile ))
43     @name = @wsdl.name.name || 'default'
44     createFile
45     0
46   end
47
48   def createFile
49     createClassDef if @opt.has_key?( 'classDef' )
50     createServantSkelton( @opt[ 'servantSkelton' ] ) if @opt.has_key?( 'servantSkelton' )
51     createCgiStub( @opt[ 'cgiStub' ] ) if @opt.has_key?( 'cgiStub' )
52     createWebrickStub( @opt[ 'webrickStub' ] ) if @opt.has_key?( 'webrickStub' )
53     createStandaloneServerStub( @opt[ 'standaloneServerStub' ] ) if @opt.has_key?( 'standaloneServerStub' )
54     createDriver( @opt[ 'driver' ] ) if @opt.has_key?( 'driver' )
55     createClientSkelton( @opt[ 'clientSkelton' ] ) if @opt.has_key?( 'clientSkelton' )
56   end
57
58   def usageExit
59     puts <<__EOU__
60 Usage: #{ $0 } --wsdl wsdlFilename [options]
61
62 Example:
63   For server side:
64     #{ $0 } --wsdl myApp.wsdl --type server
65   For client side:
66     #{ $0 } --wsdl myApp.wsdl --type client
67
68 Options:
69   --wsdl wsdlFilename
70   --type server|client
71     --type server implies;
72         --classDef
73         --servantSkelton
74         --standaloneServerStub
75     --type client implies;
76         --classDef
77         --clientSkelton
78         --driver
79   --classDef
80   --clientSkelton [serviceName]
81   --servantSkelton [portTypeName]
82   --cgiStub [serviceName]
83   --webrickStub [serviceName]
84   --standaloneServerStub [serviceName]
85   --driver [portTypeName]
86
87 Terminology:
88   Client <-> Driver <-(SOAP)-> Stub <-> Servant
89
90   Driver and Stub: Automatically generated
91   Client and Servant: Skelton generated (you should change)
92 __EOU__
93     exit 1
94   end
95
96   def parseOpt( getOpt )
97     opt = {}
98     wsdlFile = nil
99     begin
100       getOpt.each do | name, arg |
101         case name
102         when "--wsdl"
103           wsdlFile = arg
104         when "--type"
105           case arg
106           when "server"
107             opt[ 'classDef' ] = nil
108             opt[ 'servantSkelton' ] = nil
109             opt[ 'standaloneServerStub' ] = nil
110           when "client"
111             opt[ 'classDef' ] = nil
112             opt[ 'driver' ] = nil
113             opt[ 'clientSkelton' ] = nil
114           else
115             raise ArgumentError.new( "Unknown type #{ arg }" )
116           end
117         when "--classDef", "--clientSkelton", "--servantSkelton", "--cgiStub",
118             "--webrickStub", "--standaloneServerStub", "--driver"
119           opt[ name.sub( /^--/, '' ) ] = arg.empty? ? nil : arg
120         else
121           raise ArgumentError.new( "Unknown type #{ arg }" )
122         end
123       end
124     rescue
125       usageExit
126     end
127     return wsdlFile, opt
128   end
129
130   def createClassDef
131     log( SEV_INFO ) { "Creating class definition." }
132     @classDefFilename = @name + '.rb'
133     checkFile( @classDefFilename ) or return
134     File.open( @classDefFilename, "w" ) do | f |
135       f << WSDL::SOAP::ClassDefCreator.new( @wsdl ).dump
136     end
137   end
138
139   def createClientSkelton( serviceName )
140     log( SEV_INFO ) { "Creating client skelton." }
141     serviceName ||= @wsdl.services[ 0 ].name.name
142     @clientSkeltonFilename = serviceName + 'Client.rb'
143     checkFile( @clientSkeltonFilename ) or return
144     File.open( @clientSkeltonFilename, "w" ) do | f |
145       f << shbang << "\n"
146       f << "require '#{ @driverFilename }'\n\n" if @driverFilename
147       f << WSDL::SOAP::ClientSkeltonCreator.new( @wsdl ).dump(
148         createName( serviceName ))
149     end
150   end
151
152   def createServantSkelton( portTypeName )
153     log( SEV_INFO ) { "Creating servant skelton." }
154     @servantSkeltonFilename = ( portTypeName || @name + 'Servant' ) + '.rb'
155     checkFile( @servantSkeltonFilename ) or return
156     File.open( @servantSkeltonFilename, "w" ) do | f |
157       f << "require '#{ @classDefFilename }'\n\n" if @classDefFilename
158       f << WSDL::SOAP::ServantSkeltonCreator.new( @wsdl ).dump(
159         createName( portTypeName ))
160     end
161   end
162
163   def createCgiStub( serviceName )
164     log( SEV_INFO ) { "Creating CGI stub." }
165     serviceName ||= @wsdl.services[ 0 ].name.name
166     @cgiStubFilename = serviceName + '.cgi'
167     checkFile( @cgiStubFilename ) or return
168     File.open( @cgiStubFilename, "w" ) do | f |
169       f << shbang << "\n"
170       f << "require '#{ @servantSkeltonFilename }'\n\n" if @servantSkeltonFilename
171       f << WSDL::SOAP::CGIStubCreator.new( @wsdl ).dump(
172         createName( serviceName ))
173     end
174   end
175
176   def createWebrickStub( serviceName )
177     log( SEV_INFO ) { "Creating WEBrick SOAPlet stub." }
178     serviceName ||= @wsdl.services[ 0 ].name.name
179     @webrickStubFilename = 'httpd.rb'
180     checkFile( @webrickStubFilename ) or return
181     File.open( @webrickStubFilename, "w" ) do | f |
182       f << shbang << "\n"
183       f << "require '#{ @servantSkeltonFilename }'\n\n" if @servantSkeltonFilename
184       f << WSDL::SOAP::WEBrickStubCreator.new( @wsdl ).dump(
185         createName( serviceName ))
186     end
187   end
188
189   def createStandaloneServerStub( serviceName )
190     log( SEV_INFO ) { "Creating standalone stub." }
191     serviceName ||= @wsdl.services[ 0 ].name.name
192     @standaloneServerStubFilename = serviceName + '.rb'
193     checkFile( @standaloneServerStubFilename ) or return
194     File.open( @standaloneServerStubFilename, "w" ) do | f |
195       f << shbang << "\n"
196       f << "require '#{ @servantSkeltonFilename }'\n\n" if @servantSkeltonFilename
197       f << WSDL::SOAP::StandaloneServerStubCreator.new( @wsdl ).dump(
198         createName( serviceName ))
199     end
200   end
201
202   def createDriver( portTypeName )
203     log( SEV_INFO ) { "Creating driver." }
204     @driverFilename = ( portTypeName || @name ) + 'Driver.rb'
205     checkFile( @driverFilename ) or return
206     File.open( @driverFilename, "w" ) do | f |
207       f << "require '#{ @classDefFilename }'\n\n" if @classDefFilename
208       f << WSDL::SOAP::DriverCreator.new( @wsdl ).dump(
209         createName( portTypeName ))
210     end
211   end
212
213   def checkFile( filename )
214     if FileTest.exist?( filename )
215       log( SEV_WARN ) {
216         "File '#{ filename }' exists.  #{ $0 } did not override it." }
217       false
218     else
219       log( SEV_INFO ) { "Creates file '#{ filename }'." }
220       true
221     end
222   end
223
224   def shbang
225     "#!/usr/bin/env ruby"
226   end
227
228   def createName( name )
229     name ? WSDL::Name.new( @wsdl.targetNamespace, name ) : nil
230   end
231 end
232
233 WSDL2RubyApp.new.start
Note: See TracBrowser for help on using the browser.