1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package ch.qos.logback.core.util;
16
17 import ch.qos.logback.core.Context;
18 import ch.qos.logback.core.status.InfoStatus;
19 import ch.qos.logback.core.status.WarnStatus;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.lang.module.ModuleDescriptor;
24 import java.util.Optional;
25 import java.util.Properties;
26
27 import static ch.qos.logback.core.CoreConstants.NA;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class VersionUtil {
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 static public String getVersionOfArtifact(Class<?> aClass) {
60 String moduleVersion = getVersionOfClassByModule(aClass);
61 if (moduleVersion != null)
62 return moduleVersion;
63
64 Package pkg = aClass.getPackage();
65 if (pkg == null) {
66 return null;
67 }
68 return pkg.getImplementationVersion();
69 }
70
71 static public String nonNull(String input) {
72 if (input == null) {
73 return NA;
74 } else {
75 return input;
76 }
77 }
78
79
80
81
82
83
84
85
86
87
88 static private String getVersionOfClassByModule(Class<?> aClass) {
89 Module module = aClass.getModule();
90 if (module == null)
91 return null;
92
93 ModuleDescriptor md = module.getDescriptor();
94 if (md == null)
95 return null;
96 Optional<String> opt = md.rawVersion();
97 return opt.orElse(null);
98 }
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 static public String getArtifactVersionBySelfDeclaredProperties(Class<?> aClass, String moduleName) {
121 Properties props = new Properties();
122
123
124 String propertiesFileName = moduleName + "-version.properties";
125 String propertyKey = moduleName + "-version";
126 try (InputStream is = aClass.getResourceAsStream(propertiesFileName)) {
127 if (is != null) {
128 props.load(is);
129 return props.getProperty(propertyKey);
130 } else {
131 return null;
132 }
133 } catch (IOException e) {
134 return null;
135 }
136 }
137
138
139
140
141 static String getExpectedVersionOfDependencyByProperties(Class<?> dependerClass, String propertiesFileName, String dependencyNameAsKey) {
142 Properties props = new Properties();
143
144 try (InputStream is = dependerClass.getClassLoader()
145 .getResourceAsStream(propertiesFileName)) {
146 if (is != null) {
147 props.load(is);
148 return props.getProperty(dependencyNameAsKey);
149 } else {
150 return null;
151 }
152 } catch (IOException e) {
153 return null;
154 }
155 }
156
157
158 static public void checkForVersionEquality(Context context, Class<?> dependerClass, Class<?> dependencyClass, String dependerName, String dependencyName) {
159
160 String dependerVersion = nonNull(getVersionOfArtifact(dependerClass));
161 String dependencyVersion = nonNull(getVersionOfArtifact(dependencyClass));
162
163 checkForVersionEquality(context, dependerVersion, dependencyVersion, dependerName, dependencyName);
164 }
165
166 static public void checkForVersionEquality(Context context, Class<?> dependerClass, String dependencyVersion, String dependerName, String dependencyName) {
167 String dependerVersion = nonNull(getVersionOfArtifact(dependerClass));
168 checkForVersionEquality(context, dependerVersion, dependencyVersion, dependerName, dependencyName);
169 }
170
171
172
173
174
175
176
177
178
179 static public void checkForVersionEquality(Context context, String dependerVersion, String dependencyVersion, String dependerName, String dependencyName) {
180
181 addFoundVersionStatus(context, dependerName, dependerVersion);
182
183 dependerVersion = nonNull(dependerVersion);
184
185 if (dependerVersion.equals(NA) || !dependerVersion.equals(dependencyVersion)) {
186 addFoundVersionStatus(context, dependencyName, dependencyVersion);
187 String discrepancyMsg = String.format("Versions of %s and %s are different or unknown.", dependencyName, dependerVersion);
188 context.getStatusManager().add(new WarnStatus(discrepancyMsg, context));
189 }
190 }
191
192
193 private static void addFoundVersionStatus(Context context, String name, String version) {
194 String foundDependent = String.format("Found %s version %s", name, nonNull(version));
195 context.getStatusManager().add(new InfoStatus(foundDependent, context));
196 }
197
198 private static String nameToPropertiesFilename(String name) {
199 return name + "-dependencies.properties";
200 }
201
202
203
204
205
206
207
208
209 static public void compareExpectedAndFoundVersion(Context context, String actualDependencyVersion, Class<?> dependerClass, String dependerVersion,
210 String dependerName, String dependencyName) {
211
212 String expectedDependencyVersion = nonNull(getExpectedVersionOfDependencyByProperties(dependerClass, nameToPropertiesFilename(dependerName), dependencyName));
213
214 addFoundVersionStatus(context, dependencyName, actualDependencyVersion);
215 addFoundVersionStatus(context, dependerName, dependerVersion);
216
217 if (!expectedDependencyVersion.equals(actualDependencyVersion)) {
218 String discrepancyMsg = String.format("Expected version of %s is %s but found %s", dependencyName, expectedDependencyVersion, actualDependencyVersion);
219 context.getStatusManager().add(new WarnStatus(discrepancyMsg, context));
220 }
221 }
222 }