CommandLine Parser
/* * This file is part of the AusStage Utilities Package * * The AusStage Utilities Package 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. * * The AusStage Utilities Package 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 the AusStage Utilities Package. * If not, see <http://www.gnu.org/licenses/>. */ //package au.edu.ausstage.utils; // import additional packages import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * A class of methods useful when reading arguments from the command line */ public class CommandLineParser { // declare private class level variables private HashMap<String,String> arguments; /** * Class constructor * Parse the command line arguments such that any argument starting with '-' or '--' is assumed to be a key * The following argument if it doesn't start with a '-' or '--' is assumed to be a value * * @param args the array of command line arguments */ public CommandLineParser(String[] args) { // initialise the arguments map arguments = new HashMap<String, String>(); // declare other helper variables String key = null; String value = null; int index = 0; // loop through the list of arguments for(int i = 0; i < args.length; i++) { // look for a key if (args[i].startsWith("--")) { // this is a key that starts with a -- key = args[i].substring(2); } else if(args[i].startsWith("-")) { // this is a key that start with a - key = args[i].substring(1); } else { // this is a key that starts with nothing as a value arguments.put(args[i], null); // end this iteration of the loop continue; } // look for a value // does the key contain an = character? index = key.indexOf('='); if(index == -1) { // no - use the next argument as the value // is there a value to use if((i + 1) < args.length) { // yes - but does the value look like a key? if(args[i + 1].charAt(0) != '-') { // no - so add the key and value arguments.put(key, args[i + 1]); // increment the count so we don't process this value again i++; } else { // yes - so add just the key arguments.put(args[i], null); } } else { // no - so just add the key arguments.put(args[i], null); } } else { // yes - extract the value from the key value = key.substring(index + 1); // fix the key key = key.substring(0, index); // add the key and value to the map arguments.put(key, value); } } // end loop } // end class constructor /** * get the value of the first key found in the list of arguments * * @param key the key to lookup * @return value the value of the arguments */ public String getValue(String key) { // check to ensure the key is valid if(InputUtils.isValid(key)) { // return the key if found or null if it isn't return arguments.get(key); } // invalid key so return null return null; } // end getValue method /** * check to see if a key exists in the list arguments * * @param key the key to lookup * @return value the value of the arguments */ public boolean containsKey(String key) { // check to ensure the key is valid if(InputUtils.isValid(key)) { if(arguments.get(key) != null) { return true; } else { return false; } } // invalid key so return null return false; } // end containsKey method } // end class definition class InputUtils { /** * check to ensure a parameter value is valid * * @param value the parameter value * * @return true if, and only if, the parameter is valid */ public static boolean isValid(String value) { // check on the parameter value if(value == null) { return false; } else { value = value.trim(); if(value.equals("") == true) { return false; } } // passed validation return true; } // end the isValid method /** * check to ensure a parameter is valid and is from a list * * @param value the parameter value * @param list the list of allowed values * * @return true if, and only if, the parameter is valid */ public static boolean isValid(String value, String[] list) { // check if it is not null first if(isValid(value) == false) { return false; } // check the value against the list boolean isValid = false; for(int i = 0; i < list.length; i++) { if(list[i].equals(value)) { isValid = true; } } return isValid; } // end the isValid method with list /** * check to ensure a parameter value is valid * * @param value the parameter value * * @return true if, and only if, the parameter is valid */ public static boolean isValidInt(String value) { if(isValid(value) == false) { return false; } // can we parse the value as a int? try { Integer.parseInt(value); } catch (java.lang.NumberFormatException ex) { // nope return false; } // if we get this far everything is OK return true; } // end the isValid method /** * check to ensure a parameter value is valid * * @param value the parameter value * @param minimum the minimum allowed value * * @return true if, and only if, the parameter is valid */ public static boolean isValidInt(int value, int minimum) { if(value >= minimum) { return false; } else { return true; } } // end the isValid method /** * check to ensure a parameter value is valid * * @param value the parameter value * @param minimum the minimum allowed value * @param maximum the maximum allowed value * * @return true if, and only if, the parameter is valid */ public static boolean isValidInt(int value, int minimum, int maximum) { if(value >= minimum && value <= maximum) { return true; } else { return false; } } // end the isValid method /** * check to ensure a parameters value is valid * * @param date the date to check in the format yyyy-mm-dd */ public static boolean isValidDate(String date) { // define the pattern Pattern pattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$"); Matcher matcher = pattern.matcher(date); if(matcher.find() == true) { return true; } else { return false; } } /** * A method to take an array of values and return them in a comma delimited list * * @param values the array of values to process * * @return the string representation of the list */ public static String arrayToString(String[] values) { return java.util.Arrays.toString(values).replaceAll("[\\]\\[]", ""); } // end the arrayToString method /** * A method to ensure an array of strings represent an array of integers * * @param values the array of strings * * @return true if, and only if, all of the values pass inspection */ public static boolean isValidArrayInt(String[] values) { // declare helper variables boolean status = true; // loop through all of the elements in the array for(int i = 0; i < values.length; i++) { if(isValidInt(values[i]) == false) { // this value isn't valid status = false; // exit the loop early i = values.length; } } // return the status return status; } // end isValidArrayInt method } // end class definition