diff options
author | Jason van Zyl <jvanzyl@apache.org> | 2006-11-19 04:42:34 +0000 |
---|---|---|
committer | Jason van Zyl <jvanzyl@apache.org> | 2006-11-19 04:42:34 +0000 |
commit | 16851b5a14b8ff9cf766a7cfab86c7df05a24bf6 (patch) | |
tree | dc7cdc50ca38ccb492bc631c3bd74c3209a8420f /archiva-cli | |
parent | a45320f77c38d583565811c191703662e25d1531 (diff) | |
download | archiva-16851b5a14b8ff9cf766a7cfab86c7df05a24bf6.tar.gz archiva-16851b5a14b8ff9cf766a7cfab86c7df05a24bf6.zip |
o creating an interface for a tool that generally runs plexus components from a CLI interface
I will try and merge this with John's CLIng, but this assumes everything is in the classpath already
and doesn't use a Maven repository like CLIng. I'm just create 4-5 different CLI interfaces for Plexus
stuff and I'm getting tired of doing the same thing over and over again.
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@476704 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'archiva-cli')
4 files changed, 561 insertions, 499 deletions
diff --git a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/AbstractCli.java b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/AbstractCli.java new file mode 100644 index 000000000..7e7c40dba --- /dev/null +++ b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/AbstractCli.java @@ -0,0 +1,446 @@ +package org.apache.maven.archiva.cli; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.GnuParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.codehaus.classworlds.ClassWorld; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; + +import javax.naming.OperationNotSupportedException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +/** + * @author jason van zyl + * @version $Id$ + * @noinspection UseOfSystemOutOrSystemErr,ACCESS_STATIC_VIA_INSTANCE + */ +public abstract class AbstractCli + implements Cli +{ + // ---------------------------------------------------------------------------- + // These are standard options that we would want to use for all our projects. + // ---------------------------------------------------------------------------- + + public static final char QUIET = 'q'; + + public static final char DEBUG = 'X'; + + public static final char ERRORS = 'e'; + + public static final char HELP = 'h'; + + public static final char VERSION = 'v'; + + public static final char SET_SYSTEM_PROPERTY = 'D'; + + // ---------------------------------------------------------------------------- + // Abstract methods + // ---------------------------------------------------------------------------- + + protected static Cli getCli() + { + throw new UnsupportedOperationException( "You must implement this getCli() in your subclass." ); + } + + protected abstract Options buildOptions( Options options ); + + protected abstract void processOptions( CommandLine cli, + PlexusContainer container ) + throws Exception; + + protected abstract String getPomPropertiesPath(); + + // ---------------------------------------------------------------------------- + // + // ---------------------------------------------------------------------------- + + public static void main( String[] args ) + { + ClassWorld classWorld = new ClassWorld( "plexus.core", Thread.currentThread().getContextClassLoader() ); + + int result = main( args, classWorld ); + + System.exit( result ); + } + + /** + * @noinspection ConfusingMainMethod + */ + public static int main( String[] args, + ClassWorld classWorld ) + { + return getCli().execute( args, classWorld ); + } + + public int execute( String[] args, + ClassWorld classWorld ) + { + CommandLine cli; + + try + { + cli = parse( args ); + } + catch ( ParseException e ) + { + System.err.println( "Unable to parse command line options: " + e.getMessage() ); + + displayHelp(); + + return 1; + } + + if ( System.getProperty( "java.class.version", "44.0" ).compareTo( "48.0" ) < 0 ) + { + System.err.println( "Sorry, but JDK 1.4 or above is required to execute Maven" ); + + System.err.println( + "You appear to be using Java version: " + System.getProperty( "java.version", "<unknown>" ) ); + + return 1; + } + + boolean debug = cli.hasOption( DEBUG ); + + boolean quiet = !debug && cli.hasOption( QUIET ); + + boolean showErrors = debug || cli.hasOption( ERRORS ); + + if ( showErrors ) + { + System.out.println( "+ Error stacktraces are turned on." ); + } + + // ---------------------------------------------------------------------------- + // Logging + // ---------------------------------------------------------------------------- + + int loggingLevel; + + if ( debug ) + { + loggingLevel = 0; + } + else if ( quiet ) + { + loggingLevel = 0; + } + else + { + loggingLevel = 0; + } + + // ---------------------------------------------------------------------- + // Process particular command line options + // ---------------------------------------------------------------------- + + if ( cli.hasOption( HELP ) ) + { + displayHelp(); + + return 0; + } + + if ( cli.hasOption( VERSION ) ) + { + showVersion(); + + return 0; + } + else if ( debug ) + { + showVersion(); + } + + // ---------------------------------------------------------------------------- + // This is what we will generalize for the invocation of the command line. + // ---------------------------------------------------------------------------- + + try + { + PlexusContainer plexus = new DefaultPlexusContainer( "plexus.core", classWorld ); + + processOptions( cli, plexus ); + } + catch ( PlexusContainerException e ) + { + showFatalError( "Cannot create Plexus container.", e, true ); + } + catch ( ComponentLookupException e ) + { + showError( "Cannot lookup application component.", e, true ); + } + catch ( Exception e ) + { + showError( "Problem executing command line.", e, true ); + } + + return 0; + } + + protected int showFatalError( String message, + Exception e, + boolean show ) + { + System.err.println( "FATAL ERROR: " + message ); + + if ( show ) + { + System.err.println( "Error stacktrace:" ); + + e.printStackTrace(); + } + else + { + System.err.println( "For more information, run with the -e flag" ); + } + + return 1; + } + + protected void showError( String message, + Exception e, + boolean show ) + { + System.err.println( message ); + + if ( show ) + { + System.err.println( "Error stacktrace:" ); + + e.printStackTrace(); + } + } + + // Need to get the versions of the application in a general way, so that I need a way to get the + // specifics of the application so that I can do this in a general way. + private void showVersion() + { + InputStream resourceAsStream; + try + { + Properties properties = new Properties(); + + resourceAsStream = AbstractCli.class.getClassLoader().getResourceAsStream( getPomPropertiesPath() ); + + properties.load( resourceAsStream ); + + if ( properties.getProperty( "builtOn" ) != null ) + { + System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) + " built on " + + properties.getProperty( "builtOn" ) ); + } + else + { + System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) ); + } + } + catch ( IOException e ) + { + System.err.println( "Unable determine version from JAR file: " + e.getMessage() ); + } + } + + // ---------------------------------------------------------------------- + // System properties handling + // ---------------------------------------------------------------------- + + private Properties getExecutionProperties( CommandLine commandLine ) + { + Properties executionProperties = new Properties(); + + // ---------------------------------------------------------------------- + // Options that are set on the command line become system properties + // and therefore are set in the session properties. System properties + // are most dominant. + // ---------------------------------------------------------------------- + + if ( commandLine.hasOption( SET_SYSTEM_PROPERTY ) ) + { + String[] defStrs = commandLine.getOptionValues( SET_SYSTEM_PROPERTY ); + + for ( int i = 0; i < defStrs.length; ++i ) + { + setCliProperty( defStrs[i], executionProperties ); + } + } + + executionProperties.putAll( System.getProperties() ); + + return executionProperties; + } + + private void setCliProperty( String property, + Properties executionProperties ) + { + String name; + + String value; + + int i = property.indexOf( "=" ); + + if ( i <= 0 ) + { + name = property.trim(); + + value = "true"; + } + else + { + name = property.substring( 0, i ).trim(); + + value = property.substring( i + 1 ).trim(); + } + + executionProperties.setProperty( name, value ); + + // ---------------------------------------------------------------------- + // I'm leaving the setting of system properties here as not to break + // the SystemPropertyProfileActivator. This won't harm embedding. jvz. + // ---------------------------------------------------------------------- + + System.setProperty( name, value ); + } + + private Options options; + + public Options buildOptions() + { + options = new Options(); + + return buildOptions( options ); + } + + public CommandLine parse( String[] args ) + throws ParseException + { + // We need to eat any quotes surrounding arguments... + String[] cleanArgs = cleanArgs( args ); + + CommandLineParser parser = new GnuParser(); + + return parser.parse( buildOptions(), cleanArgs ); + } + + private static String[] cleanArgs( String[] args ) + { + List cleaned = new ArrayList(); + + StringBuffer currentArg = null; + + for ( int i = 0; i < args.length; i++ ) + { + String arg = args[i]; + + boolean addedToBuffer = false; + + if ( arg.startsWith( "\"" ) ) + { + // if we're in the process of building up another arg, push it and start over. + // this is for the case: "-Dfoo=bar "-Dfoo2=bar two" (note the first unterminated quote) + if ( currentArg != null ) + { + cleaned.add( currentArg.toString() ); + } + + // start building an argument here. + currentArg = new StringBuffer( arg.substring( 1 ) ); + + addedToBuffer = true; + } + + // this has to be a separate "if" statement, to capture the case of: "-Dfoo=bar" + if ( arg.endsWith( "\"" ) ) + { + String cleanArgPart = arg.substring( 0, arg.length() - 1 ); + + // if we're building an argument, keep doing so. + if ( currentArg != null ) + { + // if this is the case of "-Dfoo=bar", then we need to adjust the buffer. + if ( addedToBuffer ) + { + currentArg.setLength( currentArg.length() - 1 ); + } + // otherwise, we trim the trailing " and append to the buffer. + else + { + // TODO: introducing a space here...not sure what else to do but collapse whitespace + currentArg.append( ' ' ).append( cleanArgPart ); + } + + // we're done with this argument, so add it. + cleaned.add( currentArg.toString() ); + } + else + { + // this is a simple argument...just add it. + cleaned.add( cleanArgPart ); + } + + // the currentArg MUST be finished when this completes. + currentArg = null; + + continue; + } + + // if we haven't added this arg to the buffer, and we ARE building an argument + // buffer, then append it with a preceding space...again, not sure what else to + // do other than collapse whitespace. + // NOTE: The case of a trailing quote is handled by nullifying the arg buffer. + if ( !addedToBuffer ) + { + // append to the argument we're building, collapsing whitespace to a single space. + if ( currentArg != null ) + { + currentArg.append( ' ' ).append( arg ); + } + // this is a loner, just add it directly. + else + { + cleaned.add( arg ); + } + } + } + + // clean up. + if ( currentArg != null ) + { + cleaned.add( currentArg.toString() ); + } + + int cleanedSz = cleaned.size(); + String[] cleanArgs = null; + + if ( cleanedSz == 0 ) + { + // if we didn't have any arguments to clean, simply pass the original array through + cleanArgs = args; + } + else + { + cleanArgs = (String[]) cleaned.toArray( new String[cleanedSz] ); + } + + return cleanArgs; + } + + public void displayHelp() + { + System.out.println(); + + HelpFormatter formatter = new HelpFormatter(); + + formatter.printHelp( "mvn [options] [<goal(s)>] [<phase(s)>]", "\nOptions:", options, "\n" ); + } +} diff --git a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/ArchivaCli.java b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/ArchivaCli.java new file mode 100644 index 000000000..39c817719 --- /dev/null +++ b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/ArchivaCli.java @@ -0,0 +1,104 @@ +package org.apache.maven.archiva.cli; + +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.util.StringUtils; +import org.apache.maven.archiva.Archiva; +import org.apache.maven.archiva.discoverer.DiscovererException; +import org.apache.maven.archiva.converter.RepositoryConversionException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.OptionBuilder; +import org.apache.commons.cli.Options; + +import java.util.Properties; +import java.util.List; +import java.util.Arrays; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.File; + +/** + * @author Jason van Zyl + */ +public class ArchivaCli + extends AbstractCli +{ + public static final char CONVERT = 'c'; + + public static final String SOURCE_REPO_PATH = "sourceRepositoryPath"; + + public static final String TARGET_REPO_PATH = "targetRepositoryPath"; + + public static final String BLACKLISTED_PATTERNS = "blacklistPatterns"; + + // ---------------------------------------------------------------------------- + // + // ---------------------------------------------------------------------------- + + protected static Cli getCli() + { + return new ArchivaCli(); + } + + protected String getPomPropertiesPath() + { + return "META-INF/maven/org.apache.maven/maven-core/pom.properties"; + } + + protected Options buildOptions( Options options ) + { + options.addOption( OptionBuilder.withLongOpt( "convert" ).hasArg().withDescription( + "Convert a legacy Maven 1.x repository to a Maven 2.x repository using a properties file to describe the conversion." ) + .create( CONVERT ) ); + + return options; + } + + public void processOptions( CommandLine cli, + PlexusContainer plexus ) + throws Exception + { + Archiva archiva = (Archiva) plexus.lookup( Archiva.ROLE ); + + if ( cli.hasOption( CONVERT ) ) + { + Properties p = new Properties(); + + try + { + p.load( new FileInputStream( cli.getOptionValue( CONVERT ) ) ); + } + catch ( IOException e ) + { + showFatalError( "Cannot find properties file which describes the conversion.", e, true ); + } + + File oldRepositoryPath = new File( p.getProperty( SOURCE_REPO_PATH ) ); + + File newRepositoryPath = new File( p.getProperty( TARGET_REPO_PATH ) ); + + System.out.println( "Converting " + oldRepositoryPath + " to " + newRepositoryPath ); + + List blacklistedPatterns = null; + + String s = p.getProperty( BLACKLISTED_PATTERNS ); + + if ( s != null ) + { + blacklistedPatterns = Arrays.asList( StringUtils.split( s, "," ) ); + } + + try + { + archiva.convertLegacyRepository( oldRepositoryPath, newRepositoryPath, blacklistedPatterns, true ); + } + catch ( RepositoryConversionException e ) + { + showFatalError( "Error converting repository.", e, true ); + } + catch ( DiscovererException e ) + { + showFatalError( "Error discovery artifacts to convert.", e, true ); + } + } + } +} diff --git a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/Cli.java b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/Cli.java index 54fd456d1..6125455e0 100644 --- a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/Cli.java +++ b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/Cli.java @@ -1,339 +1,23 @@ package org.apache.maven.archiva.cli; -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * 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. - */ - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.ParseException; -import org.apache.maven.archiva.Archiva; -import org.apache.maven.archiva.discoverer.DiscovererException; -import org.apache.maven.archiva.converter.RepositoryConversionException; import org.codehaus.classworlds.ClassWorld; import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.DefaultPlexusContainer; -import org.codehaus.plexus.PlexusContainerException; -import org.codehaus.plexus.util.StringUtils; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; - -import java.io.IOException; -import java.io.InputStream; -import java.io.File; -import java.io.FileInputStream; -import java.util.Properties; -import java.util.List; -import java.util.Arrays; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.CommandLine; /** - * @author jason van zyl - * @version $Id$ - * @noinspection UseOfSystemOutOrSystemErr,ACCESS_STATIC_VIA_INSTANCE - * @todo complete separate out the general cli processing - * @todo create a simple component to do the invocation + * @author Jason van Zyl */ -public class Cli +public interface Cli { - public static final String SOURCE_REPO_PATH = "sourceRepositoryPath"; - - public static final String TARGET_REPO_PATH = "targetRepositoryPath"; - - public static final String BLACKLISTED_PATTERNS = "blacklistPatterns"; - - public static void main( String[] args ) - { - ClassWorld classWorld = new ClassWorld( "plexus.core", Thread.currentThread().getContextClassLoader() ); - - int result = main( args, classWorld ); - - System.exit( result ); - } - - /** - * @noinspection ConfusingMainMethod - */ - public static int main( String[] args, - ClassWorld classWorld ) - { - // ---------------------------------------------------------------------- - // Setup the command line parser - // ---------------------------------------------------------------------- - - CliManager cliManager = new CliManager(); - - CommandLine cli; - - try - { - cli = cliManager.parse( args ); - } - catch ( ParseException e ) - { - System.err.println( "Unable to parse command line options: " + e.getMessage() ); - - cliManager.displayHelp(); - - return 1; - } - - if ( System.getProperty( "java.class.version", "44.0" ).compareTo( "48.0" ) < 0 ) - { - System.err.println( "Sorry, but JDK 1.4 or above is required to execute Maven" ); - - System.err.println( - "You appear to be using Java version: " + System.getProperty( "java.version", "<unknown>" ) ); - - return 1; - } - - boolean debug = cli.hasOption( CliManager.DEBUG ); - - boolean quiet = !debug && cli.hasOption( CliManager.QUIET ); - - boolean showErrors = debug || cli.hasOption( CliManager.ERRORS ); - - if ( showErrors ) - { - System.out.println( "+ Error stacktraces are turned on." ); - } - - // ---------------------------------------------------------------------------- - // Logging - // ---------------------------------------------------------------------------- - - int loggingLevel; - - if ( debug ) - { - loggingLevel = 0; //MavenExecutionRequest.LOGGING_LEVEL_DEBUG; - } - else if ( quiet ) - { - loggingLevel = 0; //MavenExecutionRequest.LOGGING_LEVEL_ERROR; - } - else - { - loggingLevel = 0; //MavenExecutionRequest.LOGGING_LEVEL_INFO; - } - - // ---------------------------------------------------------------------- - // Process particular command line options - // ---------------------------------------------------------------------- - - if ( cli.hasOption( CliManager.HELP ) ) - { - cliManager.displayHelp(); - - return 0; - } - - if ( cli.hasOption( CliManager.VERSION ) ) - { - showVersion(); - - return 0; - } - else if ( debug ) - { - showVersion(); - } - - // ---------------------------------------------------------------------------- - // This is what we will generalize for the invocation of the command line. - // ---------------------------------------------------------------------------- - - try - { - PlexusContainer plexus = new DefaultPlexusContainer( "plexus.core", classWorld ); - - Archiva archiva = (Archiva) plexus.lookup( Archiva.ROLE ); - - if ( cli.hasOption( CliManager.CONVERT ) ) - { - Properties p = new Properties(); - - try - { - p.load( new FileInputStream( cli.getOptionValue( CliManager.CONVERT ) ) ); - } - catch ( IOException e ) - { - showFatalError( "Cannot find properties file which describes the conversion.", e, true ); - } - - File oldRepositoryPath = new File( p.getProperty( SOURCE_REPO_PATH ) ); - - File newRepositoryPath = new File( p.getProperty( TARGET_REPO_PATH ) ); - - System.out.println( "Converting " + oldRepositoryPath + " to " + newRepositoryPath ); - - List blacklistedPatterns = null; - - String s = p.getProperty( BLACKLISTED_PATTERNS ); - - if ( s != null ) - { - blacklistedPatterns = Arrays.asList( StringUtils.split( s, "," ) ); - } - - try - { - archiva.convertLegacyRepository( oldRepositoryPath, newRepositoryPath, blacklistedPatterns, true ); - } - catch ( RepositoryConversionException e ) - { - showFatalError( "Error converting repository.", e, true ); - } - catch ( DiscovererException e ) - { - showFatalError( "Error discovery artifacts to convert.", e, true ); - } - } - - } - catch ( PlexusContainerException e ) - { - showFatalError( "Cannot create Plexus container.", e, true ); - } - catch ( ComponentLookupException e ) - { - showError( "Cannot lookup application component.", e, true ); - } - - return 0; - } - - private static int showFatalError( String message, - Exception e, - boolean show ) - { - System.err.println( "FATAL ERROR: " + message ); - - if ( show ) - { - System.err.println( "Error stacktrace:" ); - - e.printStackTrace(); - } - else - { - System.err.println( "For more information, run with the -e flag" ); - } - - return 1; - } - - private static void showError( String message, - Exception e, - boolean show ) - { - System.err.println( message ); - - if ( show ) - { - System.err.println( "Error stacktrace:" ); - - e.printStackTrace(); - } - } - - // Need to get the versions of the application in a general way, so that I need a way to get the - // specifics of the application so that I can do this in a general way. - private static void showVersion() - { - InputStream resourceAsStream; - try - { - Properties properties = new Properties(); - resourceAsStream = Cli.class.getClassLoader().getResourceAsStream( - "META-INF/maven/org.apache.maven/maven-core/pom.properties" ); - properties.load( resourceAsStream ); - - if ( properties.getProperty( "builtOn" ) != null ) - { - System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) + " built on " + - properties.getProperty( "builtOn" ) ); - } - else - { - System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) ); - } - } - catch ( IOException e ) - { - System.err.println( "Unable determine version from JAR file: " + e.getMessage() ); - } - } - - // ---------------------------------------------------------------------- - // System properties handling - // ---------------------------------------------------------------------- - - private static Properties getExecutionProperties( CommandLine commandLine ) - { - Properties executionProperties = new Properties(); - - // ---------------------------------------------------------------------- - // Options that are set on the command line become system properties - // and therefore are set in the session properties. System properties - // are most dominant. - // ---------------------------------------------------------------------- - - if ( commandLine.hasOption( CliManager.SET_SYSTEM_PROPERTY ) ) - { - String[] defStrs = commandLine.getOptionValues( CliManager.SET_SYSTEM_PROPERTY ); - - for ( int i = 0; i < defStrs.length; ++i ) - { - setCliProperty( defStrs[i], executionProperties ); - } - } - - executionProperties.putAll( System.getProperties() ); - - return executionProperties; - } - - private static void setCliProperty( String property, - Properties executionProperties ) - { - String name; - - String value; - - int i = property.indexOf( "=" ); - - if ( i <= 0 ) - { - name = property.trim(); - - value = "true"; - } - else - { - name = property.substring( 0, i ).trim(); - - value = property.substring( i + 1 ).trim(); - } + int execute( String[] args, + ClassWorld classWorld ); - executionProperties.setProperty( name, value ); + Options buildOptions( Options options ); - // ---------------------------------------------------------------------- - // I'm leaving the setting of system properties here as not to break - // the SystemPropertyProfileActivator. This won't harm embedding. jvz. - // ---------------------------------------------------------------------- + void processOptions( CommandLine cli, + PlexusContainer container ) + throws Exception; - System.setProperty( name, value ); - } + String getPomPropertiesPath(); } diff --git a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/CliManager.java b/archiva-cli/src/main/java/org/apache/maven/archiva/cli/CliManager.java deleted file mode 100644 index f4dd59226..000000000 --- a/archiva-cli/src/main/java/org/apache/maven/archiva/cli/CliManager.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.apache.maven.archiva.cli; - -import org.apache.commons.cli.Options; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.ParseException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; - -import java.util.List; -import java.util.ArrayList; - -/** - * @author Jason van Zyl - * @version $Revision: 381114 $ - */ -public class CliManager -{ - public static char CONVERT = 'c'; - - // ---------------------------------------------------------------------------- - // These are standard options that we would want to use for all our projects. - // ---------------------------------------------------------------------------- - - public static final char QUIET = 'q'; - - public static final char DEBUG = 'X'; - - public static final char ERRORS = 'e'; - - public static final char HELP = 'h'; - - public static final char VERSION = 'v'; - - public static final char SET_SYSTEM_PROPERTY = 'D'; - - private Options options; - - public CliManager() - { - options = new Options(); - - options.addOption( - OptionBuilder.withLongOpt( "convert" ).hasArg().withDescription( - "Convert a legacy Maven 1.x repository to a Maven 2.x repository using a properties file to describe the conversion." ) - .create( CONVERT ) ); - } - - public CommandLine parse( String[] args ) - throws ParseException - { - // We need to eat any quotes surrounding arguments... - String[] cleanArgs = cleanArgs( args ); - - CommandLineParser parser = new GnuParser(); - - return parser.parse( options, cleanArgs ); - } - - private String[] cleanArgs( String[] args ) - { - List cleaned = new ArrayList(); - - StringBuffer currentArg = null; - - for ( int i = 0; i < args.length; i++ ) - { - String arg = args[i]; - - boolean addedToBuffer = false; - - if ( arg.startsWith( "\"" ) ) - { - // if we're in the process of building up another arg, push it and start over. - // this is for the case: "-Dfoo=bar "-Dfoo2=bar two" (note the first unterminated quote) - if ( currentArg != null ) - { - cleaned.add( currentArg.toString() ); - } - - // start building an argument here. - currentArg = new StringBuffer( arg.substring( 1 ) ); - - addedToBuffer = true; - } - - // this has to be a separate "if" statement, to capture the case of: "-Dfoo=bar" - if ( arg.endsWith( "\"" ) ) - { - String cleanArgPart = arg.substring( 0, arg.length() - 1 ); - - // if we're building an argument, keep doing so. - if ( currentArg != null ) - { - // if this is the case of "-Dfoo=bar", then we need to adjust the buffer. - if ( addedToBuffer ) - { - currentArg.setLength( currentArg.length() - 1 ); - } - // otherwise, we trim the trailing " and append to the buffer. - else - { - // TODO: introducing a space here...not sure what else to do but collapse whitespace - currentArg.append( ' ' ).append( cleanArgPart ); - } - - // we're done with this argument, so add it. - cleaned.add( currentArg.toString() ); - } - else - { - // this is a simple argument...just add it. - cleaned.add( cleanArgPart ); - } - - // the currentArg MUST be finished when this completes. - currentArg = null; - - continue; - } - - // if we haven't added this arg to the buffer, and we ARE building an argument - // buffer, then append it with a preceding space...again, not sure what else to - // do other than collapse whitespace. - // NOTE: The case of a trailing quote is handled by nullifying the arg buffer. - if ( !addedToBuffer ) - { - // append to the argument we're building, collapsing whitespace to a single space. - if ( currentArg != null ) - { - currentArg.append( ' ' ).append( arg ); - } - // this is a loner, just add it directly. - else - { - cleaned.add( arg ); - } - } - } - - // clean up. - if ( currentArg != null ) - { - cleaned.add( currentArg.toString() ); - } - - int cleanedSz = cleaned.size(); - String[] cleanArgs = null; - - if ( cleanedSz == 0 ) - { - // if we didn't have any arguments to clean, simply pass the original array through - cleanArgs = args; - } - else - { - cleanArgs = (String[]) cleaned.toArray( new String[cleanedSz] ); - } - - return cleanArgs; - } - - public void displayHelp() - { - System.out.println(); - - HelpFormatter formatter = new HelpFormatter(); - - formatter.printHelp( "mvn [options] [<goal(s)>] [<phase(s)>]", "\nOptions:", options, "\n" ); - } -} |