Bug 369349 - space in filename fix broke integration tests
+ Attempting to fix space and quote issues with new CommandLineBuilder class and tests.
This commit is contained in:
parent
9f667257f1
commit
b56f1bdcdf
|
@ -0,0 +1,115 @@
|
||||||
|
package org.eclipse.jetty.start;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CommandLineBuilder {
|
||||||
|
private List<String> args;
|
||||||
|
|
||||||
|
public CommandLineBuilder(String bin) {
|
||||||
|
args = new ArrayList<String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a simple argument to the command line.
|
||||||
|
* <p>
|
||||||
|
* Will quote arguments that have a space in them.
|
||||||
|
*
|
||||||
|
* @param arg
|
||||||
|
* the simple argument to add
|
||||||
|
*/
|
||||||
|
public void addArg(String arg) {
|
||||||
|
args.add(quote(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to {@link #addArg(String)} but does no quoting of the name
|
||||||
|
* parameter, and will quote the value parameter as needed.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* addEqualsArg("-Dname", "value") = "-Dname=value"
|
||||||
|
* addEqualsArg("-Djetty.home", "/opt/company inc/jetty (7)/") = "-Djetty.home=\"/opt/company inc/jetty (7)/\""
|
||||||
|
* addEqualsArg("-Djenkins.workspace", "/opt/workspaces/jetty jdk7/") = "-Djenkins.workspace=\"/opt/workspaces/jetty jdk7/\""
|
||||||
|
* addEqualsArg("-Dstress", null) = "-Dstress"
|
||||||
|
* addEqualsArg("-Dstress", "") = "-Dstress"
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* the name
|
||||||
|
* @param value
|
||||||
|
* the value
|
||||||
|
*/
|
||||||
|
public void addEqualsArg(String name, String value) {
|
||||||
|
if (value != null && value.length() > 0) {
|
||||||
|
args.add(name + "=" + quote(value));
|
||||||
|
} else {
|
||||||
|
args.add(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a simple argument to the command line.
|
||||||
|
* <p>
|
||||||
|
* Will <b>NOT</b> quote/escape arguments that have a space in them.
|
||||||
|
*
|
||||||
|
* @param arg
|
||||||
|
* the simple argument to add
|
||||||
|
*/
|
||||||
|
public void addRawArg(String arg) {
|
||||||
|
args.add(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getArgs() {
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform an optional quoting of the argument, being intelligent with
|
||||||
|
* spaces and quotes as needed.
|
||||||
|
*
|
||||||
|
* @param arg
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String quote(String arg) {
|
||||||
|
boolean needsQuoting = arg.indexOf(' ') >= 0 || arg.indexOf('"') >= 0;
|
||||||
|
if (!needsQuoting) {
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
buf.append('"');
|
||||||
|
boolean escaped = false;
|
||||||
|
for (char c : arg.toCharArray()) {
|
||||||
|
if (c == '"') {
|
||||||
|
if (!escaped) {
|
||||||
|
buf.append("\\\"");
|
||||||
|
escaped = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '\\') {
|
||||||
|
escaped = true;
|
||||||
|
}
|
||||||
|
buf.append(c);
|
||||||
|
}
|
||||||
|
buf.append('"');
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
|
||||||
|
boolean delim = false;
|
||||||
|
for (String arg : args) {
|
||||||
|
if (delim) {
|
||||||
|
buf.append(' ');
|
||||||
|
}
|
||||||
|
buf.append(arg);
|
||||||
|
delim = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -661,20 +661,21 @@ public class Main
|
||||||
|
|
||||||
String buildCommandLine(Classpath classpath, List<String> xmls) throws IOException
|
String buildCommandLine(Classpath classpath, List<String> xmls) throws IOException
|
||||||
{
|
{
|
||||||
StringBuilder cmd = new StringBuilder();
|
CommandLineBuilder cmd = new CommandLineBuilder(findJavaBin());
|
||||||
cmd.append(findJavaBin());
|
|
||||||
for (String x : _jvmArgs)
|
for (String x : _jvmArgs)
|
||||||
cmd.append(' ').append(x);
|
{
|
||||||
cmd.append(" -Djetty.home=").append(_jettyHome);
|
cmd.addArg(x);
|
||||||
|
}
|
||||||
|
cmd.addEqualsArg("-Djetty.home",_jettyHome);
|
||||||
for (String p : _sysProps)
|
for (String p : _sysProps)
|
||||||
{
|
{
|
||||||
cmd.append(" -D").append(p);
|
|
||||||
String v = System.getProperty(p);
|
String v = System.getProperty(p);
|
||||||
if (v != null && v.length() > 0)
|
cmd.addEqualsArg("-D" + p,v);
|
||||||
cmd.append('=').append(v);
|
|
||||||
}
|
}
|
||||||
cmd.append(" -cp ").append(classpath.toString());
|
cmd.addArg("-cp");
|
||||||
cmd.append(" ").append(_config.getMainClassname());
|
cmd.addArg(classpath.toString());
|
||||||
|
cmd.addRawArg(_config.getMainClassname());
|
||||||
|
|
||||||
// Check if we need to pass properties as a file
|
// Check if we need to pass properties as a file
|
||||||
Properties properties = Config.getProperties();
|
Properties properties = Config.getProperties();
|
||||||
|
@ -684,12 +685,12 @@ public class Main
|
||||||
if (!_dryRun)
|
if (!_dryRun)
|
||||||
prop_file.deleteOnExit();
|
prop_file.deleteOnExit();
|
||||||
properties.store(new FileOutputStream(prop_file),"start.jar properties");
|
properties.store(new FileOutputStream(prop_file),"start.jar properties");
|
||||||
cmd.append(" ").append(prop_file.getAbsolutePath());
|
cmd.addArg(prop_file.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String xml : xmls)
|
for (String xml : xmls)
|
||||||
{
|
{
|
||||||
cmd.append(' ').append(xml);
|
cmd.addArg(xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmd.toString();
|
return cmd.toString();
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.eclipse.jetty.start;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.*;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CommandLineBuilderTest {
|
||||||
|
@Test
|
||||||
|
public void testQuotingSimple() {
|
||||||
|
assertQuoting("/opt/jetty", "/opt/jetty");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testQuotingSpaceInPath() {
|
||||||
|
assertQuoting("/opt/jetty 7/home", "\"/opt/jetty 7/home\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testQuotingSpaceAndQuotesInPath() {
|
||||||
|
assertQuoting("/opt/jetty 7 \"special\"/home", "\"/opt/jetty 7 \\\"special\\\"/home\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertQuoting(String raw, String expected) {
|
||||||
|
String actual = CommandLineBuilder.quote(raw);
|
||||||
|
Assert.assertThat("Quoted version of [" + raw + "]", actual, is(expected));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue