package com.neverwinterdp.vm.client.shell; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParametersDelegate; public class CommandInput { private String commandLine ; private String command ; private String subCommand; private String[] remainArgs ; public CommandInput(String cmdLine) { this(cmdLine, true) ; } public CommandInput(String cmdLine, boolean parseSubCommand) { this(parseArgs(cmdLine), parseSubCommand); this.commandLine = cmdLine ; } public CommandInput(String[] args, boolean parseSubCommand) { command = args[0] ; args = shift(args) ; if(args == null || args.length == 0) return ; if(parseSubCommand && !args[0].startsWith("-")) { subCommand = args[0] ; args = shift(args) ; } if(args == null) return ; remainArgs = args ; } public String getCommandLine() { return this.commandLine ; } public String getCommand() { return this.command ; } public void setCommand(String command) { this.command = command ; } public String getSubCommand() { return this.subCommand ; } public void setSubCommand(String cmd) { this.subCommand = cmd ; } public String[] getRemainArgs() { return this.remainArgs ; } public <T> void mapRemainArgs(T object) { //JCommander jcommander = new JCommander(object, this.remainArgs) ; ParameterMapper mapper = new ParameterMapper() ; Arrays.asList(remainArgs); List<String> remainList = mapper.map(object, Arrays.asList(remainArgs)) ; remainArgs = remainList.toArray(new String[remainList.size()]); } static public String[] shift(String[] array){ if(array == null || array.length == 0) return null ; String[] newArray = new String[array.length - 1] ; System.arraycopy(array, 1, newArray, 0, newArray.length); return newArray ; } static public String[] parseArgs(String line) { List<String> holder = new ArrayList<String>(); //parse data format in #data{ }# String data = null ; if(line.indexOf("#{data") > 0 && line.endsWith("}#")) { int idx = line.indexOf("#{data") ; data = line.substring(idx + 6 , line.length() - 2) ; line = line.substring(0, idx) ; } Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(line); while (m.find()) { String arg = m.group(1).trim() ; if(arg.length() == 0) continue ; //Add .replace("\"", "") to remove surrounding quotes. if(arg.startsWith("\"") && arg.endsWith("\"")) { arg = arg.substring(1, arg.length() - 1) ; } holder.add(arg); } if(data != null) holder.add(data) ; return holder.toArray(new String[holder.size()]) ; } static class ParameterMapper { @ParametersDelegate Object object; @Parameter(description = "main parameter") private List<String> mainParameters; public List<String> map(Object object, List<String> argsList) { this.object = object ; mainParameters = new ArrayList<String>(); String[] args = argsList.toArray(new String[argsList.size()]) ; JCommander jcommander = new JCommander(this) ; jcommander.setAcceptUnknownOptions(true); jcommander.parse(args); List<String> remainOptions = new ArrayList<String>() ; remainOptions.addAll(jcommander.getUnknownOptions()) ; remainOptions.addAll(mainParameters) ; return remainOptions ; } } }