Add java bytecode class file version detection · codehaus-plexus/plexus-languages@5c06f1b (original) (raw)

``

1

`+

package org.codehaus.plexus.languages.java.version;

`

``

2

+

``

3

`+

import java.io.IOException;

`

``

4

`+

import java.io.UncheckedIOException;

`

``

5

`+

import java.nio.file.Files;

`

``

6

`+

import java.nio.file.Path;

`

``

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

`+

public final class JavaClassfileVersion {

`

``

34

+

``

35

`+

private final int major;

`

``

36

`+

private final int minor;

`

``

37

+

``

38

`+

JavaClassfileVersion(int major, int minor) {

`

``

39

`+

if (major < 45) {

`

``

40

`+

throw new IllegalArgumentException("Java class major version must be 45 or above.");

`

``

41

`+

}

`

``

42

`+

this.major = major;

`

``

43

`+

this.minor = minor;

`

``

44

`+

}

`

``

45

+

``

46

`+

/**

`

``

47

`+

`

``

48

`+

`

``

49

`+

`

``

50

`+

`

``

51

`+

`

``

52

`+

*/

`

``

53

`+

public static JavaClassfileVersion of(byte[] bytes) {

`

``

54

`+

return JavaClassfileVersionParser.of(bytes);

`

``

55

`+

}

`

``

56

+

``

57

`+

/**

`

``

58

`+

`

``

59

`+

`

``

60

`+

`

``

61

`+

`

``

62

`+

`

``

63

`+

*/

`

``

64

`+

public static JavaClassfileVersion of(Path path) {

`

``

65

`+

try {

`

``

66

`+

byte[] readAllBytes = Files.readAllBytes(path);

`

``

67

`+

return of(readAllBytes);

`

``

68

`+

} catch (IOException ex) {

`

``

69

`+

throw new UncheckedIOException(ex);

`

``

70

`+

}

`

``

71

`+

}

`

``

72

+

``

73

`+

/**

`

``

74

`+

`

``

75

`+

`

``

76

`+

`

``

77

`+

*/

`

``

78

`+

public JavaVersion javaVersion() {

`

``

79

`+

int javaVer = major - 44;

`

``

80

`+

String javaVersion = javaVer < 9 ? "1." + javaVer : Integer.toString(javaVer);

`

``

81

+

``

82

`+

return JavaVersion.parse(javaVersion);

`

``

83

`+

}

`

``

84

+

``

85

`+

/**

`

``

86

`+

`

``

87

`+

`

``

88

`+

`

``

89

`+

*/

`

``

90

`+

public int majorVersion() {

`

``

91

`+

return major;

`

``

92

`+

}

`

``

93

+

``

94

`+

/**

`

``

95

`+

`

``

96

`+

`

``

97

`+

`

``

98

`+

*/

`

``

99

`+

public int minorVersion() {

`

``

100

`+

return minor;

`

``

101

`+

}

`

``

102

+

``

103

`+

/**

`

``

104

`+

`

``

105

`+

`

``

106

`+

`

``

107

`+

*/

`

``

108

`+

public boolean isPreview() {

`

``

109

`+

return minor == 65535;

`

``

110

`+

}

`

``

111

+

``

112

`+

/**

`

``

113

`+

`

``

114

`+

`

``

115

`+

`

``

116

`+

`

``

117

`+

*/

`

``

118

`+

@Override

`

``

119

`+

public String toString() {

`

``

120

`+

return major + "." + minor + " (Java " + javaVersion() + ")";

`

``

121

`+

}

`

``

122

+

``

123

`+

@Override

`

``

124

`+

public int hashCode() {

`

``

125

`+

final int prime = 31;

`

``

126

`+

int result = 1;

`

``

127

`+

result = prime * result + major;

`

``

128

`+

result = prime * result + minor;

`

``

129

`+

return result;

`

``

130

`+

}

`

``

131

+

``

132

`+

@Override

`

``

133

`+

public boolean equals(Object obj) {

`

``

134

`+

if (this == obj) return true;

`

``

135

`+

if (!(obj instanceof JavaClassfileVersion)) return false;

`

``

136

`+

JavaClassfileVersion other = (JavaClassfileVersion) obj;

`

``

137

`+

if (major != other.major) return false;

`

``

138

`+

if (minor != other.minor) return false;

`

``

139

`+

return true;

`

``

140

`+

}

`

``

141

`+

}

`