# Copyright 2014 Red Hat, Inc, and individual contributors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. require 'torquebox-core' module TorqueBox class CLI class War < Jar def usage_parameters "[options] [rackup_file]" end def option_defaults super.merge(:war_name => "#{File.basename(Dir.pwd)}.war") end def available_options super .reject { |v| v[:name] == :jar_name } .unshift(:name => :war_name, :switch => '--name NAME', :description => "Name of the war file (default: #{option_defaults[:war_name]})") .push(:name => :resource_paths, :switch => '--resource-paths PATHS', :description => "Paths whose contents will be included at the top-level of the war\ (default: none)", :type => Array) .push(:name => :context_path, :switch => '--context-path PATH', :description => "Deploys the war to the given context path (default: the name of\ the war)") .push(:name => :virtual_host, :switch => '--virtual-host HOST', :description => "Deploys the war to the named host defined in the WildFly config\ (default: none)") .push(:name => :env, :switch => '--env ENVIRONMENT', :short => '-e', :description => "Environment to run under (default: development)") end def run(argv, options) unless argv.empty? options[:rackup] = argv.shift end options = option_defaults.merge(options) process_env(options) jar_options = options.dup jar_options.delete(:destination) jar_path = super(argv, jar_options) begin war_path = File.expand_path(File.join(options[:destination], options[:war_name])) war_builder = org.torquebox.core.JarBuilder.new (options[:resource_paths] || []).each do |path| @logger.info("Copying contents of {} to war", path) add_files(war_builder, :file_prefix => path, :pattern => "**/*") end add_main(war_builder) add_web_xml(war_builder) add_jboss_deployment_structure_xml(war_builder) add_jboss_web_xml(war_builder, options) war_builder.add_file("WEB-INF/lib/app.jar", jar_path) if File.exist?(war_path) @logger.info("Removing {}", war_path) FileUtils.rm_f(war_path) end @logger.info("Writing {}", war_path) war_builder.create(war_path) ensure @logger.info("Removing {}", jar_path) FileUtils.rm_f(jar_path) end end protected def process_env(options) if options[:env] options[:envvar] ||= {} options[:envvar]['RACK_ENV'] = options[:env] options[:envvar]['RAILS_ENV'] = options[:env] end end def add_main(war_builder) war_builder.add_manifest_attribute("Main-Class", "org.torquebox.core.TorqueBoxWarMain") main_class = org.torquebox.core.TorqueBoxWarMain.java_class main_path = main_class.name.gsub(".", "/") + ".class" war_builder.add_resource(main_path, main_path) end def add_web_xml(war_builder) unless war_builder.has_entry('WEB-INF/web.xml') war_builder.add_string('WEB-INF/web.xml', read_base_xml('web.xml')) end end def add_jboss_deployment_structure_xml(war_builder) unless war_builder.has_entry('WEB-INF/jboss-deployment-structure.xml') war_builder.add_string('WEB-INF/jboss-deployment-structure.xml', read_base_xml('jboss-deployment-structure.xml')) end end def add_jboss_web_xml(war_builder, options) jboss_web = 'WEB-INF/jboss-web.xml' context_path = options[:context_path] virtual_host = options[:virtual_host] if context_path || virtual_host if war_builder.has_entry(jboss_web) @logger.warn("context-path or virtual-host specified, but a #{jboss_web} exists in\ resource-paths. Ignoring options.") else root_el = context_path ? " #{context_path}\n" : '' host_el = virtual_host ? " #{virtual_host}\n" : '' war_builder.add_string(jboss_web, "\n#{root_el}#{host_el}") end end end def read_base_xml(name) java.lang.Thread.current_thread .context_class_loader .resource_as_string("base-xml/#{name}") end end end end TorqueBox::CLI.register_extension('war', TorqueBox::CLI::War.new, 'Create a deployable war from an application')