1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.lib;
45
46 import java.text.MessageFormat;
47 import java.util.ArrayList;
48 import java.util.List;
49 import java.util.concurrent.TimeUnit;
50 import java.util.regex.Matcher;
51 import java.util.regex.Pattern;
52
53 import org.eclipse.jgit.annotations.NonNull;
54 import org.eclipse.jgit.internal.JGitText;
55 import org.eclipse.jgit.lib.Config.ConfigEnum;
56 import org.eclipse.jgit.transport.RefSpec;
57 import org.eclipse.jgit.util.StringUtils;
58
59
60
61
62
63
64
65 public class DefaultTypedConfigGetter implements TypedConfigGetter {
66
67
68 @Override
69 public boolean getBoolean(Config config, String section, String subsection,
70 String name, boolean defaultValue) {
71 String n = config.getRawString(section, subsection, name);
72 if (n == null) {
73 return defaultValue;
74 }
75 if (Config.isMissing(n)) {
76 return true;
77 }
78 try {
79 return StringUtils.toBoolean(n);
80 } catch (IllegalArgumentException err) {
81 throw new IllegalArgumentException(MessageFormat.format(
82 JGitText.get().invalidBooleanValue, section, name, n));
83 }
84 }
85
86
87 @Override
88 public <T extends Enum<?>> T getEnum(Config config, T[] all, String section,
89 String subsection, String name, T defaultValue) {
90 String value = config.getString(section, subsection, name);
91 if (value == null) {
92 return defaultValue;
93 }
94 if (all[0] instanceof ConfigEnum) {
95 for (T t : all) {
96 if (((ConfigEnum) t).matchConfigValue(value)) {
97 return t;
98 }
99 }
100 }
101
102 String n = value.replace(' ', '_');
103
104
105
106
107 n = n.replace('-', '_');
108
109 T trueState = null;
110 T falseState = null;
111 for (T e : all) {
112 if (StringUtils.equalsIgnoreCase(e.name(), n)) {
113 return e;
114 } else if (StringUtils.equalsIgnoreCase(e.name(), "TRUE")) {
115 trueState = e;
116 } else if (StringUtils.equalsIgnoreCase(e.name(), "FALSE")) {
117 falseState = e;
118 }
119 }
120
121
122
123
124
125 if (trueState != null && falseState != null) {
126 try {
127 return StringUtils.toBoolean(n) ? trueState : falseState;
128 } catch (IllegalArgumentException err) {
129
130 }
131 }
132
133 if (subsection != null) {
134 throw new IllegalArgumentException(
135 MessageFormat.format(JGitText.get().enumValueNotSupported3,
136 section, subsection, name, value));
137 } else {
138 throw new IllegalArgumentException(
139 MessageFormat.format(JGitText.get().enumValueNotSupported2,
140 section, name, value));
141 }
142 }
143
144
145 @Override
146 public int getInt(Config config, String section, String subsection,
147 String name, int defaultValue) {
148 long val = config.getLong(section, subsection, name, defaultValue);
149 if (Integer.MIN_VALUE <= val && val <= Integer.MAX_VALUE) {
150 return (int) val;
151 }
152 throw new IllegalArgumentException(MessageFormat
153 .format(JGitText.get().integerValueOutOfRange, section, name));
154 }
155
156
157 @Override
158 public long getLong(Config config, String section, String subsection,
159 String name, long defaultValue) {
160 final String str = config.getString(section, subsection, name);
161 if (str == null) {
162 return defaultValue;
163 }
164 String n = str.trim();
165 if (n.length() == 0) {
166 return defaultValue;
167 }
168 long mul = 1;
169 switch (StringUtils.toLowerCase(n.charAt(n.length() - 1))) {
170 case 'g':
171 mul = Config.GiB;
172 break;
173 case 'm':
174 mul = Config.MiB;
175 break;
176 case 'k':
177 mul = Config.KiB;
178 break;
179 }
180 if (mul > 1) {
181 n = n.substring(0, n.length() - 1).trim();
182 }
183 if (n.length() == 0) {
184 return defaultValue;
185 }
186 try {
187 return mul * Long.parseLong(n);
188 } catch (NumberFormatException nfe) {
189 throw new IllegalArgumentException(MessageFormat.format(
190 JGitText.get().invalidIntegerValue, section, name, str));
191 }
192 }
193
194
195 @Override
196 public long getTimeUnit(Config config, String section, String subsection,
197 String name, long defaultValue, TimeUnit wantUnit) {
198 String valueString = config.getString(section, subsection, name);
199
200 if (valueString == null) {
201 return defaultValue;
202 }
203
204 String s = valueString.trim();
205 if (s.length() == 0) {
206 return defaultValue;
207 }
208
209 if (s.startsWith("-")) {
210 throw notTimeUnit(section, subsection, name, valueString);
211 }
212
213 Matcher m = Pattern.compile("^(0|[1-9][0-9]*)\\s*(.*)$")
214 .matcher(valueString);
215 if (!m.matches()) {
216 return defaultValue;
217 }
218
219 String digits = m.group(1);
220 String unitName = m.group(2).trim();
221
222 TimeUnit inputUnit;
223 int inputMul;
224
225 if (unitName.isEmpty()) {
226 inputUnit = wantUnit;
227 inputMul = 1;
228
229 } else if (match(unitName, "ns", "nanoseconds")) {
230 inputUnit = TimeUnit.NANOSECONDS;
231 inputMul = 1;
232
233 } else if (match(unitName, "us", "microseconds")) {
234 inputUnit = TimeUnit.MICROSECONDS;
235 inputMul = 1;
236
237 } else if (match(unitName, "ms", "milliseconds")) {
238 inputUnit = TimeUnit.MILLISECONDS;
239 inputMul = 1;
240
241 } else if (match(unitName, "s", "sec", "second", "seconds")) {
242 inputUnit = TimeUnit.SECONDS;
243 inputMul = 1;
244
245 } else if (match(unitName, "m", "min", "minute", "minutes")) {
246 inputUnit = TimeUnit.MINUTES;
247 inputMul = 1;
248
249 } else if (match(unitName, "h", "hr", "hour", "hours")) {
250 inputUnit = TimeUnit.HOURS;
251 inputMul = 1;
252
253 } else if (match(unitName, "d", "day", "days")) {
254 inputUnit = TimeUnit.DAYS;
255 inputMul = 1;
256
257 } else if (match(unitName, "w", "week", "weeks")) {
258 inputUnit = TimeUnit.DAYS;
259 inputMul = 7;
260
261 } else if (match(unitName, "mon", "month", "months")) {
262 inputUnit = TimeUnit.DAYS;
263 inputMul = 30;
264
265 } else if (match(unitName, "y", "year", "years")) {
266 inputUnit = TimeUnit.DAYS;
267 inputMul = 365;
268
269 } else {
270 throw notTimeUnit(section, subsection, name, valueString);
271 }
272
273 try {
274 return wantUnit.convert(Long.parseLong(digits) * inputMul,
275 inputUnit);
276 } catch (NumberFormatException nfe) {
277 throw notTimeUnit(section, subsection, unitName, valueString);
278 }
279 }
280
281 private static boolean match(String a, String... cases) {
282 for (String b : cases) {
283 if (b != null && b.equalsIgnoreCase(a)) {
284 return true;
285 }
286 }
287 return false;
288 }
289
290 private static IllegalArgumentException notTimeUnit(String section,
291 String subsection, String name, String valueString) {
292 if (subsection != null) {
293 return new IllegalArgumentException(
294 MessageFormat.format(JGitText.get().invalidTimeUnitValue3,
295 section, subsection, name, valueString));
296 }
297 return new IllegalArgumentException(
298 MessageFormat.format(JGitText.get().invalidTimeUnitValue2,
299 section, name, valueString));
300 }
301
302
303 @Override
304 @NonNull
305 public List<RefSpec> getRefSpecs(Config config, String section,
306 String subsection, String name) {
307 String[] values = config.getStringList(section, subsection, name);
308 List<RefSpec> result = new ArrayList<>(values.length);
309 for (String spec : values) {
310 result.add(new RefSpec(spec));
311 }
312 return result;
313 }
314 }