/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.util;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.sikuli.basics.Debug;
public class CommandArgs {
private static String _callerType = "";
Options _options;
ArrayList<String> userArgs = new ArrayList<String>();
ArrayList<String> sikuliArgs = new ArrayList<String>();
static String argsOrg = "";
private static boolean isIDE(String callerType) {
return ("IDE".equals(callerType));
}
public static boolean isIDE() {
return ("IDE".equals(_callerType));
}
private static boolean isScript(String callerType) {
return ("SCRIPT".equals(callerType));
}
public static boolean isScript() {
return ("SCRIPT".equals(_callerType));
}
private static boolean isOther(String callerType) {
return (!isIDE(callerType) && !isScript(callerType));
}
public CommandArgs(String type) {
if (!isIDE(type) && !isScript(type)) {
Debug.error("Commandline Parser not configured for " + type);
_callerType = "OTHER";
} else {
_callerType = type;
}
init();
}
public CommandLine getCommandLine(String[] args) {
CommandLineParser parser = new PosixParser();
CommandLine cmd = null;
boolean isUserArg = false;
for (int i=0; i < args.length; i++) {
if (!isUserArg && args[i].startsWith("--")) {
isUserArg = true;
continue;
}
if (isUserArg) {
userArgs.add(args[i]);
} else {
sikuliArgs.add(args[i]);
}
}
try {
cmd = parser.parse(_options, sikuliArgs.toArray(new String[]{}), true);
} catch (ParseException exp) {
Debug.error(exp.getMessage());
}
return cmd;
}
public String[] getUserArgs() {
return userArgs.toArray(new String[0]);
}
public String[] getSikuliArgs() {
return sikuliArgs.toArray(new String[0]);
}
/**
* Adds all options to the Options object
*/
@SuppressWarnings("static-access")
private void init() {
_options = new Options();
_options.addOption(CommandArgsEnum.HELP.shortname(),
CommandArgsEnum.HELP.longname(), false, CommandArgsEnum.HELP.description());
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.DEBUG.longname())
.hasOptionalArg()
.withArgName(CommandArgsEnum.DEBUG.argname())
.withDescription(CommandArgsEnum.DEBUG.description())
.create(CommandArgsEnum.DEBUG.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.LOGFILE.longname())
.hasOptionalArg()
.withArgName(CommandArgsEnum.LOGFILE.argname())
.withDescription(CommandArgsEnum.LOGFILE.description())
.create(CommandArgsEnum.LOGFILE.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.USERLOGFILE.longname())
.hasOptionalArg()
.withArgName(CommandArgsEnum.USERLOGFILE.argname())
.withDescription(CommandArgsEnum.USERLOGFILE.description())
.create(CommandArgsEnum.USERLOGFILE.shortname().charAt(0)));
_options.addOption(CommandArgsEnum.CONSOLE.shortname(),
CommandArgsEnum.CONSOLE.longname(), false, CommandArgsEnum.CONSOLE.description());
_options.addOption(CommandArgsEnum.SPLASH.shortname(),
CommandArgsEnum.SPLASH.longname(), false, CommandArgsEnum.SPLASH.description());
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.INTERACTIVE.longname())
.hasOptionalArg()
.withArgName(CommandArgsEnum.INTERACTIVE.argname())
.withDescription(CommandArgsEnum.INTERACTIVE.description())
.create(CommandArgsEnum.INTERACTIVE.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.SERVER.longname())
.hasOptionalArg()
.withArgName(CommandArgsEnum.SERVER.argname())
.withDescription(CommandArgsEnum.SERVER.description())
.create(CommandArgsEnum.SERVER.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.LOAD.longname())
.withDescription(CommandArgsEnum.LOAD.description())
.hasOptionalArgs()
.withArgName(CommandArgsEnum.LOAD.argname())
.create(CommandArgsEnum.LOAD.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.TEST.longname())
.withDescription(CommandArgsEnum.TEST.description())
.hasOptionalArgs()
.withArgName(CommandArgsEnum.TEST.argname())
.create(CommandArgsEnum.TEST.shortname().charAt(0)));
_options.addOption(
OptionBuilder.withLongOpt(CommandArgsEnum.RUN.longname())
.withDescription(CommandArgsEnum.RUN.description())
.hasOptionalArgs()
.withArgName(CommandArgsEnum.RUN.argname())
.create(CommandArgsEnum.RUN.shortname().charAt(0)));
}
/**
* Prints the help
*/
public void printHelp() {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp(80, "\n",
"----- Running SikuliX " + "-------------",
_options,
"-----\n<foobar.sikuli> (.sikuli might be omitted, is assumed)\n"
+ "path relative to current working directory or absolute path\n"
+ "though deprecated: so called executables .skl can be used too\n"
+ "------\nanything after --\nor after something beginning with --\n"
+ "go to script as user parameters (respecting enclosing \")\n"
+ "------\n-d use this option if you encounter any weird problems\n"
+ "DebugLevel=3 and all output goes to <workingFolder>/SikuliLog.text\n"
+ "----------------------------------------------------------------",
true);
}
public static String[] scanArgs(String[] args) {
//TODO detect leading and/or trailing blanks
argsOrg = System.getenv("SIKULI_COMMAND");
if (argsOrg == null) {
argsOrg = System.getProperty("sikuli.SIKULI_COMMAND");
}
if (argsOrg == null) {
argsOrg = "";
}
String sep = "\"";
String temp = null;
Pattern pat;
Matcher m;
List<String> nargs = new ArrayList<String>();
for (String arg : args) {
if (arg.startsWith("asApp")) {
continue;
}
if (arg.startsWith(sep)) {
if (!arg.endsWith(sep)) {
temp = arg.substring(1);
continue;
}
} else if (arg.endsWith(sep)) {
if (temp != null) {
arg = temp + " " + arg.substring(0, arg.length() - 1);
if (argsOrg != null && !argsOrg.contains(arg)) {
arg = arg.replace(" ", " *?");
pat = Pattern.compile("(" + arg + ")");
m = pat.matcher(argsOrg);
if (m.find()) {
arg = m.group();
} else {
arg = "?" + arg + "?";
}
}
temp = null;
}
} else if (temp != null) {
temp += " " + arg;
continue;
}
nargs.add(arg);
}
return nargs.toArray(new String[0]);
}
public String getArgsOrg() {
return argsOrg;
}
}