From 8a51f9e5121a4cff75fbc7ddaf0b7eea9c9d4e10 Mon Sep 17 00:00:00 2001 From: Karl Heinz Marbaise Date: Wed, 7 Oct 2015 16:41:29 +0200 Subject: [PATCH] [MNG-5681] Properties on command line with leading or trailing quotes are stripped Refactored out cleanArgs method from CLIManager into separate class and added appropriate tests which proves the solution of the issue. --- .../java/org/apache/maven/cli/CLIManager.java | 98 +------------- .../org/apache/maven/cli/CleanArgument.java | 122 ++++++++++++++++++ ....java => CLIManagerDocumentationTest.java} | 9 +- .../apache/maven/cli/CleanArgumentTest.java | 61 +++++++++ pom.xml | 28 ++-- 5 files changed, 202 insertions(+), 116 deletions(-) create mode 100644 maven-embedder/src/main/java/org/apache/maven/cli/CleanArgument.java rename maven-embedder/src/test/java/org/apache/maven/cli/{CLIManagerTest.java => CLIManagerDocumentationTest.java} (93%) create mode 100644 maven-embedder/src/test/java/org/apache/maven/cli/CleanArgumentTest.java 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