/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.executor;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.exec.OS;
/**
* Common base class for {@link CommandLineExecutor} implementations.
*
* @author Robert Mischke
*
*/
public abstract class AbstractCommandLineExecutor implements CommandLineExecutor {
protected final Map<String, String> env = new HashMap<String, String>();
@Override
public void setEnv(String key, String value) {
if (value != null) {
env.put(key, value);
} else {
env.remove(key);
}
}
@Override
public String getEnv(String key) {
return env.get(key);
}
/**
* A default implementation that concatenates the individual commands with "&&" and delegates the resulting string to
* {@link #start(String)}. IF a different behavior is needed, subclasses should override this method without calling super().
*
* @param commandStrings the command lines to execute
*
* @throws IOException if an I/O error occurs on start of the target executable
*/
@Override
public void startMultiLineCommand(String[] commandStrings) throws IOException {
final StringBuilder sb = new StringBuilder();
// TODO needs testing!
for (String line : commandStrings) {
// Check for empty lines and comments
if (!line.isEmpty() && !(OS.isFamilyWindows() && (line.toLowerCase().startsWith("rem") || line.startsWith("::")))
&& !(OS.isFamilyUnix() && line.startsWith("#"))) {
if (sb.length() != 0) {
// note: the "&&" is not wrapped in spaces to avoid modifying expected parameters
// (for example, "echo test" -> "echo test ")
sb.append("&&");
}
sb.append(line);
}
}
start(sb.toString());
}
}