# WSDL4R - WSDL to ruby mapping library. # Copyright (C) 2002-2005 NAKAMURA, Hiroshi . # This program is copyrighted free software by NAKAMURA, Hiroshi. You can # redistribute it and/or modify it under the same terms of Ruby's license; # either the dual license version in 2003, or any later version. require 'logger' require 'xsd/qname' require 'wsdl/importer' require 'wsdl/soap/classDefCreator' require 'wsdl/soap/servantSkeltonCreator' require 'wsdl/soap/driverCreator' require 'wsdl/soap/clientSkeltonCreator' require 'wsdl/soap/standaloneServerStubCreator' require 'wsdl/soap/cgiStubCreator' require 'wsdl/soap/classNameCreator' module SOAP module MultiService class WSDL2Ruby attr_reader :options, :logger, :basedir Options = [:classdef, :mapping_registry, :driver, :client_skelton, :servant_skelton, :standalone_server_stub, :cgi_stub] def initialize(basedir, force=false, logger=nil) @basedir = basedir @force = force @logger ||= Logger.new(STDERR) @namecreator = WSDL::SOAP::ClassNameCreator.new end def run(location, options={}) @modulepath = (options[:modulepath] || "") @wsdl = import(location) @servicename = @wsdl.services[0].name.name Options.each do |optname| if options.key?(optname) servicename = (options[optname] || @servicename) method("create_#{optname.to_s}".to_sym).call(servicename) end end end private def create_classdef(servicename) @logger.info { "Creating class definition." } @classdef_filename = servicename + '.rb' write_file(@classdef_filename) do |f| f << WSDL::SOAP::ClassDefCreator.new(@wsdl, @namecreator, @modulepath).dump end end def create_mapping_registry(servicename) @logger.info { "Creating mapping registry." } @mapping_registry_filename = servicename + 'MappingRegistry.rb' write_file(@mapping_registry_filename) do |f| f << "require '#{@classdef_filename}'\n" if @classdef_filename f << WSDL::SOAP::MappingRegistryCreator.new(@wsdl, @namecreator, @modulepath).dump end end def create_driver(servicename) @logger.info { "Creating driver." } @driver_filename = servicename + 'Driver.rb' write_file(@driver_filename) do |f| f << "require '#{@classdef_filename}'\n\n" if @classdef_filename f << WSDL::SOAP::DriverCreator.new(@wsdl, @namecreator, @modulepath).dump(create_name(servicename)) end end def create_client_skelton(servicename) @logger.info { "Creating client skelton." } @client_skelton_filename = servicename + 'Client.rb' write_file(@client_skelton_filename) do |f| f << shbang << "\n" f << "require '#{@driver_filename}'\n\n" if @driver_filename f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl, @namecreator, @modulepath).dump( create_name(servicename)) end end def create_servant_skelton(servicename) @logger.info { "Creating servant skelton." } @servant_skelton_filename = servicename + 'Servant' + '.rb' write_file(@servant_skelton_filename) do |f| f << "require '#{@classdef_filename}'\n\n" if @classdef_filename f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl, @namecreator, @modulepath).dump( create_name(servicename)) end end def create_cgi_stub(servicename=nil) @logger.info { "Creating CGI stub." } @cgi_stubFilename = servicename + '.cgi' write_file(@cgi_stubFilename) do |f| f << shbang << "\n" if @servant_skelton_filename f << "require '#{@servant_skelton_filename}'\n\n" end f << WSDL::SOAP::CGIStubCreator.new(@wsdl, @namecreator, @modulepath).dump(create_name(servicename)) end end def create_standalone_server_stub(servicename=nil) @logger.info { "Creating standalone stub." } @standalone_server_stub_filename = servicename + '.rb' write_file(@standalone_server_stub_filename) do |f| f << shbang << "\n" f << "require '#{@servant_skelton_filename}'\n\n" if @servant_skelton_filename f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl, @namecreator, @modulepath).dump( create_name(servicename)) end end def write_file(filename) check_file(filename) or return if @basedir filename = File.join(basedir, filename) end File.open(filename, "w") do |f| yield f end end def check_file(filename) if @basedir filename = File.join(basedir, filename) end if FileTest.exist?(filename) if @force @logger.warn { "File '#{filename}' exists but overrides it." } true else @logger.warn { "File '#{filename}' exists. #{$0} did not override it." } false end else @logger.info { "Creates file '#{filename}'." } true end end def shbang "#!/usr/bin/env ruby" end def create_name(name) name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil end def import(location) WSDL::Importer.import(location) end end end end