1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.cli;
19
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.Enumeration;
23 import java.util.List;
24 import java.util.ListIterator;
25 import java.util.Properties;
26
27
28
29
30
31
32 @Deprecated
33 public abstract class Parser implements CommandLineParser {
34
35
36 protected CommandLine cmd;
37
38
39 private Options options;
40
41
42 private List requiredOptions;
43
44
45
46
47 public Parser() {
48
49 }
50
51
52
53
54
55
56 protected void checkRequiredOptions() throws MissingOptionException {
57
58 if (!getRequiredOptions().isEmpty()) {
59 throw new MissingOptionException(getRequiredOptions());
60 }
61 }
62
63
64
65
66
67
68
69
70
71
72 protected abstract String[] flatten(Options opts, String[] arguments, boolean stopAtNonOption) throws ParseException;
73
74
75
76
77
78
79 protected Options getOptions() {
80 return options;
81 }
82
83
84
85
86
87
88 protected List getRequiredOptions() {
89 return requiredOptions;
90 }
91
92
93
94
95
96
97
98
99
100 @Override
101 public CommandLine parse(final Options options, final String[] arguments) throws ParseException {
102 return parse(options, arguments, null, false);
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116 @Override
117 public CommandLine parse(final Options options, final String[] arguments, final boolean stopAtNonOption) throws ParseException {
118 return parse(options, arguments, null, stopAtNonOption);
119 }
120
121
122
123
124
125
126
127
128
129
130
131 public CommandLine parse(final Options options, final String[] arguments, final Properties properties) throws ParseException {
132 return parse(options, arguments, properties, false);
133 }
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 public CommandLine parse(final Options options, final String[] arguments, final Properties properties, final boolean stopAtNonOption)
149 throws ParseException {
150
151 for (final Option opt : options.helpOptions()) {
152 opt.clearValues();
153 }
154
155 for (final OptionGroup optionGroup : options.getOptionGroups()) {
156 optionGroup.setSelected(null);
157 }
158
159 setOptions(options);
160 cmd = CommandLine.builder().get();
161 boolean eatTheRest = false;
162 final List<String> tokenList = Arrays.asList(flatten(getOptions(), arguments == null ? new String[0] : arguments, stopAtNonOption));
163 final ListIterator<String> iterator = tokenList.listIterator();
164
165 while (iterator.hasNext()) {
166 final String token = iterator.next();
167 if (token != null) {
168
169 if ("--".equals(token)) {
170 eatTheRest = true;
171 } else if ("-".equals(token)) {
172
173 if (stopAtNonOption) {
174 eatTheRest = true;
175 } else {
176 cmd.addArg(token);
177 }
178 } else if (token.startsWith("-")) {
179
180 if (stopAtNonOption && !getOptions().hasOption(token)) {
181 eatTheRest = true;
182 cmd.addArg(token);
183 } else {
184 processOption(token, iterator);
185 }
186 } else {
187
188 cmd.addArg(token);
189 if (stopAtNonOption) {
190 eatTheRest = true;
191 }
192 }
193
194 if (eatTheRest) {
195 while (iterator.hasNext()) {
196 final String str = iterator.next();
197
198 if (!"--".equals(str)) {
199 cmd.addArg(str);
200 }
201 }
202 }
203 }
204 }
205 processProperties(properties);
206 checkRequiredOptions();
207 return cmd;
208 }
209
210
211
212
213
214
215
216
217
218 public void processArgs(final Option opt, final ListIterator<String> iter) throws ParseException {
219
220 while (iter.hasNext()) {
221 final String str = iter.next();
222
223 if (getOptions().hasOption(str) && str.startsWith("-")) {
224 iter.previous();
225 break;
226 }
227
228 try {
229 opt.processValue(Util.stripLeadingAndTrailingQuotes(str));
230 } catch (final RuntimeException exp) {
231 iter.previous();
232 break;
233 }
234 }
235 if (opt.getValues() == null && !opt.hasOptionalArg()) {
236 throw new MissingArgumentException(opt);
237 }
238 }
239
240
241
242
243
244
245
246
247
248 protected void processOption(final String arg, final ListIterator<String> iter) throws ParseException {
249 final boolean hasOption = getOptions().hasOption(arg);
250
251 if (!hasOption) {
252 throw new UnrecognizedOptionException("Unrecognized option: " + arg, arg);
253 }
254
255 final Option opt = (Option) getOptions().getOption(arg).clone();
256
257 updateRequiredOptions(opt);
258
259 if (opt.hasArg()) {
260 processArgs(opt, iter);
261 }
262
263 cmd.addOption(opt);
264 }
265
266
267
268
269
270
271
272 protected void processProperties(final Properties properties) throws ParseException {
273 if (properties == null) {
274 return;
275 }
276 for (final Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
277 final String option = e.nextElement().toString();
278 final Option opt = options.getOption(option);
279 if (opt == null) {
280 throw new UnrecognizedOptionException("Default option wasn't defined", option);
281 }
282
283 final OptionGroup optionGroup = options.getOptionGroup(opt);
284 final boolean selected = optionGroup != null && optionGroup.isSelected();
285 if (!cmd.hasOption(option) && !selected) {
286
287 final String value = properties.getProperty(option);
288 if (opt.hasArg()) {
289 if (Util.isEmpty(opt.getValues())) {
290 try {
291 opt.processValue(value);
292 } catch (final RuntimeException exp) {
293
294 }
295 }
296 } else if (!("yes".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value) || "1".equalsIgnoreCase(value))) {
297
298
299 continue;
300 }
301 cmd.addOption(opt);
302 updateRequiredOptions(opt);
303 }
304 }
305 }
306
307
308
309
310
311
312 protected void setOptions(final Options options) {
313 this.options = options;
314 this.requiredOptions = new ArrayList<>(options.getRequiredOptions());
315 }
316
317
318
319
320
321
322 private void updateRequiredOptions(final Option opt) throws ParseException {
323
324
325 if (opt.isRequired()) {
326 getRequiredOptions().remove(opt.getKey());
327 }
328
329
330 if (getOptions().getOptionGroup(opt) != null) {
331 final OptionGroup optionGroup = getOptions().getOptionGroup(opt);
332 if (optionGroup.isRequired()) {
333 getRequiredOptions().remove(optionGroup);
334 }
335 optionGroup.setSelected(opt);
336 }
337 }
338
339 }