| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| |
| package org.apache.felix.ipojo.task; |
| |
| import static java.lang.String.format; |
| |
| import org.apache.commons.cli.*; |
| import org.apache.felix.ipojo.manipulator.Pojoization; |
| import org.apache.felix.ipojo.manipulator.util.Constants; |
| |
| import java.io.File; |
| import java.util.List; |
| |
| /** |
| * A command line tools to manipulate iPOJO bundles. |
| * It can be used as follow: |
| * <code>java -jar this-jar.jar --input the-jar-to-manipulate</code><br/> |
| * <code>java -jar this-jar.jar --input the-jar-to-manipulate --output the-output-jar</code><br/> |
| * <code>java -jar this-jar.jar --input the-jar-to-manipulate --metadata the-xml-metadata</code><br/> |
| */ |
| public class IPojoc { |
| |
| /** |
| * Input file to be manipulated. |
| */ |
| private File m_input; |
| |
| /** |
| * Output file (temporary or not). |
| */ |
| private File m_output; |
| |
| /** |
| * Metadata file (may be null). |
| */ |
| private File m_metadata; |
| |
| /** |
| * Manipulator. |
| */ |
| private Pojoization m_pojoization; |
| |
| /** |
| * The main entry point |
| * @param args the arguments |
| */ |
| public static void main(String[] args) { |
| Options options = buildOptions(); |
| CommandLine cmd = null; |
| try { |
| cmd = buildCommandLine(args, options); |
| if (cmd.hasOption('h')) { |
| printHelp(options); |
| } else { |
| IPojoc compiler = new IPojoc(); |
| compiler.execute(cmd); |
| } |
| } catch (MissingOptionException e) { |
| for (String opt : (List<String>) e.getMissingOptions()) { |
| System.err.println("The '" + opt + "' option is missing"); |
| } |
| printHelp(options); |
| } catch (MissingArgumentException e) { |
| System.err.println("The option '" + e.getOption() + "' requires an argument"); |
| printHelp(options); |
| } catch (Exception e) { |
| System.out.printf("Manipulation failed: %s%n", e.getMessage()); |
| if ((cmd != null) && cmd.hasOption('X')) { |
| e.printStackTrace(System.out); |
| } else { |
| System.out.printf("Use -X option to print the full stack trace%n"); |
| } |
| } |
| } |
| |
| private static CommandLine buildCommandLine(final String[] args, final Options options) throws ParseException { |
| CommandLineParser parser = new GnuParser(); |
| return parser.parse(options, args); |
| } |
| |
| /** |
| * The command line is valid, to processing the command line. |
| * @param cmd the command line |
| * @throws ParseException |
| */ |
| private void execute(CommandLine cmd) throws Exception { |
| System.out.printf("iPOJO Manipulation (%s)%n", Constants.getVersion()); |
| System.out.println("-----------------------------------------------"); |
| readInputOption(cmd); |
| readOutputOption(cmd); |
| readMetadataOption(cmd); |
| |
| manipulate(); |
| printStatus(); |
| } |
| |
| private void readMetadataOption(final CommandLine cmd) throws Exception { |
| // Retrieve the metadata file |
| if (cmd.hasOption("m")) { |
| m_metadata = (File) cmd.getParsedOptionValue("m"); |
| if (m_metadata != null && !m_metadata.isFile()) { |
| throw new Exception( |
| format("The metadata option must be an existing file, '%s' does not exist", cmd.getOptionValue('m')) |
| ); |
| } |
| System.out.println("metadata file => " + m_metadata.getAbsolutePath()); |
| } else { |
| System.out.println("metadata file => no metadata file"); |
| } |
| } |
| |
| private void readOutputOption(final CommandLine cmd) throws Exception { |
| // Retrieve output file |
| if (cmd.hasOption("o")) { |
| try { |
| m_output = (File) cmd.getParsedOptionValue("o"); |
| } catch (ParseException pe) { |
| throw new Exception( |
| format("The output option must be an existing file, '%s' does not exist", cmd.getOptionValue('o')) |
| ); |
| } |
| System.out.println("output file => " + m_output.getAbsolutePath()); |
| } else { |
| // Inline replacement |
| // We create a temporary file marked by a __ prefix |
| // It will be substituted upon success. |
| m_output = new File("__" + m_input.getName()); |
| System.out.println("output file => " + m_input.getAbsolutePath()); |
| } |
| } |
| |
| private void readInputOption(final CommandLine cmd) throws Exception { |
| // Check that the input file exist |
| m_input = (File) cmd.getParsedOptionValue("i"); |
| if (m_input == null || !m_input.isFile()) { |
| throw new Exception( |
| format("The input option must be an existing file, '%s' does not exist", cmd.getOptionValue('i')) |
| ); |
| } |
| System.out.println("input file => " + m_input.getAbsolutePath()); |
| } |
| |
| private void manipulate() { |
| m_pojoization = new Pojoization(); |
| m_pojoization.pojoization(m_input, m_output, m_metadata); |
| } |
| |
| private void printStatus() { |
| if (m_pojoization.getErrors().size() != 0) { |
| System.err.println("iPOJO Manipulation failed :"); |
| for (String error : m_pojoization.getErrors()) { |
| System.err.println("\t" + error); |
| } |
| System.exit(-1); |
| } else { |
| System.err.println("iPOJO Manipulation successfully completed."); |
| for (String warning : m_pojoization.getWarnings()) { |
| System.err.println(warning); |
| } |
| cleanup(); |
| System.exit(0); |
| } |
| } |
| |
| /** |
| * Upon success, cleanup temporary files. |
| */ |
| private void cleanup() { |
| if (m_output.getName().startsWith("__")) { |
| m_input.delete(); |
| m_output.renameTo(m_input); |
| } |
| } |
| |
| /** |
| * Print help. |
| * @param options |
| */ |
| private static void printHelp(final Options options) { |
| HelpFormatter formatter = new HelpFormatter(); |
| formatter.printHelp("java -jar org.apache.felix.ipojo.ant-" + Constants.getVersion() + ".jar", options); |
| } |
| |
| /** |
| * Builds the option list |
| * @return the options |
| */ |
| public static Options buildOptions() { |
| Option input = |
| OptionBuilder.withArgName("input file") |
| .withLongOpt("input") |
| .hasArg() |
| .withDescription("the input jar file") |
| .isRequired(true) |
| .withType(File.class) |
| .create('i'); |
| |
| Option output = |
| OptionBuilder |
| .withLongOpt("output") |
| .withArgName("output file") |
| .hasArg() |
| .withDescription("the output jar file, if not set the manipulation replaces the input file") |
| .isRequired(false) |
| .withType(File.class) |
| .create('o'); |
| |
| Option metadata = |
| OptionBuilder |
| .withLongOpt("metadata") |
| .withArgName("metadata file") |
| .hasArg() |
| .withDescription("the XML metadata file") |
| .isRequired(false) |
| .withType(File.class) |
| .create('m'); |
| |
| Option verbose = new Option("X", "exception", false, "print exception stack trace in case of error"); |
| |
| Option help = |
| OptionBuilder.withLongOpt("help").withDescription("print this message").create('h'); |
| |
| return new Options() |
| .addOption(input) |
| .addOption(output) |
| .addOption(metadata) |
| .addOption(verbose) |
| .addOption(help); |
| } |
| } |