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 JAVA_RECENT(maxVersion(), Float.toString(maxVersion()));
178
179
180
181
182
183
184
185
186
187
188 static JavaVersion get(final String versionStr) {
189 if (versionStr == null) {
190 return null;
191 }
192 switch (versionStr) {
193 case "0.9":
194 return JAVA_0_9;
195 case "1.1":
196 return JAVA_1_1;
197 case "1.2":
198 return JAVA_1_2;
199 case "1.3":
200 return JAVA_1_3;
201 case "1.4":
202 return JAVA_1_4;
203 case "1.5":
204 return JAVA_1_5;
205 case "1.6":
206 return JAVA_1_6;
207 case "1.7":
208 return JAVA_1_7;
209 case "1.8":
210 return JAVA_1_8;
211 case "9":
212 return JAVA_9;
213 case "10":
214 return JAVA_10;
215 case "11":
216 return JAVA_11;
217 case "12":
218 return JAVA_12;
219 case "13":
220 return JAVA_13;
221 case "14":
222 return JAVA_14;
223 case "15":
224 return JAVA_15;
225 case "16":
226 return JAVA_16;
227 case "17":
228 return JAVA_17;
229 case "18":
230 return JAVA_18;
231 case "19":
232 return JAVA_19;
233 case "20":
234 return JAVA_20;
235 case "21":
236 return JAVA_21;
237 default:
238 final float v = toFloatVersion(versionStr);
239 if ((v - 1.) < 1.) {
240 final int firstComma = Math.max(versionStr.indexOf('.'), versionStr.indexOf(','));
241 final int end = Math.max(versionStr.length(), versionStr.indexOf(',', firstComma));
242 if (Float.parseFloat(versionStr.substring(firstComma + 1, end)) > .9f) {
243 return JAVA_RECENT;
244 }
245 } else if (v > 10) {
246 return JAVA_RECENT;
247 }
248 return null;
249 }
250 }
251
252
253
254
255
256
257
258
259
260
261
262 static JavaVersion getJavaVersion(final String versionStr) {
263 return get(versionStr);
264 }
265
266
267
268
269
270
271 private static float maxVersion() {
272 final float v = toFloatVersion(System.getProperty("java.specification.version", "99.0"));
273 return v > 0 ? v : 99f;
274 }
275
276
277
278
279
280
281
282 private static float toFloatVersion(final String value) {
283 final int defaultReturnValue = -1;
284 if (!value.contains(".")) {
285 return NumberUtils.toFloat(value, defaultReturnValue);
286 }
287 final String[] toParse = value.split("\\.");
288 if (toParse.length >= 2) {
289 return NumberUtils.toFloat(toParse[0] + '.' + toParse[1], defaultReturnValue);
290 }
291 return defaultReturnValue;
292 }
293
294
295
296
297 private final float value;
298
299
300
301
302 private final String name;
303
304
305
306
307
308
309
310 JavaVersion(final float value, final String name) {
311 this.value = value;
312 this.name = name;
313 }
314
315
316
317
318
319
320
321
322
323
324 public boolean atLeast(final JavaVersion requiredVersion) {
325 return this.value >= requiredVersion.value;
326 }
327
328
329
330
331
332
333
334
335
336
337
338 public boolean atMost(final JavaVersion requiredVersion) {
339 return this.value <= requiredVersion.value;
340 }
341
342
343
344
345
346
347
348
349 @Override
350 public String toString() {
351 return name;
352 }
353 }