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
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 public class PatternOptionBuilder {
75
76 public static final Class<String> STRING_VALUE = String.class;
77
78
79 public static final Class<Object> OBJECT_VALUE = Object.class;
80
81
82 public static final Class<Number> NUMBER_VALUE = Number.class;
83
84
85 public static final Class<Date> DATE_VALUE = Date.class;
86
87
88 public static final Class<?> CLASS_VALUE = Class.class;
89
90
91
92
93
94
95 public static final Class<FileInputStream> EXISTING_FILE_VALUE = FileInputStream.class;
96
97
98 public static final Class<File> FILE_VALUE = File.class;
99
100
101 public static final Class<File[]> FILES_VALUE = File[].class;
102
103
104 public static final Class<URL> URL_VALUE = URL.class;
105
106
107
108
109
110
111
112 public static Object getValueClass(final char ch) {
113 switch (ch) {
114 case '@':
115 return PatternOptionBuilder.OBJECT_VALUE;
116 case ':':
117 return PatternOptionBuilder.STRING_VALUE;
118 case '%':
119 return PatternOptionBuilder.NUMBER_VALUE;
120 case '+':
121 return PatternOptionBuilder.CLASS_VALUE;
122 case '#':
123 return PatternOptionBuilder.DATE_VALUE;
124 case '<':
125 return PatternOptionBuilder.EXISTING_FILE_VALUE;
126 case '>':
127 return PatternOptionBuilder.FILE_VALUE;
128 case '*':
129 return PatternOptionBuilder.FILES_VALUE;
130 case '/':
131 return PatternOptionBuilder.URL_VALUE;
132 }
133
134 return null;
135 }
136
137
138
139
140
141
142
143 public static boolean isValueCode(final char ch) {
144 return ch == '@' || ch == ':' || ch == '%' || ch == '+' || ch == '#' || ch == '<' || ch == '>' || ch == '*' || ch == '/' || ch == '!';
145 }
146
147
148
149
150
151
152
153 public static Options parsePattern(final String pattern) {
154 char opt = ' ';
155 boolean required = false;
156 Class<?> type = null;
157
158 final Options options = new Options();
159
160 for (int i = 0; i < pattern.length(); i++) {
161 final char ch = pattern.charAt(i);
162
163
164
165 if (!isValueCode(ch)) {
166 if (opt != ' ') {
167 final Option option = Option.builder(String.valueOf(opt)).hasArg(type != null).required(required).type(type).build();
168
169
170 options.addOption(option);
171 required = false;
172 type = null;
173 }
174
175 opt = ch;
176 } else if (ch == '!') {
177 required = true;
178 } else {
179 type = (Class<?>) getValueClass(ch);
180 }
181 }
182
183 if (opt != ' ') {
184 final Option option = Option.builder(String.valueOf(opt)).hasArg(type != null).required(required).type(type).build();
185
186
187 options.addOption(option);
188 }
189
190 return options;
191 }
192 }