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.io.File;
21 import java.io.FileInputStream;
22 import java.net.URL;
23 import java.util.Date;
24 import java.util.Map;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public class PatternOptionBuilder {
76
77
78 public static final Class<String> STRING_VALUE = String.class;
79
80
81 public static final Class<Object> OBJECT_VALUE = Object.class;
82
83
84 public static final Class<Number> NUMBER_VALUE = Number.class;
85
86
87 public static final Class<Date> DATE_VALUE = Date.class;
88
89
90 public static final Class<?> CLASS_VALUE = Class.class;
91
92
93
94
95
96
97 public static final Class<FileInputStream> EXISTING_FILE_VALUE = FileInputStream.class;
98
99
100 public static final Class<File> FILE_VALUE = File.class;
101
102
103 public static final Class<File[]> FILES_VALUE = File[].class;
104
105
106 public static final Class<URL> URL_VALUE = URL.class;
107
108
109 private static final Converter<?, UnsupportedOperationException> UNSUPPORTED = s -> {
110 throw new UnsupportedOperationException("Not yet implemented");
111 };
112
113
114
115
116
117
118
119
120 @Deprecated
121 public static Object getValueClass(final char ch) {
122 return getValueType(ch);
123 }
124
125
126
127
128
129
130
131
132 public static Class<?> getValueType(final char ch) {
133 switch (ch) {
134 case '@':
135 return OBJECT_VALUE;
136 case ':':
137 return STRING_VALUE;
138 case '%':
139 return NUMBER_VALUE;
140 case '+':
141 return CLASS_VALUE;
142 case '#':
143 return DATE_VALUE;
144 case '<':
145 return EXISTING_FILE_VALUE;
146 case '>':
147 return FILE_VALUE;
148 case '*':
149 return FILES_VALUE;
150 case '/':
151 return URL_VALUE;
152 }
153
154 return null;
155 }
156
157
158
159
160
161
162
163 public static boolean isValueCode(final char ch) {
164 return ch == '@' || ch == ':' || ch == '%' || ch == '+' || ch == '#' || ch == '<' || ch == '>' || ch == '*' || ch == '/' || ch == '!';
165 }
166
167
168
169
170
171
172
173 public static Options parsePattern(final String pattern) {
174 char opt = Char.SP;
175 boolean required = false;
176 Class<?> type = null;
177 Converter<?, ?> converter = Converter.DEFAULT;
178
179 final Options options = new Options();
180
181 for (int i = 0; i < pattern.length(); i++) {
182 final char ch = pattern.charAt(i);
183
184
185
186 if (!isValueCode(ch)) {
187 if (opt != Char.SP) {
188
189 final Option option = Option.builder(String.valueOf(opt))
190 .hasArg(type != null)
191 .required(required)
192 .type(type)
193 .converter(converter)
194 .build();
195
196
197 options.addOption(option);
198 required = false;
199 type = null;
200 converter = Converter.DEFAULT;
201 }
202
203 opt = ch;
204 } else if (ch == '!') {
205 required = true;
206 } else {
207 type = getValueType(ch);
208 final Map<Class<?>, Converter<?, ? extends Throwable>> map = TypeHandler.createDefaultMap();
209
210 map.put(FILES_VALUE, unsupported());
211 converter = new TypeHandler(map).getConverter(getValueType(ch));
212 }
213 }
214
215 if (opt != Char.SP) {
216 final Option option = Option.builder(String.valueOf(opt)).hasArg(type != null).required(required).type(type).build();
217
218
219 options.addOption(option);
220 }
221
222 return options;
223 }
224
225 @SuppressWarnings("unchecked")
226 static <T> T unsupported() {
227 return (T) UNSUPPORTED;
228 }
229 }