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
204
205
206
207
208
209 static JavaVersion get(final String versionStr) {
210 if (versionStr == null) {
211 return null;
212 }
213 switch (versionStr) {
214 case "0.9":
215 return JAVA_0_9;
216 case "1.1":
217 return JAVA_1_1;
218 case "1.2":
219 return JAVA_1_2;
220 case "1.3":
221 return JAVA_1_3;
222 case "1.4":
223 return JAVA_1_4;
224 case "1.5":
225 return JAVA_1_5;
226 case "1.6":
227 return JAVA_1_6;
228 case "1.7":
229 return JAVA_1_7;
230 case "1.8":
231 return JAVA_1_8;
232 case "9":
233 return JAVA_9;
234 case "10":
235 return JAVA_10;
236 case "11":
237 return JAVA_11;
238 case "12":
239 return JAVA_12;
240 case "13":
241 return JAVA_13;
242 case "14":
243 return JAVA_14;
244 case "15":
245 return JAVA_15;
246 case "16":
247 return JAVA_16;
248 case "17":
249 return JAVA_17;
250 case "18":
251 return JAVA_18;
252 case "19":
253 return JAVA_19;
254 case "20":
255 return JAVA_20;
256 case "21":
257 return JAVA_21;
258 case "22":
259 return JAVA_22;
260 case "23":
261 return JAVA_23;
262 case "24":
263 return JAVA_24;
264 default:
265 final float v = toFloatVersion(versionStr);
266 if (v - 1. < 1.) {
267 final int firstComma = Math.max(versionStr.indexOf('.'), versionStr.indexOf(','));
268 final int end = Math.max(versionStr.length(), versionStr.indexOf(',', firstComma));
269 if (Float.parseFloat(versionStr.substring(firstComma + 1, end)) > .9f) {
270 return JAVA_RECENT;
271 }
272 } else if (v > 10) {
273 return JAVA_RECENT;
274 }
275 return null;
276 }
277 }
278
279
280
281
282
283
284
285
286
287
288 static JavaVersion getJavaVersion(final String versionStr) {
289 return get(versionStr);
290 }
291
292
293
294
295
296
297 private static float maxVersion() {
298 final float v = toFloatVersion(SystemProperties.getJavaSpecificationVersion("99.0"));
299 return v > 0 ? v : 99f;
300 }
301
302 static String[] split(final String value) {
303 return RegExUtils.VERSION_SPLIT_PATTERN.split(value);
304 }
305
306
307
308
309
310
311
312 private static float toFloatVersion(final String value) {
313 final int defaultReturnValue = -1;
314 if (!value.contains(".")) {
315 return NumberUtils.toFloat(value, defaultReturnValue);
316 }
317 final String[] toParse = split(value);
318 if (toParse.length >= 2) {
319 return NumberUtils.toFloat(toParse[0] + '.' + toParse[1], defaultReturnValue);
320 }
321 return defaultReturnValue;
322 }
323
324
325
326
327 private final float value;
328
329
330
331
332 private final String name;
333
334
335
336
337
338
339
340 JavaVersion(final float value, final String name) {
341 this.value = value;
342 this.name = name;
343 }
344
345
346
347
348
349
350
351
352
353
354 public boolean atLeast(final JavaVersion requiredVersion) {
355 return this.value >= requiredVersion.value;
356 }
357
358
359
360
361
362
363
364
365
366
367
368 public boolean atMost(final JavaVersion requiredVersion) {
369 return this.value <= requiredVersion.value;
370 }
371
372
373
374
375
376
377
378
379 @Override
380 public String toString() {
381 return name;
382 }
383 }