*/
public class CliLauncher {
public static void main(String[] args) throws Exception {
int exitCode = 0;
CommandContext cmdCtx = null;
boolean gui = false;
try {
String argError = null;
List<String> commands = null;
File file = null;
boolean connect = false;
String defaultControllerHost = null;
int defaultControllerPort = -1;
boolean version = false;
String username = null;
char[] password = null;
int connectionTimeout = -1;
for(String arg : args) {
if(arg.startsWith("--controller=") || arg.startsWith("controller=")) {
final String value;
if(arg.startsWith("--")) {
value = arg.substring(13);
} else {
value = arg.substring(11);
}
String portStr = null;
int colonIndex = value.lastIndexOf(':');
if(colonIndex < 0) {
// default port
defaultControllerHost = value;
} else if(colonIndex == 0) {
// default host
portStr = value.substring(1);
} else {
final boolean hasPort;
int closeBracket = value.lastIndexOf(']');
if (closeBracket != -1) {
//possible ip v6
if (closeBracket > colonIndex) {
hasPort = false;
} else {
hasPort = true;
}
} else {
//probably ip v4
hasPort = true;
}
if (hasPort) {
defaultControllerHost = value.substring(0, colonIndex).trim();
portStr = value.substring(colonIndex + 1).trim();
} else {
defaultControllerHost = value;
}
}
if(portStr != null) {
int port = -1;
try {
port = Integer.parseInt(portStr);
if(port < 0) {
argError = "The port must be a valid non-negative integer: '" + args + "'";
} else {
defaultControllerPort = port;
}
} catch(NumberFormatException e) {
argError = "The port must be a valid non-negative integer: '" + arg + "'";
}
}
} else if("--connect".equals(arg) || "-c".equals(arg)) {
connect = true;
} else if("--version".equals(arg)) {
version = true;
} else if ("--gui".equals(arg)) {
gui = true;
} else if(arg.startsWith("--file=") || arg.startsWith("file=")) {
if(file != null) {
argError = "Duplicate argument '--file'.";
break;
}
if(commands != null) {
argError = "Only one of '--file', '--commands' or '--command' can appear as the argument at a time.";
break;
}
final String fileName = arg.startsWith("--") ? arg.substring(7) : arg.substring(5);
if(!fileName.isEmpty()) {
file = new File(fileName);
if(!file.exists()) {
argError = "File " + file.getAbsolutePath() + " doesn't exist.";
break;
}
} else {
argError = "Argument '--file' is missing value.";
break;
}
} else if(arg.startsWith("--commands=") || arg.startsWith("commands=")) {
if(file != null) {
argError = "Only one of '--file', '--commands' or '--command' can appear as the argument at a time.";
break;
}
if(commands != null) {
argError = "Duplicate argument '--command'/'--commands'.";
break;
}
final String value = arg.startsWith("--") ? arg.substring(11) : arg.substring(9);
commands = Util.splitCommands(value);
} else if(arg.startsWith("--command=") || arg.startsWith("command=")) {
if(file != null) {
argError = "Only one of '--file', '--commands' or '--command' can appear as the argument at a time.";
break;
}
if(commands != null) {
argError = "Duplicate argument '--command'/'--commands'.";
break;
}
final String value = arg.startsWith("--") ? arg.substring(10) : arg.substring(8);
commands = Collections.singletonList(value);
} else if (arg.startsWith("--user=")) {
username = arg.startsWith("--") ? arg.substring(7) : arg.substring(5);
} else if (arg.startsWith("--password=")) {
password = (arg.startsWith("--") ? arg.substring(11) : arg.substring(9)).toCharArray();
} else if (arg.startsWith("--timeout=")) {
if (connectionTimeout > 0) {
argError = "Duplicate argument '--timeout'";
break;
}
final String value = arg.substring(10);
try {
connectionTimeout = Integer.parseInt(value);
} catch (final NumberFormatException e) {
//
}
if (connectionTimeout <= 0) {
argError = "The timeout must be a valid positive integer: '" + value + "'";
}
} else if (arg.equals("--help") || arg.equals("-h")) {
commands = Collections.singletonList("help");
} else if (arg.startsWith("--properties=")) {
final String value = arg.substring(13);
final File propertiesFile = new File(value);
if(!propertiesFile.exists()) {
argError = "File doesn't exist: " + propertiesFile.getAbsolutePath();
break;
}
final Properties props = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(propertiesFile);
props.load(fis);
} catch(FileNotFoundException e) {
argError = e.getLocalizedMessage();
break;
} catch(java.io.IOException e) {
argError = "Failed to load properties from " + propertiesFile.getAbsolutePath() + ": " + e.getLocalizedMessage();
break;
} finally {
if(fis != null) {
try {
fis.close();
} catch(java.io.IOException e) {
}
}
}
for(Object prop : props.keySet()) {
SecurityActions.setSystemProperty((String)prop, (String)props.get(prop));
}
} else if(!(arg.startsWith("-D") || arg.equals("-XX:"))) {// skip system properties and jvm options
// assume it's commands
if(file != null) {
argError = "Only one of '--file', '--commands' or '--command' can appear as the argument at a time: " + arg;
break;
}
if(commands != null) {
argError = "Duplicate argument '--command'/'--commands'.";
break;
}
commands = Util.splitCommands(arg);
}
}
if(argError != null) {
System.err.println(argError);
exitCode = 1;
return;
}
if(version) {
cmdCtx = initCommandContext(defaultControllerHost, defaultControllerPort, username, password, false, connect, connectionTimeout);
VersionHandler.INSTANCE.handle(cmdCtx);
return;
}
if(file != null) {
cmdCtx = initCommandContext(defaultControllerHost, defaultControllerPort, username, password, false, connect, connectionTimeout);
processFile(file, cmdCtx);
return;
}
if(commands != null) {
cmdCtx = initCommandContext(defaultControllerHost, defaultControllerPort, username, password, false, connect, connectionTimeout);
processCommands(commands, cmdCtx);
return;
}
if (gui) {
cmdCtx = initCommandContext(defaultControllerHost, defaultControllerPort, username, password, false, true, connectionTimeout);
processGui(cmdCtx);
return;
}
// Interactive mode
cmdCtx = initCommandContext(defaultControllerHost, defaultControllerPort, username, password, true, connect, connectionTimeout);
cmdCtx.interact();
} catch(Throwable t) {
t.printStackTrace();
exitCode = 1;
} finally {
if(cmdCtx != null && cmdCtx.getExitCode() != 0) {
exitCode = cmdCtx.getExitCode();
}
if (!gui) {
System.exit(exitCode);
}
}