/**
* Copyright (C) 2005 - 2013 Eric Van Dewoestine
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.eclim.command;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.cli.Option;
import org.apache.commons.lang.StringUtils;
/**
* Container for the supplied command line options.
*
* @author Eric Van Dewoestine
*/
public class CommandLine
{
private HashMap<String, Object> options = new HashMap<String, Object>();
private Command command;
private String[] args;
private String[] unrecognized;
/**
* Constructs a new instance from the supplied command line.
*
* @param command The command.
* @param commandLine The command line.
* @param args The orginal command line args.
*/
public CommandLine (
Command command,
org.apache.commons.cli.CommandLine commandLine,
String[] args)
{
this.command = command;
this.args = args;
Option[] options = commandLine.getOptions();
for (Option option : options){
if (option.hasArgs()){
this.options.put(option.getOpt(),
commandLine.getOptionValues(option.getOpt()));
}else{ //if(option.hasArg() || option.hasOptionalArg()){
this.options.put(option.getOpt(),
commandLine.getOptionValue(option.getOpt()));
}
}
unrecognized = commandLine.getArgs();
}
/**
* The command to execute.
*
* @return The command.
*/
public Command getCommand()
{
return this.command;
}
/**
* Test to see if a command line option what supplied.
*
* @param name The name of theo option to test for.
*
* @return true if present, false otherwise.
*/
public boolean hasOption(String name)
{
return options.containsKey(name);
}
/**
* Get the value of an arg supplied with the command line option.
*
* @param name The name of the option to get the arg for.
* @return The argument supplied to the option.
*/
public String getValue(String name)
throws Exception
{
String value = null;
Object val = options.get(name);
if(val != null){
if (val.getClass().isArray()){
value = ((String[])val)[0];
}else{
value = (String)val;
}
// decoded special characters encoded by eclim#Execute
value = StringUtils.replace(value, "%2A", "*");
value = StringUtils.replace(value, "%24", "$");
value = StringUtils.replace(value, "%3C", "<");
value = StringUtils.replace(value, "%3E", ">");
return value;
}
return null;
}
/**
* Get the raw value of an arg supplied with the command line option with no
* decoding of special characters.
*
* @param name The name of the option to get the arg for.
* @return The argument supplied to the option.
*/
public Object getRawValue(String name)
throws Exception
{
return options.get(name);
}
/**
* Get the value of an arg supplied with the command line option. If not found
* return the supplied default value.
*
* @param name The name of the option to get the arg for.
* @param dflt The default value to use if the arg is not found.
* @return The argument supplied to the option or the default value.
*/
public String getValue(String name, String dflt)
throws Exception
{
String value = getValue(name);
return value != null ? value : dflt;
}
/**
* Get the values of an arg supplied with the command line option.
*
* @param name The name of the option to get the arg for.
* @return The arguments supplied to the option.
*/
public String[] getValues(String name)
throws Exception
{
String[] values = null;
Object val = options.get(name);
if(val != null){
if (!val.getClass().isArray()){
values = new String[]{(String)val};
}else{
values = (String[])val;
}
for (int ii = 0; ii < values.length; ii++){
// decoded special characters encoded by eclim#Execute
values[ii] = StringUtils.replace(values[ii], "%2A", "*");
values[ii] = StringUtils.replace(values[ii], "%24", "$");
values[ii] = StringUtils.replace(values[ii], "%3C", "<");
values[ii] = StringUtils.replace(values[ii], "%3E", ">");
// support escaped options
if (values[ii].startsWith("\\-")){
values[ii] = values[ii].substring(1);
}
}
return values;
}
return null;
}
/**
* Gets a command line argument as an int.
*
* @param name The name of the option.
* @return The option as an int value, or -1 if option not supplied.
*/
public int getIntValue(String name)
throws Exception
{
String arg = getValue(name);
return arg != null ? Integer.parseInt(arg) : -1;
}
/**
* Gets a command line argument as a long.
*
* @param name The name of the option.
* @return The option as a long value, or -1 if option not supplied.
*/
public long getLongValue(String name)
throws Exception
{
String arg = getValue(name);
return arg != null ? Long.parseLong(arg) : -1;
}
/**
* Gets any unrecognized arguments provided by the user.
*
* @return Array of unrecognized args, or null if none.
*/
public String[] getUnrecognizedArgs()
{
return unrecognized;
}
/**
* Gets array of all arguments supplied.
*
* @return The original array of arguments.
*/
public String[] getArgs()
{
return args;
}
/**
* Adds another option to this command line.
*
* @param option The option.
* @param value The option value.
*/
public void addOption(String option, String value)
{
options.put(option, value);
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
for (Map.Entry<String,Object> entry : this.options.entrySet()){
buffer.append("option: ").append(entry.getKey());
buffer.append(" args: ");
Object value = entry.getValue();
if (value instanceof Object[]){
buffer.append(Arrays.toString((Object[])value));
}else{
buffer.append(value);
}
buffer.append('\n');
}
if (unrecognized != null && unrecognized.length > 0){
buffer.append("unrecognized: " + Arrays.toString(unrecognized));
}
return buffer.toString();
}
}