History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/misc/ExtensionInfo.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/misc/ExtensionInfo.java+416−0
@@ -0,0 +1,416 @@
1/*
2 * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.misc;
27
28import java.util.StringTokenizer;
29import java.util.jar.Attributes;
30import java.util.jar.Attributes.Name;
31import java.util.ResourceBundle;
32import java.util.MissingResourceException;
33import java.text.MessageFormat;
34import java.lang.Character.*;
35
36
37/**
38 * This class holds all necessary information to install or
39 * upgrade a extension on the user's disk
40 *
41 * @author Jerome Dochez
42 */
43public class ExtensionInfo {
44
45 /**
46 * <p>
47 * public static values returned by the isCompatible method
48 * </p>
49 */
50 public static final int COMPATIBLE = 0;
51 public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
52 public static final int REQUIRE_IMPLEMENTATION_UPGRADE = 2;
53 public static final int REQUIRE_VENDOR_SWITCH = 3;
54 public static final int INCOMPATIBLE = 4;
55
56 /**
57 * <p>
58 * attributes fully describer an extension. The underlying described
59 * extension may be installed and requested.
60 * <p>
61 */
62 public String title;
63 public String name;
64 public String specVersion;
65 public String specVendor;
66 public String implementationVersion;
67 public String vendor;
68 public String vendorId;
69 public String url;
70
71 // For I18N support
72 private static final ResourceBundle rb =
73 ResourceBundle.getBundle("sun.misc.resources.Messages");
74
75
76 /**
77 * <p>
78 * Create a new uninitialized extension information object
79 * </p>
80 */
81 public ExtensionInfo() {
82 }
83
84 /**
85 * <p>
86 * Create and initialize an extension information object.
87 * The initialization uses the attributes passed as being
88 * the content of a manifest file to load the extension
89 * information from.
90 * Since manifest file may contain information on several
91 * extension they may depend on, the extension key parameter
92 * is prepanded to the attribute name to make the key used
93 * to retrieve the attribute from the manifest file
94 * <p>
95 * @param extensionKey unique extension key in the manifest
96 * @param attr Attributes of a manifest file
97 */
98 public ExtensionInfo(String extensionKey, Attributes attr)
99 throws NullPointerException
100 {
101 String s;
102 if (extensionKey!=null) {
103 s = extensionKey + "-";
104 } else {
105 s ="";
106 }
107
108 String attrKey = s + Name.EXTENSION_NAME.toString();
109 name = attr.getValue(attrKey);
110 if (name != null)
111 name = name.trim();
112
113 attrKey = s + Name.SPECIFICATION_TITLE.toString();
114 title = attr.getValue(attrKey);
115 if (title != null)
116 title = title.trim();
117
118 attrKey = s + Name.SPECIFICATION_VERSION.toString();
119 specVersion = attr.getValue(attrKey);
120 if (specVersion != null)
121 specVersion = specVersion.trim();
122
123 attrKey = s + Name.SPECIFICATION_VENDOR.toString();
124 specVendor = attr.getValue(attrKey);
125 if (specVendor != null)
126 specVendor = specVendor.trim();
127
128 attrKey = s + Name.IMPLEMENTATION_VERSION.toString();
129 implementationVersion = attr.getValue(attrKey);
130 if (implementationVersion != null)
131 implementationVersion = implementationVersion.trim();
132
133 attrKey = s + Name.IMPLEMENTATION_VENDOR.toString();
134 vendor = attr.getValue(attrKey);
135 if (vendor != null)
136 vendor = vendor.trim();
137
138 attrKey = s + Name.IMPLEMENTATION_VENDOR_ID.toString();
139 vendorId = attr.getValue(attrKey);
140 if (vendorId != null)
141 vendorId = vendorId.trim();
142
143 attrKey =s + Name.IMPLEMENTATION_URL.toString();
144 url = attr.getValue(attrKey);
145 if (url != null)
146 url = url.trim();
147 }
148
149 /**
150 * <p>
151 * @return true if the extension described by this extension information
152 * is compatible with the extension described by the extension
153 * information passed as a parameter
154 * </p>
155 *
156 * @param the requested extension information to compare to
157 */
158 public int isCompatibleWith(ExtensionInfo ei) {
159
160 if (name == null || ei.name == null)
161 return INCOMPATIBLE;
162 if (name.compareTo(ei.name)==0) {
163 // is this true, if not spec version is specified, we consider
164 // the value as being "any".
165 if (specVersion == null || ei.specVersion == null)
166 return COMPATIBLE;
167
168 int version = compareExtensionVersion(specVersion, ei.specVersion);
169 if (version<0) {
170 // this extension specification is "older"
171 if (vendorId != null && ei.vendorId !=null) {
172 if (vendorId.compareTo(ei.vendorId)!=0) {
173 return REQUIRE_VENDOR_SWITCH;
174 }
175 }
176 return REQUIRE_SPECIFICATION_UPGRADE;
177 } else {
178 // the extension spec is compatible, let's look at the
179 // implementation attributes
180 if (vendorId != null && ei.vendorId != null) {
181 // They care who provides the extension
182 if (vendorId.compareTo(ei.vendorId)!=0) {
183 // They want to use another vendor implementation
184 return REQUIRE_VENDOR_SWITCH;
185 } else {
186 // Vendor matches, let's see the implementation version
187 if (implementationVersion != null && ei.implementationVersion != null) {
188 // they care about the implementation version
189 version = compareExtensionVersion(implementationVersion, ei.implementationVersion);
190 if (version<0) {
191 // This extension is an older implementation
192 return REQUIRE_IMPLEMENTATION_UPGRADE;
193 }
194 }
195 }
196 }
197 // All othe cases, we consider the extensions to be compatible
198 return COMPATIBLE;
199 }
200 }
201 return INCOMPATIBLE;
202 }
203
204 /**
205 * <p>
206 * helper method to print sensible information on the undelying described
207 * extension
208 * </p>
209 */
210 public String toString() {
211 return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
212 specVendor + "), spec version(" + specVersion + "), impl vendor(" +
213 vendor + "), impl vendor id(" + vendorId + "), impl version(" +
214 implementationVersion + "), impl url(" + url + ")";
215 }
216
217 /*
218 * <p>
219 * helper method to compare two versions.
220 * version are in the x.y.z.t pattern.
221 * </p>
222 * @param source version to compare to
223 * @param target version used to compare against
224 * @return < 0 if source < version
225 * > 0 if source > version
226 * = 0 if source = version
227 */
228 private int compareExtensionVersion(String source, String target)
229 throws NumberFormatException
230 {
231 source = source.toLowerCase();
232 target = target.toLowerCase();
233
234 return strictCompareExtensionVersion(source, target);
235 }
236
237
238 /*
239 * <p>
240 * helper method to compare two versions.
241 * version are in the x.y.z.t pattern.
242 * </p>
243 * @param source version to compare to
244 * @param target version used to compare against
245 * @return < 0 if source < version
246 * > 0 if source > version
247 * = 0 if source = version
248 */
249 private int strictCompareExtensionVersion(String source, String target)
250 throws NumberFormatException
251 {
252 if (source.equals(target))
253 return 0;
254
255 StringTokenizer stk = new StringTokenizer(source, ".,");
256 StringTokenizer ttk = new StringTokenizer(target, ".,");
257
258 // Compare number
259 int n = 0, m = 0, result = 0;
260
261 // Convert token into meaning number for comparision
262 if (stk.hasMoreTokens())
263 n = convertToken(stk.nextToken().toString());
264
265 // Convert token into meaning number for comparision
266 if (ttk.hasMoreTokens())
267 m = convertToken(ttk.nextToken().toString());
268
269 if (n > m)
270 return 1;
271 else if (m > n)
272 return -1;
273 else
274 {
275 // Look for index of "." in the string
276 int sIdx = source.indexOf(".");
277 int tIdx = target.indexOf(".");
278
279 if (sIdx == -1)
280 sIdx = source.length() - 1;
281
282 if (tIdx == -1)
283 tIdx = target.length() - 1;
284
285 return strictCompareExtensionVersion(source.substring(sIdx + 1),
286 target.substring(tIdx + 1));
287 }
288 }
289
290 private int convertToken(String token)
291 {
292 if (token == null || token.equals(""))
293 return 0;
294
295 int charValue = 0;
296 int charVersion = 0;
297 int patchVersion = 0;
298 int strLength = token.length();
299 int endIndex = strLength;
300 char lastChar;
301
302 Object[] args = {name};
303 MessageFormat mf = new MessageFormat(rb.getString("optpkg.versionerror"));
304 String versionError = mf.format(args);
305
306 // Look for "-" for pre-release
307 int prIndex = token.indexOf("-");
308
309 // Look for "_" for patch release
310 int patchIndex = token.indexOf("_");
311
312 if (prIndex == -1 && patchIndex == -1)
313 {
314 // This is a FCS release
315 try {
316 return Integer.parseInt(token) * 100;
317 } catch (NumberFormatException e) {
318 System.out.println(versionError);
319 return 0;
320 }
321 }
322 else if (patchIndex != -1)
323 {
324 // This is a patch (update) release
325 int prversion;
326 try {
327 // Obtain the version
328 prversion = Integer.parseInt(token.substring(0, patchIndex));
329
330 // Check to see if the patch version is in the n.n.n_nnl format (special release)
331 lastChar = token.charAt(strLength-1);
332 if (Character.isLetter(lastChar)) {
333 // letters a-z have values from 10-35
334 charValue = Character.getNumericValue(lastChar);
335 endIndex = strLength-1;
336
337 // Obtain the patch version id
338 patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
339
340 if (charValue >= Character.getNumericValue('a') && charValue <= Character.getNumericValue('z')) {
341 // This is a special release
342 charVersion = (patchVersion * 100) + charValue;
343 } else {
344 // character is not a a-z letter, ignore
345 charVersion = 0;
346 System.out.println(versionError);
347 }
348 } else {
349 // This is a regular update release. Obtain the patch version id
350 patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
351 }
352 } catch (NumberFormatException e) {
353 System.out.println(versionError);
354 return 0;
355 }
356 return prversion * 100 + (patchVersion + charVersion);
357 }
358 else
359 {
360 //This is a milestone release, either a early access, alpha, beta, or RC
361
362 // Obtain the version
363 int mrversion;
364 try {
365 mrversion = Integer.parseInt(token.substring(0, prIndex));
366 } catch (NumberFormatException e) {
367 System.out.println(versionError);
368 return 0;
369 }
370
371 // Obtain the patch version string, including the milestone + version
372 String prString = token.substring(prIndex + 1);
373
374 // Milestone version
375 String msVersion = "";
376 int delta = 0;
377
378 if (prString.indexOf("ea") != -1)
379 {
380 msVersion = prString.substring(2);
381 delta = 50;
382 }
383 else if (prString.indexOf("alpha") != -1)
384 {
385 msVersion = prString.substring(5);
386 delta = 40;
387 }
388 else if (prString.indexOf("beta") != -1)
389 {
390 msVersion = prString.substring(4);
391 delta = 30;
392 }
393 else if (prString.indexOf("rc") != -1)
394 {
395 msVersion = prString.substring(2);
396 delta = 20;
397 }
398
399 if (msVersion == null || msVersion.equals(""))
400 {
401 // No version after the milestone, assume 0
402 return mrversion * 100 - delta ;
403 }
404 else
405 {
406 // Convert the milestone version
407 try {
408 return mrversion * 100 - delta + Integer.parseInt(msVersion);
409 } catch (NumberFormatException e) {
410 System.out.println(versionError);
411 return 0;
412 }
413 }
414 }
415 }
416}