1 package org.apache.fulcrum.yaafi.cli;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 /**
23 * Extremely simple command line parsing class.
24 */
25
26 public class Getopt
27 {
28 /** the prefix for determining command line parameters, e.g "-" or "--" */
29 private String prefix;
30
31 /** the command line parameters */
32 private String[] args;
33
34 /**
35 * Constructor
36 * @param args the command line parameters
37 */
38 public Getopt( String[] args )
39 {
40 this(args,"--");
41 }
42
43 /**
44 * Constructor.
45 *
46 * @param args the command line parameters
47 * @param prefix the prefix for command line parameters
48 */
49 public Getopt( String[] args, String prefix )
50 {
51 this.prefix = prefix;
52
53 if( args == null )
54 {
55 this.args = new String[0];
56 }
57 else
58 {
59 this.args = args;
60 }
61 }
62
63 /**
64 * Does the command-line options exist?
65 *
66 * @param option the option we are looking for
67 * @return is the given option contained in the command line arguments?
68 */
69
70 public boolean contains( String option )
71 {
72 return( this.find(option) >= 0 ? true : false );
73 }
74
75 /**
76 * @return the number of command line arguments
77 */
78 public int length()
79 {
80 return this.args.length;
81 }
82
83 /**
84 * Returns the string value for the given option.
85 *
86 * @param option the option
87 * @return the associated value
88 */
89 public String getStringValue( String option )
90 {
91 return this.getValue(option);
92 }
93
94 /**
95 * Returns the string value for the given option.
96 *
97 * @param option the option
98 * @param defaultValue the default value if the option is not defined
99 * @return the associated value
100 */
101 public String getStringValue( String option, String defaultValue )
102 {
103 return this.getValue(option,defaultValue);
104 }
105
106 /**
107 * Returns the boolean value for the given option.
108 *
109 * @param option the option
110 * @return the associated value
111 */
112
113 public boolean getBooleanValue( String option )
114 {
115 return Boolean.valueOf(this.getValue(option)).booleanValue();
116 }
117
118 /**
119 * Returns the boolean value for the given option.
120 *
121 * @param option the option
122 * @param defaultValue the default value if the option is not defined
123 * @return the associated value
124 */
125 public boolean getBooleanValue( String option, boolean defaultValue )
126 {
127 String temp = Boolean.toString(defaultValue);
128 return Boolean.valueOf(this.getValue(option,temp)).booleanValue();
129 }
130
131 /**
132 * Get the given argument.
133 *
134 * @param index the index of the command line argument
135 * @return the commandl ine argument
136 */
137 private String getArg( int index )
138 {
139 return this.args[index];
140 }
141
142 /**
143 * Find a command-line option.
144 *
145 * @param option the option
146 * @return the index of the give option or -1 otherwise
147 */
148 private int find( String option )
149 {
150 String strOption = this.prefix + option;
151
152 // Iterate through all command line arguments and look for "-[chOption]"
153
154 for( int i = 0; i < args.length; i++)
155 {
156 if ( args[i].equals( strOption ) )
157 {
158 return i;
159 }
160 }
161
162 return -1;
163 }
164
165 /**
166 * Determines if a value is defined for the given option.
167 *
168 * @return true if a value is defined
169 */
170 private boolean hasValue( int index )
171 {
172 String value;
173
174 if( (index+1) < this.length() )
175 {
176 value = this.getArg(index+1);
177
178 if( value.startsWith(this.prefix) )
179 {
180 return false;
181 }
182 else
183 {
184 return true;
185 }
186 }
187 else
188 {
189 return false;
190 }
191 }
192
193 /**
194 * Get the value of a command line option.
195 *
196 * @param option the option
197 * @return the value of the option
198 */
199 private String getValue( String option )
200 {
201 String value = this.getValue(option,null);
202
203 if( value == null )
204 {
205 // the options is there but no value was defined by the caller
206 String msg = "No value supplied for " + this.prefix + option;
207 throw new IllegalArgumentException( msg );
208 }
209 else
210 {
211 return value;
212 }
213 }
214
215 /**
216 * Get the value of a command line option
217 * @param option the option
218 * @param defaultValue the default value if the option was not found
219 * @return the value of the option
220 */
221 private String getValue( String option, String defaultValue )
222 {
223 int index = this.find(option);
224
225 if( index < 0 )
226 {
227 // the option is not found
228 return defaultValue;
229 }
230
231 if( this.hasValue(index) )
232 {
233 // a value is available for this option
234 return this.getArg(index+1);
235 }
236 else
237 {
238 // the options is there but no value was defined by the caller
239 String msg = "No value supplied for " + this.prefix + option;
240 throw new IllegalArgumentException( msg );
241 }
242 }
243 }
244