1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.lang3;
18
19 import org.apache.commons.lang3.math.NumberUtils;
20
21
22
23
24
25
26
27
28 public enum JavaVersion {
29
30
31
32
33 JAVA_0_9(1.5f, "0.9"),
34
35
36
37
38 JAVA_1_1(1.1f, "1.1"),
39
40
41
42
43 JAVA_1_2(1.2f, "1.2"),
44
45
46
47
48 JAVA_1_3(1.3f, "1.3"),
49
50
51
52
53 JAVA_1_4(1.4f, "1.4"),
54
55
56
57
58 JAVA_1_5(1.5f, "1.5"),
59
60
61
62
63 JAVA_1_6(1.6f, "1.6"),
64
65
66
67
68 JAVA_1_7(1.7f, "1.7"),
69
70
71
72
73 JAVA_1_8(1.8f, "1.8"),
74
75
76
77
78
79
80 @Deprecated
81 JAVA_1_9(9.0f, "9"),
82
83
84
85
86
87
88 JAVA_9(9.0f, "9"),
89
90
91
92
93
94
95 JAVA_10(10.0f, "10"),
96
97
98
99
100
101
102 JAVA_11(11.0f, "11"),
103
104
105
106
107
108
109 JAVA_12(12.0f, "12"),
110
111
112
113
114
115
116 JAVA_13(13.0f, "13"),
117
118
119
120
121
122
123 JAVA_14(14.0f, "14"),
124
125
126
127
128
129
130 JAVA_15(15.0f, "15"),
131
132
133
134
135
136
137 JAVA_16(16.0f, "16"),
138
139
140
141
142
143
144 JAVA_17(17.0f, "17"),
145
146
147
148
149
150
151 JAVA_18(18.0f, "18"),
152
153
154
155
156
157
158 JAVA_19(19.0f, "19"),
159
160
161
162
163
164
165 JAVA_20(20, "20"),
166
167
168
169
170
171
172 JAVA_21(21, "21"),
173
174
175
176
177
178
179 JAVA_22(22, "22"),
180
181
182
183
184
185
186 JAVA_23(23, "23"),
187
188
189
190
191
192
193 JAVA_24(24, "24"),
194
195
196
197
198 JAVA_RECENT(maxVersion(), Float.toString(maxVersion()));
199
200
201
202
203 private static final String VERSION_SPLIT_REGEX = "\\.";
204
205
206
207
208
209
210
211
212
213
214 static JavaVersion get(final String versionStr) {
215 if (versionStr == null) {
216 return null;
217 }
218 switch (versionStr) {
219 case "0.9":
220 return JAVA_0_9;
221 case "1.1":
222 return JAVA_1_1;
223 case "1.2":
224 return JAVA_1_2;
225 case "1.3":
226 return JAVA_1_3;
227 case "1.4":
228 return JAVA_1_4;
229 case "1.5":
230 return JAVA_1_5;
231 case "1.6":
232 return JAVA_1_6;
233 case "1.7":
234 return JAVA_1_7;
235 case "1.8":
236 return JAVA_1_8;
237 case "9":
238 return JAVA_9;
239 case "10":
240 return JAVA_10;
241 case "11":
242 return JAVA_11;
243 case "12":
244 return JAVA_12;
245 case "13":
246 return JAVA_13;
247 case "14":
248 return JAVA_14;
249 case "15":
250 return JAVA_15;
251 case "16":
252 return JAVA_16;
253 case "17":
254 return JAVA_17;
255 case "18":
256 return JAVA_18;
257 case "19":
258 return JAVA_19;
259 case "20":
260 return JAVA_20;
261 case "21":
262 return JAVA_21;
263 case "22":
264 return JAVA_22;
265 case "23":
266 return JAVA_23;
267 case "24":
268 return JAVA_24;
269 default:
270 final float v = toFloatVersion(versionStr);
271 if (v - 1. < 1.) {
272 final int firstComma = Math.max(versionStr.indexOf('.'), versionStr.indexOf(','));
273 final int end = Math.max(versionStr.length(), versionStr.indexOf(',', firstComma));
274 if (Float.parseFloat(versionStr.substring(firstComma + 1, end)) > .9f) {
275 return JAVA_RECENT;
276 }
277 } else if (v > 10) {
278 return JAVA_RECENT;
279 }
280 return null;
281 }
282 }
283
284
285
286
287
288
289
290
291
292
293 static JavaVersion getJavaVersion(final String versionStr) {
294 return get(versionStr);
295 }
296
297
298
299
300
301
302 private static float maxVersion() {
303 final float v = toFloatVersion(SystemProperties.getJavaSpecificationVersion("99.0"));
304 return v > 0 ? v : 99f;
305 }
306
307 static String[] split(final String value) {
308 return value.split(VERSION_SPLIT_REGEX);
309 }
310
311
312
313
314
315
316
317 private static float toFloatVersion(final String value) {
318 final int defaultReturnValue = -1;
319 if (!value.contains(".")) {
320 return NumberUtils.toFloat(value, defaultReturnValue);
321 }
322 final String[] toParse = split(value);
323 if (toParse.length >= 2) {
324 return NumberUtils.toFloat(toParse[0] + '.' + toParse[1], defaultReturnValue);
325 }
326 return defaultReturnValue;
327 }
328
329
330
331
332 private final float value;
333
334
335
336
337 private final String name;
338
339
340
341
342
343
344
345 JavaVersion(final float value, final String name) {
346 this.value = value;
347 this.name = name;
348 }
349
350
351
352
353
354
355
356
357
358
359 public boolean atLeast(final JavaVersion requiredVersion) {
360 return this.value >= requiredVersion.value;
361 }
362
363
364
365
366
367
368
369
370
371
372
373 public boolean atMost(final JavaVersion requiredVersion) {
374 return this.value <= requiredVersion.value;
375 }
376
377
378
379
380
381
382
383
384 @Override
385 public String toString() {
386 return name;
387 }
388 }