/* -*- 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.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ 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 { /** * 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; /** * 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 that you want parsed (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 that you want 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 that you want 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); } }