/*
* Svjatoslav Commons - shared library of common functionality.
- * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- *
+ * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ *
* This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public License
- * as published by the Free Software Foundation.
+ * modify it under the terms of version 3 of the GNU Lesser General Public License
+ * or later as published by the Free Software Foundation.
*/
package eu.svjatoslav.commons.commandline.parameterparser;
-import java.io.File;
import java.util.ArrayList;
-import java.util.List;
-public class Parameter {
+public abstract class Parameter<T> {
/**
* Indicates that at least one argument is mandatory for this parameter.
*/
- private final boolean mandatory;
+ protected boolean mandatory;
- private final boolean enableArguments;
+ private final ArrayList<String> aliases = new ArrayList<String>();
- private final boolean enableMultipleArguments;
+ public final String description;
- private final Argument argumentType;
+ public final ArrayList<String> arguments = new ArrayList<String>();
- private final ArrayList<String> aliases;
-
- private final String description;
-
- private final ArrayList<String> arguments = new ArrayList<String>();
+ final ArgumentCount argumentCount;
/**
* If this parameter was present in the commandline, then this boolean will
*/
private boolean parameterSpecified;
- public Parameter(final boolean mandatory, final boolean enableArguments,
- final boolean enableMultipleArguments, final Argument argumentType,
- final String description, final String... aliases) {
+ public Parameter(final boolean mandatory,
+ final ArgumentCount argumentCount, final String description,
+ final String... aliases2) {
this.mandatory = mandatory;
- this.enableArguments = enableArguments;
- this.enableMultipleArguments = enableMultipleArguments;
- this.argumentType = argumentType;
this.description = description;
+ this.argumentCount = argumentCount;
// save aliases
- {
- final ArrayList<String> aliasesList = new ArrayList<String>();
- for (final String alias : aliases) {
- aliasesList.add(alias);
- }
- this.aliases = aliasesList;
- }
+ for (final String alias : aliases2)
+ aliases.add(alias);
+ };
+
+ public Parameter(final String description, final ArgumentCount argumentCount) {
+ this.description = description;
+ this.argumentCount = argumentCount;
}
- public Parameter(final String description, final String... aliases) {
- this(false, false, false, null, description, aliases);
+ public T addAliases(final String... aliasArray) {
+
+ // save aliases
+ for (final String alias : aliasArray)
+ aliases.add(alias);
+
+ return (T) this;
}
/**
*/
public boolean addArgument(final String argumentString) {
// check if arguments are allowed for this parameter
- if (!enableArguments) {
+ if (argumentCount.equals(ArgumentCount.NONE)) {
System.out
- .println("Error! No arguments are allowed for parameters: "
- + getAliases());
+ .println("Error! No arguments are allowed for parameters: "
+ + getAliases());
return false;
}
// check if multiple arguments are allowed
- if ((arguments.size() > 0) && (!enableMultipleArguments)) {
+ if ((arguments.size() > 0)
+ && (argumentCount.equals(ArgumentCount.SINGLE))) {
System.out
- .println("Error! Only single argument is allowed for parameters: "
- + getAliases());
+ .println("Error! Only single argument is allowed for parameters: "
+ + getAliases());
return false;
}
- if (!argumentType.validate(argumentString)) {
+ if (!validate(argumentString)) {
System.out.println("Error! Invalid argument \"" + argumentString
- + "\". It shall be " + argumentType.describeFormat() + ".");
+ + "\". It shall be " + describeFormat() + ".");
return false;
}
return true;
}
+ /**
+ * @return Single line argument type description.
+ */
+ public abstract String describeFormat();
+
public String getAliases() {
final StringBuffer buffer = new StringBuffer();
return buffer.toString();
}
- public File getArgumentAsFile() {
- if (arguments.size() != 1) {
- throw new RuntimeException("Parameter " + description
- + " shall have exactly 1 argument.");
- }
- return new File(arguments.get(0));
- }
-
- public int getArgumentAsInteger() {
- if (arguments.size() != 1) {
- throw new RuntimeException("Parameter " + description
- + " shall have exactly 1 argument.");
- }
- return Integer.parseInt(arguments.get(0));
- }
-
- public String getArgumentAsString() {
- if (arguments.size() != 1) {
- throw new RuntimeException("Parameter " + description
- + " shall have exactly 1 argument.");
- }
- return arguments.get(0);
- }
-
- public List<File> getArgumentsAsFiles() {
- final ArrayList<File> result = new ArrayList<File>();
-
- for (final String argument : arguments) {
- final File file = new File(argument);
- result.add(file);
- }
-
- return result;
- }
-
- public List<Integer> getArgumentsAsIntegers() {
- final ArrayList<Integer> result = new ArrayList<Integer>();
-
- for (final String argument : arguments) {
- result.add(Integer.valueOf(argument));
- }
-
- return result;
- }
-
- public List<String> getArgumentsAsStrings() {
- final ArrayList<String> result = new ArrayList<String>(arguments);
- return result;
- }
-
public String getHelp() {
final StringBuffer buffer = new StringBuffer();
// first line
buffer.append(getAliases());
- if (enableArguments) {
- buffer.append(" (" + argumentType.describeFormat() + ")");
+ if (!argumentCount.equals(ArgumentCount.NONE)) {
+ buffer.append(" (" + describeFormat() + ")");
- if (enableMultipleArguments) {
+ if (argumentCount.equals(ArgumentCount.MULTI))
buffer.append("...");
- }
}
buffer.append("\n");
return buffer.toString();
}
+ public abstract Object getValue();
+
public boolean isMandatory() {
return mandatory;
}
/**
* Notifies this parameter that no more arguments will follow. This gives
* parameter chance to verify if this is ok.
- *
+ *
* @return <code>true</code> if no errors were found. <code>false</code>
* otherwise.
*/
public boolean noMoreArguments() {
- if (enableArguments && (arguments.isEmpty())) {
+ if ((!argumentCount.equals(ArgumentCount.NONE))
+ && (arguments.isEmpty())) {
System.out.println("Error! " + getAliases()
+ " require at least one following argument.");
return true;
}
+ public T setMandatory() {
+ mandatory = true;
+ return (T) this;
+ }
+
/**
* @param parameterSpecified
* the parameterSpecified to set
this.parameterSpecified = parameterSpecified;
}
+ /**
+ * @return <code>true</code> if value is correct, <code>false</code>
+ * otherwise.
+ */
+ public abstract boolean validate(String value);
+
}