/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ package netscape.ldap.util; import java.util.*; /** * This class is similar to the getopt() function in * UNIX System V. You can use this class to parse command-line * arguments. *

* * When you create an object of this class, you specify a string * containing the command-line options that you want to check for. * The string should contain the letters of these options. If an * option requires an argument (for example, "-h "), * you should add a colon after the letter in this string. *

* * For example, in the following string, the -h, * -p, -D,, and -w options * all require arguments. The -H option does not * require any arguments. *

 * "h:p:D:w:H"
 * 
* * You can use the hasOption method to determine if * an option has been specified and the getOptionParam * method to get the argument specified after a particular option. *

* * If an option not specified in the string is passed in as an * argument, the GetOpt object prints out an error * message. Note that the object does not throw an exception or * exit the application if an invalid option is specified. *

* * Note that you are still responsible for verifying that any * required arguments have been specified. *

* * The following example parses the command-line arguments for * the hostname, port number, DN, and password to use when * connecting and authenticating to an LDAP server. *

 * import netscape.ldap.*;
 * import netscape.ldap.controls.*;
 * import netscape.ldap.util.*;
 * import java.util.*;
 *
 * public class SearchDirectory {
 *
 *     public static void main( String[] args )
 *     {
 *
 *         String usage = "Usage: java SearchDirectory -h  -p  "
 *                      + "[-D ] [-w ]"
 *
 *         int portnumber = LDAPv2.DEFAULT_PORT;
 *
 *         // Check for these options. -H means to print out a usage message.
 *         GetOpt options = new GetOpt( "h:p:D:w:H", args );
 *
 *         // Get the arguments specified for each option.
 *         String hostname = options.getOptionParam( 'h' );
 *         String port = options.getOptionParam( 'p' );
 *         String bindDN = options.getOptionParam( 'D' );
 *         String bindPW = options.getOptionParam( 'w' );
 *
 *         // Check to see if the hostname (which is mandatory)
 *         // is not specified or if the user simply wants to
 *         // see the usage message (-H).
 *         if ( hostname == null || options.hasOption( 'H' ) ) {
 *             System.out.println( usage );
 *             System.exit( 1 );
 *         }
 *
 *         // If a port number was specified, convert the port value
 *         //  to an integer.
 *         if ( port != null ) {
 *             try {
 *                 portnumber = java.lang.Integer.parseInt( port );
 *             } catch ( java.lang.Exception e ) {
 *                 System.out.println( "Invalid port number: " + port );
 *                 System.out.println( usage );
 *                 System.exit( 1 );
 *             }
 *         }
 *
 *         // Create a new connection.
 *         LDAPConnection ld = new LDAPConnection();
 *
 *         try {
 *             // Connect and authenticate to server.
 *             ld.connect( 3, hostname, portnumber, bindDN, bindPW );
 *             ...
 *         } catch ( LDAPException e ) {
 *             System.out.println( "Error: " + e.toString() );
 *         }
 *         ...
 *     }
 * }
 * 
* * @version 1.0 */ public class GetOpt implements java.io.Serializable { /** * Internal variables */ private int m_pos; private String optarg; private String m_control; private Vector m_option; private Vector m_ParameterList; private Hashtable m_optionHashTable; private Hashtable m_optionParamHashTable; static final long serialVersionUID = -2570196909939660248L; /** * Constructs a GetOpt object. * @param strControl a string specifying the letters of * all available options. If an option requires an argument * (for example, "-h "), use a colon after the * letter for that option (for example, "h:p:D:w:H"). * @param args an array of strings representing the list * of arguments to parse (for example, the * array passed into Main). */ public GetOpt(String strControl, String args[]) { m_option = new Vector(); m_control = strControl; m_optionHashTable = new Hashtable(); m_optionParamHashTable = new Hashtable(); m_ParameterList = new Vector(); for (int i=0;i0) { if ((sOpt.charAt(0)=='-') || (sOpt.charAt(0)=='/')) { if (sOpt.length()>1) { int nIndex = m_control.indexOf(sOpt.charAt(1)); if (nIndex == (-1)) { System.err.println("Invalid usage. No option -" + sOpt.charAt(1)); } else { char cOpt[]= new char[1]; cOpt[0]= sOpt.charAt(1); String sName = new String(cOpt); m_optionHashTable.put(sName,"1"); if ((m_control != null) && (m_control.length() > (nIndex+1))) { if (m_control.charAt(nIndex+1)==':') { i++; if (i < args.length) m_optionParamHashTable.put(sName,args[i]); else System.err.println("Missing argument for option "+ sOpt); } } } } else { System.err.println("Invalid usage."); } } else { // probably parameters m_ParameterList.addElement(args[i]); } } } } /** * Determines if an option was specified. For example, * hasOption( 'H' ) checks if the -H option * was specified. *

* * @param c letter of the option to check * @return true if the option was specified. */ public boolean hasOption(char c) { boolean fReturn = false; char cOption[]=new char[1]; cOption[0]=c; String s = new String(cOption); if (m_optionHashTable.get(s)=="1") { fReturn = true; } return(fReturn); } /** * Gets the argument specified with an option. * For example, getOptionParameter( 'h' ) * gets the value of the argument specified with * the -h option (such as "localhost" in "-h localhost"). *

* * @param c the letter of the option to check * @return the argument specified for this option. */ public String getOptionParam(char c) { char cOption[] = new char[1]; cOption[0]=c; String s = new String(cOption); String sReturn=(String)m_optionParamHashTable.get(s); return(sReturn); } /** * Gets a list of any additional parameters specified * (not including the arguments for any options). * @return a list of the additional parameters. */ public Vector getParameters() { return(m_ParameterList); } }