Processing the command line
/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote * products derived from this Software without prior written * permission of Exoffice Technologies. For written permission, * please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" * nor may "Exolab" appear in their names without prior written * permission of Exoffice Technologies. Exolab is a registered * trademark of Exoffice Technologies. * * 5. Due credit should be given to the Exolab Project * (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved. * * $Id: CommandLine.java,v 1.1 2004/11/26 01:51:02 tanderson Exp $ * * Date Author Changes * 1/6/2000 jima Created * 1/9/2000 jima changed package name from com.comware to org.exolab * 7/1/2000 jima removed the CW prefix from the class name * 1/8/2001 jima Removed it from jtf library and imported it into * the openjms library */ import java.util.Hashtable; import java.util.Vector; /** * This core class is responsible for processing the command line and * storing away the list of options and parameters specified. The * difference between an option and a command line is that an option * is a boolean value (true if it is specified and false otherwise) * and a parameter always has an associated value. * * @version $version$ * @author jima **/ public class CommandLine { /** * A list of option of switches on the command line. A switch * is either set or not */ private Vector _switches = new Vector(); /** * A dictionary of all the options and their associated values */ private Hashtable _options = new Hashtable(); /** * Construct an instance of this class with the specified string * array. * * @param args command line argument */ public CommandLine(String[] args) { processCommandLine(args); } /** * Default constructor which simply initialised the class */ public CommandLine() { } /** * Check if the following option or command has been specified * * @param name name of option or command * @return boolean true if it has been specified */ public boolean exists(String name) { return _switches.contains(name) || _options.containsKey(name); } /** * Check if the following option has been specified. * * @param name name of the option * @return boolean true if it has been specified */ public boolean isSwitch(String name) { return _switches.contains(name); } /** * Check if the following parameter has been specified. * * @param name name of the parameter * @return boolean true if it has been specified */ public boolean isParameter(String name) { return _options.containsKey(name); } /** * Return the value of the parameter or option. If the string nominates * an option then return null * * @param name name of option or parameter * @return String value of parameter or null */ public String value(String name) { String result = null; if (_options.containsKey(name)) { result = (String) _options.get(name); } return result; } /** * Return the value of the parameter or option, returning a default * value if none is specified * * @param name name of option or parameter * @param defaultValue the default value * @return String value of parameter */ public String value(String name, String defaultValue) { String result = value(name); return (result != null) ? result : defaultValue; } /** * Add the following option or parameter to the list. An option will * have a null value, whereas a parameter will have a non-null value. * <p> * This will automatically overwrite the previous value, if one has been * specified. * * @param name name of option or parameter * @param value value of name * @return boolean true if it was successfully added */ public boolean add(String name, String value) { return add(name, value, true); } /** * Add the following option or parameter to the list. An option will * have a null value, whereas a parameter will have a non-null value. * <p> * If the overwrite flag is true then this value will overwrite the * previous value. If the overwrite flag is false and the name already * exists then it will not overwrite it and the function will return * false. In all other circumstances it will return true. * * @param name name of option or parameter * @param value value of name * @param overwrite true to overwrite previous value * @return boolean true if it was successfully added */ public boolean add(String name, String value, boolean overwrite) { boolean result = false; if (value == null) { // it is an option if ((_switches.contains(name)) && (overwrite)) { _switches.addElement(name); result = true; } else if (!_switches.contains(name)) { _switches.addElement(name); result = true; } } else { // parameter if ((_options.containsKey(name)) && (overwrite)) { _options.put(name, value); result = true; } else if (!_options.containsKey(name)) { _options.put(name, value); result = true; } } return result; } /** * This method processes the command line and extracts the list of * options and command lines. It doesn't intepret the meaning of the * entities, which is left to the application. * * @param args command line as a collection of tokens */ private void processCommandLine(String[] args) { boolean prev_was_hyphen = false; String prev_key = null; for (int index = 0; index < args.length; index++) { if (args[index].startsWith("-")) { // if the previous string started with a hyphen then // it was an option store store it, without the hyphen // in the _switches vector. Otherwise if the previous was // not a hyphen then store key and value in the _options // hashtable if (prev_was_hyphen) { add(prev_key, null); } prev_key = args[index].substring(1); prev_was_hyphen = true; // check to see whether it is the last element in the // arg list. If it is then assume it is an option and // break the processing if (index == args.length - 1) { add(prev_key, null); break; } } else { // it does not start with a hyphen. If the prev_key is // not null then set the value to the prev_value. if (prev_key != null) { add(prev_key, args[index]); prev_key = null; } prev_was_hyphen = false; } } } }