diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java index b870c6646c..f46183518b 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java @@ -21,8 +21,6 @@ package org.apache.maven.cli; import java.io.PrintStream; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -154,107 +152,13 @@ public class CLIManager throws ParseException { // We need to eat any quotes surrounding arguments... - String[] cleanArgs = cleanArgs( args ); + String[] cleanArgs = CleanArgument.cleanArgs( args ); CommandLineParser parser = new GnuParser(); return parser.parse( options, cleanArgs ); } - private String[] cleanArgs( String[] args ) - { - List cleaned = new ArrayList<>(); - - StringBuilder currentArg = null; - - for ( String arg : args ) - { - 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 StringBuilder( 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 ); - } - - cleaned.add( currentArg.toString() ); - } - else - { - cleaned.add( cleanArgPart ); - } - - 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 ) - { - if ( currentArg != null ) - { - currentArg.append( ' ' ).append( arg ); - } - else - { - cleaned.add( arg ); - } - } - } - - if ( currentArg != null ) - { - cleaned.add( currentArg.toString() ); - } - - int cleanedSz = cleaned.size(); - - String[] cleanArgs; - - if ( cleanedSz == 0 ) - { - cleanArgs = args; - } - else - { - cleanArgs = cleaned.toArray( new String[cleanedSz] ); - } - - return cleanArgs; - } - public void displayHelp( PrintStream stdout ) { stdout.println(); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CleanArgument.java b/maven-embedder/src/main/java/org/apache/maven/cli/CleanArgument.java new file mode 100644 index 0000000000..192ed3bde7 --- /dev/null +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CleanArgument.java @@ -0,0 +1,122 @@ +package org.apache.maven.cli; + +/* + * 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. + */ + +import java.util.ArrayList; +import java.util.List; + +public class CleanArgument +{ + public static String[] cleanArgs( String[] args ) + { + List cleaned = new ArrayList<>(); + + StringBuilder currentArg = null; + + for ( String arg : args ) + { + 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 StringBuilder( arg.substring( 1 ) ); + addedToBuffer = true; + } + + // this has to be a separate "if" statement, to capture the case of: "-Dfoo=bar" + if ( addedToBuffer && 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 ); + } + + cleaned.add( currentArg.toString() ); + } + else + { + cleaned.add( cleanArgPart ); + } + + currentArg = null; + addedToBuffer = false; + 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 ) + { + if ( currentArg != null ) + { + currentArg.append( ' ' ).append( arg ); + } + else + { + cleaned.add( arg ); + } + } + } + + if ( currentArg != null ) + { + cleaned.add( currentArg.toString() ); + } + + int cleanedSz = cleaned.size(); + + String[] cleanArgs; + + if ( cleanedSz == 0 ) + { + cleanArgs = args; + } + else + { + cleanArgs = cleaned.toArray( new String[cleanedSz] ); + } + + return cleanArgs; + } + + +} diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java similarity index 93% rename from maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerTest.java rename to maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java index 1e7183786b..a06f0a1c58 100644 --- a/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerTest.java +++ b/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java @@ -32,11 +32,10 @@ import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.util.FileUtils; /** - * Pseudo test to generate documentation fragment about supported CLI options. - * TODO such documentation generation code should not be necessary as unit test but should be run - * during site generation (Velocity? Doxia macro?) + * Pseudo test to generate documentation fragment about supported CLI options. TODO such documentation generation code + * should not be necessary as unit test but should be run during site generation (Velocity? Doxia macro?) */ -public class CLIManagerTest +public class CLIManagerDocumentationTest extends PlexusTestCase { private final static String LS = System.getProperty( "line.separator" ); @@ -55,7 +54,6 @@ public class CLIManagerTest { public Collection