1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.util;
29
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.util.ArrayList;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Properties;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class VersionInfo {
51
52
53 public final static String UNAVAILABLE = "UNAVAILABLE";
54
55
56 public final static String VERSION_PROPERTY_FILE = "version.properties";
57
58
59 public final static String PROPERTY_MODULE = "info.module";
60 public final static String PROPERTY_RELEASE = "info.release";
61 public final static String PROPERTY_TIMESTAMP = "info.timestamp";
62
63
64
65 private final String infoPackage;
66
67
68 private final String infoModule;
69
70
71 private final String infoRelease;
72
73
74 private final String infoTimestamp;
75
76
77 private final String infoClassloader;
78
79
80
81
82
83
84
85
86
87
88
89 protected VersionInfo(final String pckg, final String module,
90 final String release, final String time, final String clsldr) {
91 Args.notNull(pckg, "Package identifier");
92 infoPackage = pckg;
93 infoModule = (module != null) ? module : UNAVAILABLE;
94 infoRelease = (release != null) ? release : UNAVAILABLE;
95 infoTimestamp = (time != null) ? time : UNAVAILABLE;
96 infoClassloader = (clsldr != null) ? clsldr : UNAVAILABLE;
97 }
98
99
100
101
102
103
104
105
106 public final String getPackage() {
107 return infoPackage;
108 }
109
110
111
112
113
114
115
116 public final String getModule() {
117 return infoModule;
118 }
119
120
121
122
123
124
125
126 public final String getRelease() {
127 return infoRelease;
128 }
129
130
131
132
133
134
135
136 public final String getTimestamp() {
137 return infoTimestamp;
138 }
139
140
141
142
143
144
145
146
147
148 public final String getClassloader() {
149 return infoClassloader;
150 }
151
152
153
154
155
156
157
158 @Override
159 public String toString() {
160 final StringBuilder sb = new StringBuilder
161 (20 + infoPackage.length() + infoModule.length() +
162 infoRelease.length() + infoTimestamp.length() +
163 infoClassloader.length());
164
165 sb.append("VersionInfo(")
166 .append(infoPackage).append(':').append(infoModule);
167
168
169
170 if (!UNAVAILABLE.equals(infoRelease)) {
171 sb.append(':').append(infoRelease);
172 }
173 if (!UNAVAILABLE.equals(infoTimestamp)) {
174 sb.append(':').append(infoTimestamp);
175 }
176
177 sb.append(')');
178
179 if (!UNAVAILABLE.equals(infoClassloader)) {
180 sb.append('@').append(infoClassloader);
181 }
182
183 return sb.toString();
184 }
185
186
187
188
189
190
191
192
193
194
195
196
197 public static VersionInfo[] loadVersionInfo(final String[] pckgs,
198 final ClassLoader clsldr) {
199 Args.notNull(pckgs, "Package identifier array");
200 final List<VersionInfo> vil = new ArrayList<VersionInfo>(pckgs.length);
201 for (final String pckg : pckgs) {
202 final VersionInfo vi = loadVersionInfo(pckg, clsldr);
203 if (vi != null) {
204 vil.add(vi);
205 }
206 }
207
208 return vil.toArray(new VersionInfo[vil.size()]);
209 }
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224 public static VersionInfo loadVersionInfo(final String pckg,
225 final ClassLoader clsldr) {
226 Args.notNull(pckg, "Package identifier");
227 final ClassLoader cl = clsldr != null ? clsldr : Thread.currentThread().getContextClassLoader();
228
229 Properties vip = null;
230 try {
231
232
233 final InputStream is = cl.getResourceAsStream
234 (pckg.replace('.', '/') + "/" + VERSION_PROPERTY_FILE);
235 if (is != null) {
236 try {
237 final Properties props = new Properties();
238 props.load(is);
239 vip = props;
240 } finally {
241 is.close();
242 }
243 }
244 } catch (final IOException ex) {
245
246 }
247
248 VersionInfo result = null;
249 if (vip != null) {
250 result = fromMap(pckg, vip, cl);
251 }
252
253 return result;
254 }
255
256
257
258
259
260
261
262
263
264
265
266
267 protected static VersionInfo fromMap(final String pckg, final Map<?, ?> info,
268 final ClassLoader clsldr) {
269 Args.notNull(pckg, "Package identifier");
270 String module = null;
271 String release = null;
272 String timestamp = null;
273
274 if (info != null) {
275 module = (String) info.get(PROPERTY_MODULE);
276 if ((module != null) && (module.length() < 1)) {
277 module = null;
278 }
279
280 release = (String) info.get(PROPERTY_RELEASE);
281 if ((release != null) && ((release.length() < 1) ||
282 (release.equals("${pom.version}")))) {
283 release = null;
284 }
285
286 timestamp = (String) info.get(PROPERTY_TIMESTAMP);
287 if ((timestamp != null) &&
288 ((timestamp.length() < 1) ||
289 (timestamp.equals("${mvn.timestamp}")))
290 ) {
291 timestamp = null;
292 }
293 }
294
295 String clsldrstr = null;
296 if (clsldr != null) {
297 clsldrstr = clsldr.toString();
298 }
299
300 return new VersionInfo(pckg, module, release, timestamp, clsldrstr);
301 }
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 public static String getUserAgent(final String name, final String pkg, final Class<?> cls) {
318
319 final VersionInfo vi = VersionInfo.loadVersionInfo(pkg, cls.getClassLoader());
320 final String release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE;
321 final String javaVersion = System.getProperty("java.version");
322
323 return String.format("%s/%s (Java/%s)", name, release, javaVersion);
324 }
325
326 }