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

root/branches/1_5/lib/wsdl/soap/wsdl2ruby.rb

Revision 1939, 6.9 kB (checked in by nahi, 1 year ago)
  • added wsdl/soap/classNameCreator and let it handle whole classname creation. and when the same NCName is used in different namespaces, ClassNameCreator? tries to avoid classname crash by adding '_' at the end of classname. it's a dirty workaround for #408 and will be changed in the future.
Line 
1 # WSDL4R - WSDL to ruby mapping library.
2 # Copyright (C) 2000-2007  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 'logger'
10 require 'xsd/qname'
11 require 'wsdl/importer'
12 require 'wsdl/soap/classDefCreator'
13 require 'wsdl/soap/servantSkeltonCreator'
14 require 'wsdl/soap/driverCreator'
15 require 'wsdl/soap/clientSkeltonCreator'
16 require 'wsdl/soap/standaloneServerStubCreator'
17 require 'wsdl/soap/servletStubCreator'
18 require 'wsdl/soap/cgiStubCreator'
19 require 'wsdl/soap/classNameCreator'
20
21
22 module WSDL
23 module SOAP
24
25
26 class WSDL2Ruby
27   attr_accessor :location
28   attr_reader :opt
29   attr_accessor :logger
30   attr_accessor :basedir
31
32   def run
33     unless @location
34       raise RuntimeError, "WSDL location not given"
35     end
36     @wsdl = import(@location)
37     if @opt['classdef']
38       @name = @opt['classdef']
39     else
40       @name = @wsdl.name ? @wsdl.name.name : 'default'
41     end
42     create_file
43   end
44
45 private
46
47   def initialize
48     @modulepath = nil
49     @location = nil
50     @opt = {}
51     @logger = Logger.new(STDERR)
52     @basedir = nil
53     @wsdl = nil
54     @name = nil
55     @classdef_filename = nil
56     @mr_filename = nil
57     @name_creator = ClassNameCreator.new
58   end
59
60   def create_file
61     @modulepath = @opt['module_path']
62     create_classdef if @opt.key?('classdef')
63     create_mapping_registry if @opt.key?('mapping_registry')
64     create_servant_skelton(@opt['servant_skelton']) if @opt.key?('servant_skelton')
65     create_cgi_stub(@opt['cgi_stub']) if @opt.key?('cgi_stub')
66     create_standalone_server_stub(@opt['standalone_server_stub']) if @opt.key?('standalone_server_stub')
67     create_servlet_stub(@opt['servlet_stub']) if @opt.key?('servlet_stub')
68     create_driver(@opt['driver'], @opt['drivername_postfix'] || '') if @opt.key?('driver')
69     create_client_skelton(@opt['client_skelton']) if @opt.key?('client_skelton')
70   end
71
72   def create_classdef
73     @logger.info { "Creating class definition." }
74     @classdef_filename = @name + '.rb'
75     check_file(@classdef_filename) or return
76     write_file(@classdef_filename) do |f|
77       f << WSDL::SOAP::ClassDefCreator.new(@wsdl, @name_creator, @modulepath).dump
78     end
79   end
80
81   def create_mapping_registry
82     @logger.info { "Creating mapping registry definition." }
83     @mr_filename = @name + 'MappingRegistry.rb'
84     check_file(@mr_filename) or return
85     write_file(@mr_filename) do |f|
86       f << "require '#{@classdef_filename}'\n" if @classdef_filename
87       f << WSDL::SOAP::MappingRegistryCreator.new(@wsdl, @name_creator, @modulepath).dump
88     end
89   end
90
91   def create_client_skelton(servicename)
92     return if @wsdl.services.empty?
93     @logger.info { "Creating client skelton." }
94     servicename ||= @wsdl.services[0].name.name
95     @client_skelton_filename = servicename + 'Client.rb'
96     check_file(@client_skelton_filename) or return
97     write_file(@client_skelton_filename) do |f|
98       f << shbang << "\n"
99       f << "require '#{@driver_filename}'\n\n" if @driver_filename
100       f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl, @name_creator, @modulepath).dump(create_name(servicename))
101     end
102   end
103
104   def create_servant_skelton(porttypename)
105     @logger.info { "Creating servant skelton." }
106     @servant_skelton_filename = (porttypename || @name + 'Servant') + '.rb'
107     check_file(@servant_skelton_filename) or return
108     write_file(@servant_skelton_filename) do |f|
109       f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
110       f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl, @name_creator, @modulepath).dump(create_name(porttypename))
111     end
112   end
113
114   def create_cgi_stub(servicename)
115     @logger.info { "Creating CGI stub." }
116     servicename ||= @wsdl.services[0].name.name
117     @cgi_stubFilename = servicename + '.cgi'
118     check_file(@cgi_stubFilename) or return
119     write_file(@cgi_stubFilename) do |f|
120       f << shbang << "\n"
121       f << "require '#{@servant_skelton_filename}'\n" if @servant_skelton_filename
122       f << "require '#{@mr_filename}'\n" if @mr_filename
123       f << WSDL::SOAP::CGIStubCreator.new(@wsdl, @name_creator, @modulepath).dump(create_name(servicename))
124     end
125   end
126
127   def create_standalone_server_stub(servicename)
128     @logger.info { "Creating standalone stub." }
129     servicename ||= @wsdl.services[0].name.name
130     @standalone_server_stub_filename = servicename + '.rb'
131     check_file(@standalone_server_stub_filename) or return
132     write_file(@standalone_server_stub_filename) do |f|
133       f << shbang << "\n"
134       f << "require '#{@servant_skelton_filename}'\n" if @servant_skelton_filename
135       f << "require '#{@mr_filename}'\n" if @mr_filename
136       f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl, @name_creator, @modulepath).dump(create_name(servicename))
137     end
138   end
139
140   def create_servlet_stub(servicename)
141     @logger.info { "Creating servlet stub." }
142     servicename ||= @wsdl.services[0].name.name
143     @servlet_stub_filename = servicename + 'Servlet.rb'
144     check_file(@servlet_stub_filename) or return
145     write_file(@servlet_stub_filename) do |f|
146       f << shbang << "\n"
147       f << "require '#{@servant_skelton_filename}'\n" if @servant_skelton_filename
148       f << "require '#{@mr_filename}'\n" if @mr_filename
149       f << WSDL::SOAP::ServletStubCreator.new(@wsdl, @name_creator, @modulepath).dump(create_name(servicename))
150     end
151   end
152
153   def create_driver(porttypename, drivername_postfix)
154     @logger.info { "Creating driver." }
155     @driver_filename = (porttypename || @name) + 'Driver.rb'
156     creator = WSDL::SOAP::DriverCreator.new(@wsdl, @name_creator, @modulepath)
157     creator.drivername_postfix = drivername_postfix
158     check_file(@driver_filename) or return
159     write_file(@driver_filename) do |f|
160       f << "require '#{@classdef_filename}'\n" if @classdef_filename
161       f << "require '#{@mr_filename}'\n" if @mr_filename
162       f << creator.dump(create_name(porttypename))
163     end
164   end
165
166   def write_file(filename)
167     if @basedir
168       filename = File.join(basedir, filename)
169     end
170     File.open(filename, "w") do |f|
171       yield f
172     end
173   end
174
175   def check_file(filename)
176     if @basedir
177       filename = File.join(basedir, filename)
178     end
179     if FileTest.exist?(filename)
180       if @opt.key?('force')
181         @logger.warn {
182           "File '#{filename}' exists but overrides it."
183         }
184         true
185       else
186         @logger.warn {
187           "File '#{filename}' exists.  #{$0} did not override it."
188         }
189         false
190       end
191     else
192       @logger.info { "Creates file '#{filename}'." }
193       true
194     end
195   end
196
197   def shbang
198     "#!/usr/bin/env ruby"
199   end
200
201   def create_name(name)
202     name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil
203   end
204
205   def import(location)
206     WSDL::Importer.import(location)
207   end
208 end
209
210
211 end
212 end
213
214
215 if __FILE__ == $0
216   warn("WARNING: #{File.expand_path(__FILE__)} is a library file used by bin/wsdl2ruby.rb.  Find bin/wsdl2ruby.rb from tarball version of soap4r or install soap4r via gem.")
217 end
Note: See TracBrowser for help on using the browser.