package org.osgi.impl.bundle.bindex.cli; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedList; import java.util.List; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.Option; import org.kohsuke.args4j.spi.BooleanOptionHandler; import org.osgi.service.indexer.ResourceIndexer; public class CommandLineOptions { public CommandLineOptions() { super(); try { rootURL = new File(System.getProperty("user.dir")).toURI().toURL(); } catch (MalformedURLException e) { throw new ExceptionInInitializerError(e); } } /* * Pretty */ public static final boolean DEFAULT_PRETTY = false; boolean pretty = DEFAULT_PRETTY; @Option(name = "--pretty", handler = BooleanOptionHandler.class, usage = "Non-compressed, indented output. Forces the output filename to " + Index.DEFAULT_FILENAME_UNCOMPRESSED) public void setPretty(boolean pretty) { this.pretty = pretty; if (!pretty) { outputFile = new File(Index.DEFAULT_FILENAME_COMPRESSED); } else { outputFile = new File(Index.DEFAULT_FILENAME_UNCOMPRESSED); } } /* * Output File */ public static final String DEFAULT_OUTPUT_FILENAME = DEFAULT_PRETTY ? Index.DEFAULT_FILENAME_UNCOMPRESSED : Index.DEFAULT_FILENAME_COMPRESSED; @Option(name = "-r", metaVar = "/output/file/index.xml(.gz)", usage = "Output file name " + "(default = " + Index.DEFAULT_FILENAME_COMPRESSED + " for normal output, " + Index.DEFAULT_FILENAME_UNCOMPRESSED + " for pretty output)") File outputFile = new File(DEFAULT_OUTPUT_FILENAME); /* * Repository Name */ public static final String DEFAULT_REPOSITORY_NAME = ResourceIndexer.REPOSITORYNAME_DEFAULT; @Option(name = "-n", metaVar = "RepositoryName", usage = "Repository name (default = " + DEFAULT_REPOSITORY_NAME + ")") String repositoryName = DEFAULT_REPOSITORY_NAME; /* * Known Bundles Properties File */ @Option(name = "-k", metaVar = "/known/bundles.properties", usage = "Load extra known-bundles data from file (default = none)") File knownBundlePropertiesFile = null; /* * Override Built-In Known Bundles */ public static final boolean DEFAULT_OVERRIDE_BUILTIN_KNOWN_BUNDLES = false; @Option(name = "-K", handler = BooleanOptionHandler.class, usage = "Override built-in known-bundles data") boolean overrideBuiltinKnownBundles = DEFAULT_OVERRIDE_BUILTIN_KNOWN_BUNDLES; /* * Resource URL Template */ public static final String DEFAULT_RESOURCE_URL_TEMPLATE = "%p%f"; @Option(name = "-t", metaVar = DEFAULT_RESOURCE_URL_TEMPLATE, usage = "Resource URL template. Use %s for symbolic name, %v for version, %f for filename and %p for dirpath (default = " + DEFAULT_RESOURCE_URL_TEMPLATE + ")") String resourceUrlTemplate = DEFAULT_RESOURCE_URL_TEMPLATE; /* * Root Directory */ URL rootURL = null; @Option(name = "-d", metaVar = "/root/dir", usage = "Root directory " + "(default = the current directory)") public void setRootURL(File rootURL) throws MalformedURLException, IOException { if (!rootURL.isDirectory()) { throw new IOException(rootURL + " is not a directory"); } this.rootURL = rootURL.toURI().normalize().toURL(); /* make sure the URL ends with a slash */ String rootURLString = this.rootURL.toString(); if (!rootURLString.endsWith("/")) { this.rootURL = new URL(rootURLString + "/"); } } /* * License URL */ @Option(name = "-l", metaVar = "file:license.html", usage = "License file " + "(default = none)") URL licenseURL = null; /* * Verbose */ public static final boolean DEFAULT_VERBOSE = false; @Option(name = "-v", handler = BooleanOptionHandler.class, usage = "Verbose reporting") boolean verbose = DEFAULT_VERBOSE; /* * Stylesheet URL */ @Option(name = "-stylesheet", metaVar = "http://some/url.xsl", usage = "Stylesheet URL, for example: http://bnd.bndtools.org/static/obr2html.xsl (default = none)") URL stylesheetURL = null; /* * Increment Override */ public static final boolean DEFAULT_NOINCREMENT = false; @Option(name = "--noincrement", handler = BooleanOptionHandler.class, usage = "Increment override") boolean incrementOverride = DEFAULT_NOINCREMENT; /* * File List */ @Argument(metaVar = "<file> [<file>*]", required = false, index = 0, usage = "The directories and/or files to index. Must be specified at least once, can be specified multiple times (default = none)") List<File> fileList = new LinkedList<File>(); /* * Help */ @Option(name = "-h", handler = BooleanOptionHandler.class, usage = "Help") boolean help = false; /* * Utilities */ static void usage(PrintStream out, String programName, CmdLineParser parser) { out.println(); out.printf("%s [options...] <file> [<file>*]%n", programName); parser.printUsage(out); out.println(); out.printf( "Example: java -jar org.osgi.impl.bundle.repoindex.cli.jar /some/path/with/bundels /some/bundle/file.jar%n"); } }