refactored commandline parser API for simpler usage
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / commandline / parameterparser / Parameter.java
index 1575fcf..831806d 100755 (executable)
@@ -1,6 +1,6 @@
 /*
  * Svjatoslav Commons - shared library of common functionality.
- * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * Copyright ©2012-2013, 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
@@ -18,19 +18,17 @@ public class Parameter {
        /**
         * Indicates that at least one argument is mandatory for this parameter.
         */
-       private final boolean mandatory;
-
-       private final boolean enableArguments;
-
-       private final boolean enableMultipleArguments;
+       private boolean mandatory;
 
        private final Argument argumentType;
 
-       private final ArrayList<String> aliases;
+       private final ArrayList<String> aliases = new ArrayList<String>();
+
+       public final String description;
 
-       private final String description;
+       protected final ArrayList<String> arguments = new ArrayList<String>();
 
-       private final ArrayList<String> arguments = new ArrayList<String>();
+       ArgumentCount argumentCount;
 
        /**
         * If this parameter was present in the commandline, then this boolean will
@@ -38,29 +36,36 @@ public class Parameter {
         */
        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 Argument argumentType, final String description,
+                       final ArgumentCount argumentCount) {
+
+               this.description = description;
+               this.argumentType = argumentType;
+               this.argumentCount = argumentCount;
+       };
+
+       public Parameter(final boolean mandatory,
+                       final ArgumentCount argumentCount, final Argument argumentType,
+                       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 String... aliases) {
-               this(false, false, false, null, description, aliases);
+       public Parameter addAliases(final String... aliasArray) {
+
+               // save aliases
+               for (final String alias : aliasArray)
+                       aliases.add(alias);
+
+               return this;
        }
 
        /**
@@ -69,7 +74,7 @@ public class Parameter {
         */
        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());
@@ -77,7 +82,8 @@ public class Parameter {
                }
 
                // 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());
@@ -112,29 +118,19 @@ public class Parameter {
        }
 
        public File getArgumentAsFile() {
-               if (arguments.size() != 1) {
+               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) {
+               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>();
 
@@ -149,9 +145,8 @@ public class Parameter {
        public List<Integer> getArgumentsAsIntegers() {
                final ArrayList<Integer> result = new ArrayList<Integer>();
 
-               for (final String argument : arguments) {
+               for (final String argument : arguments)
                        result.add(Integer.valueOf(argument));
-               }
 
                return result;
        }
@@ -166,12 +161,11 @@ public class Parameter {
 
                // first line
                buffer.append(getAliases());
-               if (enableArguments) {
+               if (!argumentCount.equals(ArgumentCount.NONE)) {
                        buffer.append(" (" + argumentType.describeFormat() + ")");
 
-                       if (enableMultipleArguments) {
+                       if (argumentCount.equals(ArgumentCount.MULTI))
                                buffer.append("...");
-                       }
                }
                buffer.append("\n");
 
@@ -212,7 +206,8 @@ public class Parameter {
         */
        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.");
@@ -222,6 +217,11 @@ public class Parameter {
                return true;
        }
 
+       public Parameter setMandatory() {
+               mandatory = true;
+               return this;
+       }
+
        /**
         * @param parameterSpecified
         *            the parameterSpecified to set