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

root/tags/RELEASE_1_5_1/bin/wsdl2ruby.rb

Revision 952, 6.5 kB (checked in by nahi, 5 years ago)

Follow devel-logger's change.

  • 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 'xsd/qname'
5 require 'wsdl/parser'
6 require 'wsdl/importer'
7 require 'wsdl/soap/classDefCreator'
8 require 'wsdl/soap/servantSkeltonCreator'
9 require 'wsdl/soap/driverCreator'
10 require 'wsdl/soap/clientSkeltonCreator'
11 require 'wsdl/soap/standaloneServerStubCreator'
12 require 'wsdl/soap/cgiStubCreator'
13
14 require 'logger'
15
16 class WSDL2RubyApp < Logger::Application
17 private
18
19   OptSet = [
20     ['--wsdl','-w', GetoptLong::REQUIRED_ARGUMENT],
21     ['--type','-t', GetoptLong::REQUIRED_ARGUMENT],
22     ['--classdef','-e', GetoptLong::NO_ARGUMENT],
23     ['--client_skelton','-c', GetoptLong::OPTIONAL_ARGUMENT],
24     ['--servant_skelton','-s', GetoptLong::OPTIONAL_ARGUMENT],
25     ['--cgi_stub','-g', GetoptLong::OPTIONAL_ARGUMENT],
26     ['--standalone_server_stub','-a', GetoptLong::OPTIONAL_ARGUMENT],
27     ['--driver','-d', GetoptLong::OPTIONAL_ARGUMENT],
28     ['--force','-f', GetoptLong::NO_ARGUMENT],
29  ]
30
31   def initialize
32     super('app')
33     STDERR.sync = true
34     @wsdl_location = nil
35     @opt = {}
36     @wsdl = nil
37     @name = nil
38   end
39
40   def run
41     @wsdl_location, @opt = parse_opt(GetoptLong.new(*OptSet))
42     usage_exit unless @wsdl_location
43     @wsdl = import(@wsdl_location)
44     @name = @wsdl.name.name || 'default'
45     create_file
46     0
47   end
48
49   def create_file
50     create_classdef if @opt.key?('classdef')
51     create_servant_skelton(@opt['servant_skelton']) if @opt.key?('servant_skelton')
52     create_cgi_stub(@opt['cgi_stub']) if @opt.key?('cgi_stub')
53     create_standalone_server_stub(@opt['standalone_server_stub']) if @opt.key?('standalone_server_stub')
54     create_driver(@opt['driver']) if @opt.key?('driver')
55     create_client_skelton(@opt['client_skelton']) if @opt.key?('client_skelton')
56   end
57
58   def usage_exit
59     puts <<__EOU__
60 Usage: #{ $0 } --wsdl wsdl_location [options]
61   wsdl_location: filename or URL
62
63 Example:
64   For server side:
65     #{ $0 } --wsdl myapp.wsdl --type server
66   For client side:
67     #{ $0 } --wsdl myapp.wsdl --type client
68
69 Options:
70   --wsdl wsdl_location
71   --type server|client
72     --type server implies;
73         --classdef
74         --servant_skelton
75         --standalone_server_stub
76     --type client implies;
77         --classdef
78         --client_skelton
79         --driver
80   --classdef
81   --client_skelton [servicename]
82   --servant_skelton [porttypename]
83   --cgi_stub [servicename]
84   --standalone_server_stub [servicename]
85   --driver [porttypename]
86   --force
87
88 Terminology:
89   Client <-> Driver <-(SOAP)-> Stub <-> Servant
90
91   Driver and Stub: Automatically generated
92   Client and Servant: Skelton generated (you should change)
93 __EOU__
94     exit 1
95   end
96
97   def parse_opt(getoptlong)
98     opt = {}
99     wsdl = nil
100     begin
101       getoptlong.each do |name, arg|
102         case name
103         when "--wsdl"
104           wsdl = arg
105         when "--type"
106           case arg
107           when "server"
108             opt['classdef'] = nil
109             opt['servant_skelton'] = nil
110             opt['standalone_server_stub'] = nil
111           when "client"
112             opt['classdef'] = nil
113             opt['driver'] = nil
114             opt['client_skelton'] = nil
115           else
116             raise ArgumentError.new("Unknown type #{ arg }")
117           end
118         when "--classdef", "--client_skelton", "--servant_skelton",
119             "--cgi_stub", "--standalone_server_stub", "--driver"
120           opt[name.sub(/^--/, '')] = arg.empty? ? nil : arg
121         when "--force"
122           opt['force'] = true
123         else
124           raise ArgumentError.new("Unknown type #{ arg }")
125         end
126       end
127     rescue
128       usage_exit
129     end
130     return wsdl, opt
131   end
132
133   def create_classdef
134     log(INFO) { "Creating class definition." }
135     @classdef_filename = @name + '.rb'
136     check_file(@classdef_filename) or return
137     File.open(@classdef_filename, "w") do |f|
138       f << WSDL::SOAP::ClassDefCreator.new(@wsdl).dump
139     end
140   end
141
142   def create_client_skelton(servicename)
143     log(INFO) { "Creating client skelton." }
144     servicename ||= @wsdl.services[0].name.name
145     @client_skelton_filename = servicename + 'Client.rb'
146     check_file(@client_skelton_filename) or return
147     File.open(@client_skelton_filename, "w") do |f|
148       f << shbang << "\n"
149       f << "require '#{ @driver_filename }'\n\n" if @driver_filename
150       f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl).dump(
151         create_name(servicename))
152     end
153   end
154
155   def create_servant_skelton(porttypename)
156     log(INFO) { "Creating servant skelton." }
157     @servant_skelton_filename = (porttypename || @name + 'Servant') + '.rb'
158     check_file(@servant_skelton_filename) or return
159     File.open(@servant_skelton_filename, "w") do |f|
160       f << "require '#{ @classdef_filename }'\n\n" if @classdef_filename
161       f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl).dump(
162         create_name(porttypename))
163     end
164   end
165
166   def create_cgi_stub(servicename)
167     log(INFO) { "Creating CGI stub." }
168     servicename ||= @wsdl.services[0].name.name
169     @cgi_stubFilename = servicename + '.cgi'
170     check_file(@cgi_stubFilename) or return
171     File.open(@cgi_stubFilename, "w") do |f|
172       f << shbang << "\n"
173       if @servant_skelton_filename
174         f << "require '#{ @servant_skelton_filename }'\n\n"
175       end
176       f << WSDL::SOAP::CGIStubCreator.new(@wsdl).dump(create_name(servicename))
177     end
178   end
179
180   def create_standalone_server_stub(servicename)
181     log(INFO) { "Creating standalone stub." }
182     servicename ||= @wsdl.services[0].name.name
183     @standalone_server_stub_filename = servicename + '.rb'
184     check_file(@standalone_server_stub_filename) or return
185     File.open(@standalone_server_stub_filename, "w") do |f|
186       f << shbang << "\n"
187       f << "require '#{ @servant_skelton_filename }'\n\n" if @servant_skelton_filename
188       f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl).dump(
189         create_name(servicename))
190     end
191   end
192
193   def create_driver(porttypename)
194     log(INFO) { "Creating driver." }
195     @driver_filename = (porttypename || @name) + 'Driver.rb'
196     check_file(@driver_filename) or return
197     File.open(@driver_filename, "w") do |f|
198       f << "require '#{ @classdef_filename }'\n\n" if @classdef_filename
199       f << WSDL::SOAP::DriverCreator.new(@wsdl).dump(
200         create_name(porttypename))
201     end
202   end
203
204   def check_file(filename)
205     if FileTest.exist?(filename)
206       if @opt.key?('force')
207         log(WARN) {
208           "File '#{ filename }' exists but overrides it."
209         }
210         true
211       else
212         log(WARN) {
213           "File '#{ filename }' exists.  #{ $0 } did not override it."
214         }
215         false
216       end
217     else
218       log(INFO) { "Creates file '#{ filename }'." }
219       true
220     end
221   end
222
223   def shbang
224     "#!/usr/bin/env ruby"
225   end
226
227   def create_name(name)
228     name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil
229   end
230
231   def import(location)
232     WSDL::Importer.import(location)
233   end
234 end
235
236 WSDL2RubyApp.new.start
Note: See TracBrowser for help on using the browser.