1 package org.codehaus.plexus.languages.java.version;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.UncheckedIOException;
6 import java.nio.file.Files;
7 import java.nio.file.Path;
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 public final class JavaClassfileVersion {
35
36 private final int major;
37 private final int minor;
38
39 JavaClassfileVersion(int major, int minor) {
40 if (major < 45) {
41 throw new IllegalArgumentException("Java class major version must be 45 or above.");
42 }
43 this.major = major;
44 this.minor = minor;
45 }
46
47
48
49
50
51
52
53
54 public static JavaClassfileVersion of(byte[] bytes) {
55 return JavaClassfileVersionParser.of(bytes);
56 }
57
58
59
60
61
62
63
64
65 public static JavaClassfileVersion of(Path path) {
66 try (InputStream is = Files.newInputStream(path)) {
67 byte[] bytes = new byte[8];
68 int total = 0;
69 while (total < 8) {
70 int l = is.read(bytes, total, 8 - total);
71 if (l > 0) {
72 total += l;
73 }
74 if (l == -1) {
75 break;
76 }
77 }
78 return of(bytes);
79 } catch (IOException ex) {
80 throw new UncheckedIOException(ex);
81 }
82 }
83
84
85
86
87
88
89 public JavaVersion javaVersion() {
90 int javaVer = major - 44;
91 String javaVersion = javaVer < 9 ? "1." + javaVer : Integer.toString(javaVer);
92
93 return JavaVersion.parse(javaVersion);
94 }
95
96
97
98
99
100
101 public int majorVersion() {
102 return major;
103 }
104
105
106
107
108
109
110 public int minorVersion() {
111 return minor;
112 }
113
114
115
116
117
118
119 public boolean isPreview() {
120 return minor == 65535;
121 }
122
123
124
125
126
127
128
129 @Override
130 public String toString() {
131 return major + "." + minor + " (Java " + javaVersion() + ")";
132 }
133
134 @Override
135 public int hashCode() {
136 final int prime = 31;
137 int result = 1;
138 result = prime * result + major;
139 result = prime * result + minor;
140 return result;
141 }
142
143 @Override
144 public boolean equals(Object obj) {
145 if (this == obj) return true;
146 if (!(obj instanceof JavaClassfileVersion)) return false;
147 JavaClassfileVersion other = (JavaClassfileVersion) obj;
148 if (major != other.major) return false;
149 if (minor != other.minor) return false;
150 return true;
151 }
152 }