1 /***
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Exoffice Technologies. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Exoffice Technologies. Exolab is a registered
23 * trademark of Exoffice Technologies.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved.
42 *
43 * $Id: CommandLine.java,v 1.1 2004/11/26 01:51:02 tanderson Exp $
44 *
45 * Date Author Changes
46 * 1/6/2000 jima Created
47 * 1/9/2000 jima changed package name from com.comware to org.exolab
48 * 7/1/2000 jima removed the CW prefix from the class name
49 * 1/8/2001 jima Removed it from jtf library and imported it into
50 * the openjms library
51 */
52
53 package org.exolab.jms.util;
54
55 import java.util.Hashtable;
56 import java.util.Vector;
57
58
59 /***
60 * This core class is responsible for processing the command line and
61 * storing away the list of options and parameters specified. The
62 * difference between an option and a command line is that an option
63 * is a boolean value (true if it is specified and false otherwise)
64 * and a parameter always has an associated value.
65 *
66 * @version $version$
67 * @author jima
68 **/
69 public class CommandLine {
70
71 /***
72 * A list of option of switches on the command line. A switch
73 * is either set or not
74 */
75 private Vector _switches = new Vector();
76
77 /***
78 * A dictionary of all the options and their associated values
79 */
80 private Hashtable _options = new Hashtable();
81
82 /***
83 * Construct an instance of this class with the specified string
84 * array.
85 *
86 * @param args command line argument
87 */
88 public CommandLine(String[] args) {
89 processCommandLine(args);
90 }
91
92 /***
93 * Default constructor which simply initialised the class
94 */
95 public CommandLine() {
96 }
97
98 /***
99 * Check if the following option or command has been specified
100 *
101 * @param name name of option or command
102 * @return boolean true if it has been specified
103 */
104 public boolean exists(String name) {
105 return _switches.contains(name) || _options.containsKey(name);
106 }
107
108 /***
109 * Check if the following option has been specified.
110 *
111 * @param name name of the option
112 * @return boolean true if it has been specified
113 */
114 public boolean isSwitch(String name) {
115 return _switches.contains(name);
116 }
117
118 /***
119 * Check if the following parameter has been specified.
120 *
121 * @param name name of the parameter
122 * @return boolean true if it has been specified
123 */
124 public boolean isParameter(String name) {
125 return _options.containsKey(name);
126 }
127
128 /***
129 * Return the value of the parameter or option. If the string nominates
130 * an option then return null
131 *
132 * @param name name of option or parameter
133 * @return String value of parameter or null
134 */
135 public String value(String name) {
136 String result = null;
137
138 if (_options.containsKey(name)) {
139 result = (String) _options.get(name);
140 }
141
142 return result;
143 }
144
145 /***
146 * Return the value of the parameter or option, returning a default
147 * value if none is specified
148 *
149 * @param name name of option or parameter
150 * @param defaultValue the default value
151 * @return String value of parameter
152 */
153 public String value(String name, String defaultValue) {
154 String result = value(name);
155 return (result != null) ? result : defaultValue;
156 }
157
158 /***
159 * Add the following option or parameter to the list. An option will
160 * have a null value, whereas a parameter will have a non-null value.
161 * <p>
162 * This will automatically overwrite the previous value, if one has been
163 * specified.
164 *
165 * @param name name of option or parameter
166 * @param value value of name
167 * @return boolean true if it was successfully added
168 */
169 public boolean add(String name, String value) {
170 return add(name, value, true);
171 }
172
173 /***
174 * Add the following option or parameter to the list. An option will
175 * have a null value, whereas a parameter will have a non-null value.
176 * <p>
177 * If the overwrite flag is true then this value will overwrite the
178 * previous value. If the overwrite flag is false and the name already
179 * exists then it will not overwrite it and the function will return
180 * false. In all other circumstances it will return true.
181 *
182 * @param name name of option or parameter
183 * @param value value of name
184 * @param overwrite true to overwrite previous value
185 * @return boolean true if it was successfully added
186 */
187 public boolean add(String name, String value, boolean overwrite) {
188 boolean result = false;
189
190 if (value == null) {
191
192 if ((_switches.contains(name)) &&
193 (overwrite)) {
194 _switches.addElement(name);
195 result = true;
196 } else if (!_switches.contains(name)) {
197 _switches.addElement(name);
198 result = true;
199 }
200 } else {
201
202 if ((_options.containsKey(name)) &&
203 (overwrite)) {
204 _options.put(name, value);
205 result = true;
206 } else if (!_options.containsKey(name)) {
207 _options.put(name, value);
208 result = true;
209 }
210 }
211
212 return result;
213 }
214
215 /***
216 * This method processes the command line and extracts the list of
217 * options and command lines. It doesn't intepret the meaning of the
218 * entities, which is left to the application.
219 *
220 * @param args command line as a collection of tokens
221 */
222 private void processCommandLine(String[] args) {
223 boolean prev_was_hyphen = false;
224 String prev_key = null;
225
226 for (int index = 0; index < args.length; index++) {
227 if (args[index].startsWith("-")) {
228
229
230
231
232
233 if (prev_was_hyphen) {
234 add(prev_key, null);
235 }
236
237 prev_key = args[index].substring(1);
238 prev_was_hyphen = true;
239
240
241
242
243 if (index == args.length - 1) {
244 add(prev_key, null);
245 break;
246 }
247 } else {
248
249
250 if (prev_key != null) {
251 add(prev_key, args[index]);
252 prev_key = null;
253 }
254 prev_was_hyphen = false;
255 }
256 }
257 }
258
259 }