module Buildr::Wsgen

Public Class Methods

java2wsdl(project, classnames, options) → String click to toggle source

Uses wsgen to generate wsdl files form annotated, compiled classes. The parameters are

  • :project – The project in which the classes are compiled.

  • :classnames – Either an array of classnames to convert to wsdl or a map keyed on classnames and service

    specific customizations provided.

Service options include:

  • :service_name – The name of the service.

  • :namespace_url – The namespace of the service.

Method options include:

  • :output_dir – The target directory.

  • :namespace_url – The default namespace for the services.

For example:

Buildr::Wsgen.java2wsdl(project, %w(com.example.MyService))
Buildr::Wsgen.java2wsdl(project, %w(com.example.MyService com.example.MyOtherService))
Buildr::Wsgen.java2wsdl(project, %w(com.example.MyService com.example.MyOtherService), :namespace_url => "http://example.com/services")
Buildr::Wsgen.java2wsdl(project, {"com.example.MyService" => {:service_name => 'MiaService', :namespace_url => "http://example.com/it/services"}))
# File addon/buildr/wsgen.rb, line 41
def java2wsdl(project, classnames, options = {})
  desc 'Generate wsdl from java'
  project.task('java2wsdl').enhance([project.compile.target])

  base_wsdl_dir = File.expand_path(options[:output_dir] || project._(:target, :generated, :wsgen, :main, :wsdl))
  project.iml.main_generated_source_directories << base_wsdl_dir if project.iml?
  project.file(base_wsdl_dir)
  project.task('java2wsdl').enhance([base_wsdl_dir])

  services = classnames.is_a?(Array) ? classnames.inject({}) {|result, element| result[element] = {}; result} : classnames

  services.each_pair do |classname, config|

    name_parts = classname.split('.')
    service_name = config[:service_name] || name_parts.last
    namespace_url = config[:namespace_url] || options[:namespace_url] || "http://#{name_parts[0...-1].reverse.join('.')}"
    wsdl_file = File.expand_path("#{base_wsdl_dir}/META-INF/wsdl/#{service_name}.wsdl")

    project.file(wsdl_file) do
      mkdir_p File.dirname(wsdl_file)
      cp = Buildr.artifacts(project.compile.dependencies + [project.compile.target]).map(&:to_s).join(File::PATH_SEPARATOR)

      java_dir = project._(:target, :ignored, :wsgen, :main, :java)
      intermediate_dir = project._(:target, :ignored, :wsgen, :main, :java)

      rm_rf java_dir
      rm_rf intermediate_dir
      mkdir_p java_dir
      mkdir_p intermediate_dir

      args = []
      args << '-keep'
      args << '-inlineSchemas' if (options[:inlineSchemas] && ENV_JAVA['java.version'] >= '1.7')
      args << '-wsdl'
      args << '-servicename'
      args << "{#{namespace_url}}#{service_name}"
      args << '-portname'
      args << "{#{namespace_url}}#{service_name}Port"
      args << '-d'
      args << intermediate_dir
      args << '-r'
      args << "#{base_wsdl_dir}/META-INF/wsdl"
      args << '-s'
      args << java_dir
      args << '-cp'
      args << cp
      args << classname

      command = "wsgen #{args.join(' ')}"
      trace command
      sh command
      if $? != 0
        raise 'Problem building wsdl'
      end

      content = IO.read(wsdl_file).gsub('REPLACE_WITH_ACTUAL_URL', "http://example.com/#{service_name}")
      File.open(wsdl_file, 'wb') { |f| f.write content }
    end

    project.file(base_wsdl_dir).enhance([wsdl_file])
    project.task('java2wsdl').enhance([wsdl_file])
  end

  base_wsdl_dir
end
wsdl2java(project, wsdls, options) → String click to toggle source

Uses wsgen to generate java files form wsdls. The parameters are

  • :project – The project in which the classes are compiled.

  • :wsdls – A hash of wsdl filenames to service configuration.

Service options include:

  • :service_name – The name of the service.

  • :package – The package in which to generate the code.

  • :extension – Should we allow non-portable extensions.

Method options include:

  • :output_dir – The target directory.

  • :target – The target version for generated source..

  • :package – The default package in which to generate the code.

For example:

Buildr::Wsgen.wsdl2java(project, {_('src/main/wsdl/MyService.wsdl') => {}})
Buildr::Wsgen.wsdl2java(project, {_('src/main/wsdl/MyService.wsdl') => {:package => 'com.example'}})
Buildr::Wsgen.wsdl2java(project, {_('src/main/wsdl/MyService.wsdl') => {:output_dir => _(:target, :wsdl, :java)}})
Buildr::Wsgen.wsdl2java(project, {_('src/main/wsdl/MyService.wsdl') => {}}, :package => 'com.example' )
Buildr::Wsgen.wsdl2java(project, {_('src/main/wsdl/MyService.wsdl') => {}}, :wsdl_location => 'file:META-INF/wsdl/SpecificTaskService.wsdl' )
# File addon/buildr/wsgen.rb, line 130
def wsdl2java(project, wsdls, options = {})
  desc 'Generate java from wsdl'
  project.task('wsdl2java')

  ws_dir = File.expand_path(options[:output_dir] || project._(:target, :generated, 'ws/main/java'))
  project.file(ws_dir)
  project.task('wsdl2java').enhance([ws_dir])

  target = options[:target] || '2.1'

  wsdls.each_pair do |wsdl_file, config|
    pkg = config[:package] || options[:package]
    service = config[:service] || File.basename(wsdl_file, '.wsdl')
    wsdl_location = config[:wsdl_location]
    java_file = "#{ws_dir}/#{pkg.gsub('.', '/')}/#{service}.java"
    project.file(java_file => [project.file(wsdl_file)]) do
      mkdir_p ws_dir
      command = []
      command << 'wsimport'
      command << '-keep'
      command << '-Xnocompile'
      command << '-target'
      command << target
      command << '-s'
      command << ws_dir
      command << '-p'
      command << pkg
      if config[:extension]
        command << '-extension'
      end
      if wsdl_location
        command << '-wsdllocation'
        command << wsdl_location
      end
      command << wsdl_file

      trace command.join(' ')
      output = `#{command.join(' ')}`
      if $? != 0
        rm_rf java_file
        puts output
        raise 'Problem building webservices'
      end
      unless File.exist?(java_file)
        puts output
        raise 'Problem building webservices'
      end
      if output =~ /\[WARNING\]/
        puts output
      end
    end
    project.file(ws_dir).enhance([java_file])
  end

  project.compile.from ws_dir
  project.iml.main_generated_source_directories << ws_dir if project.iml?
  project.compile.enhance(['wsdl2java'])

  ws_dir
end