|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.misc; |
|
|
|
import java.util.StringTokenizer; |
|
import java.util.jar.Attributes; |
|
import java.util.jar.Attributes.Name; |
|
import java.util.ResourceBundle; |
|
import java.util.MissingResourceException; |
|
import java.text.MessageFormat; |
|
import java.lang.Character.*; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class ExtensionInfo { |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static final int COMPATIBLE = 0; |
|
public static final int REQUIRE_SPECIFICATION_UPGRADE = 1; |
|
public static final int REQUIRE_IMPLEMENTATION_UPGRADE = 2; |
|
public static final int REQUIRE_VENDOR_SWITCH = 3; |
|
public static final int INCOMPATIBLE = 4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public String title; |
|
public String name; |
|
public String specVersion; |
|
public String specVendor; |
|
public String implementationVersion; |
|
public String vendor; |
|
public String vendorId; |
|
public String url; |
|
|
|
|
|
private static final ResourceBundle rb = |
|
ResourceBundle.getBundle("sun.misc.resources.Messages"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public ExtensionInfo() { |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public ExtensionInfo(String extensionKey, Attributes attr) |
|
throws NullPointerException |
|
{ |
|
String s; |
|
if (extensionKey!=null) { |
|
s = extensionKey + "-"; |
|
} else { |
|
s =""; |
|
} |
|
|
|
String attrKey = s + Name.EXTENSION_NAME.toString(); |
|
name = attr.getValue(attrKey); |
|
if (name != null) |
|
name = name.trim(); |
|
|
|
attrKey = s + Name.SPECIFICATION_TITLE.toString(); |
|
title = attr.getValue(attrKey); |
|
if (title != null) |
|
title = title.trim(); |
|
|
|
attrKey = s + Name.SPECIFICATION_VERSION.toString(); |
|
specVersion = attr.getValue(attrKey); |
|
if (specVersion != null) |
|
specVersion = specVersion.trim(); |
|
|
|
attrKey = s + Name.SPECIFICATION_VENDOR.toString(); |
|
specVendor = attr.getValue(attrKey); |
|
if (specVendor != null) |
|
specVendor = specVendor.trim(); |
|
|
|
attrKey = s + Name.IMPLEMENTATION_VERSION.toString(); |
|
implementationVersion = attr.getValue(attrKey); |
|
if (implementationVersion != null) |
|
implementationVersion = implementationVersion.trim(); |
|
|
|
attrKey = s + Name.IMPLEMENTATION_VENDOR.toString(); |
|
vendor = attr.getValue(attrKey); |
|
if (vendor != null) |
|
vendor = vendor.trim(); |
|
|
|
attrKey = s + Name.IMPLEMENTATION_VENDOR_ID.toString(); |
|
vendorId = attr.getValue(attrKey); |
|
if (vendorId != null) |
|
vendorId = vendorId.trim(); |
|
|
|
attrKey =s + Name.IMPLEMENTATION_URL.toString(); |
|
url = attr.getValue(attrKey); |
|
if (url != null) |
|
url = url.trim(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public int isCompatibleWith(ExtensionInfo ei) { |
|
|
|
if (name == null || ei.name == null) |
|
return INCOMPATIBLE; |
|
if (name.compareTo(ei.name)==0) { |
|
// is this true, if not spec version is specified, we consider |
|
|
|
if (specVersion == null || ei.specVersion == null) |
|
return COMPATIBLE; |
|
|
|
int version = compareExtensionVersion(specVersion, ei.specVersion); |
|
if (version<0) { |
|
|
|
if (vendorId != null && ei.vendorId !=null) { |
|
if (vendorId.compareTo(ei.vendorId)!=0) { |
|
return REQUIRE_VENDOR_SWITCH; |
|
} |
|
} |
|
return REQUIRE_SPECIFICATION_UPGRADE; |
|
} else { |
|
// the extension spec is compatible, let's look at the |
|
|
|
if (vendorId != null && ei.vendorId != null) { |
|
|
|
if (vendorId.compareTo(ei.vendorId)!=0) { |
|
|
|
return REQUIRE_VENDOR_SWITCH; |
|
} else { |
|
|
|
if (implementationVersion != null && ei.implementationVersion != null) { |
|
|
|
version = compareExtensionVersion(implementationVersion, ei.implementationVersion); |
|
if (version<0) { |
|
|
|
return REQUIRE_IMPLEMENTATION_UPGRADE; |
|
} |
|
} |
|
} |
|
} |
|
|
|
return COMPATIBLE; |
|
} |
|
} |
|
return INCOMPATIBLE; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public String toString() { |
|
return "Extension : title(" + title + "), name(" + name + "), spec vendor(" + |
|
specVendor + "), spec version(" + specVersion + "), impl vendor(" + |
|
vendor + "), impl vendor id(" + vendorId + "), impl version(" + |
|
implementationVersion + "), impl url(" + url + ")"; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private int compareExtensionVersion(String source, String target) |
|
throws NumberFormatException |
|
{ |
|
source = source.toLowerCase(); |
|
target = target.toLowerCase(); |
|
|
|
return strictCompareExtensionVersion(source, target); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private int strictCompareExtensionVersion(String source, String target) |
|
throws NumberFormatException |
|
{ |
|
if (source.equals(target)) |
|
return 0; |
|
|
|
StringTokenizer stk = new StringTokenizer(source, ".,"); |
|
StringTokenizer ttk = new StringTokenizer(target, ".,"); |
|
|
|
|
|
int n = 0, m = 0, result = 0; |
|
|
|
|
|
if (stk.hasMoreTokens()) |
|
n = convertToken(stk.nextToken().toString()); |
|
|
|
|
|
if (ttk.hasMoreTokens()) |
|
m = convertToken(ttk.nextToken().toString()); |
|
|
|
if (n > m) |
|
return 1; |
|
else if (m > n) |
|
return -1; |
|
else |
|
{ |
|
|
|
int sIdx = source.indexOf("."); |
|
int tIdx = target.indexOf("."); |
|
|
|
if (sIdx == -1) |
|
sIdx = source.length() - 1; |
|
|
|
if (tIdx == -1) |
|
tIdx = target.length() - 1; |
|
|
|
return strictCompareExtensionVersion(source.substring(sIdx + 1), |
|
target.substring(tIdx + 1)); |
|
} |
|
} |
|
|
|
private int convertToken(String token) |
|
{ |
|
if (token == null || token.equals("")) |
|
return 0; |
|
|
|
int charValue = 0; |
|
int charVersion = 0; |
|
int patchVersion = 0; |
|
int strLength = token.length(); |
|
int endIndex = strLength; |
|
char lastChar; |
|
|
|
Object[] args = {name}; |
|
MessageFormat mf = new MessageFormat(rb.getString("optpkg.versionerror")); |
|
String versionError = mf.format(args); |
|
|
|
|
|
int prIndex = token.indexOf("-"); |
|
|
|
|
|
int patchIndex = token.indexOf("_"); |
|
|
|
if (prIndex == -1 && patchIndex == -1) |
|
{ |
|
|
|
try { |
|
return Integer.parseInt(token) * 100; |
|
} catch (NumberFormatException e) { |
|
System.out.println(versionError); |
|
return 0; |
|
} |
|
} |
|
else if (patchIndex != -1) |
|
{ |
|
|
|
int prversion; |
|
try { |
|
|
|
prversion = Integer.parseInt(token.substring(0, patchIndex)); |
|
|
|
|
|
lastChar = token.charAt(strLength-1); |
|
if (Character.isLetter(lastChar)) { |
|
|
|
charValue = Character.getNumericValue(lastChar); |
|
endIndex = strLength-1; |
|
|
|
|
|
patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex)); |
|
|
|
if (charValue >= Character.getNumericValue('a') && charValue <= Character.getNumericValue('z')) { |
|
|
|
charVersion = (patchVersion * 100) + charValue; |
|
} else { |
|
|
|
charVersion = 0; |
|
System.out.println(versionError); |
|
} |
|
} else { |
|
|
|
patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex)); |
|
} |
|
} catch (NumberFormatException e) { |
|
System.out.println(versionError); |
|
return 0; |
|
} |
|
return prversion * 100 + (patchVersion + charVersion); |
|
} |
|
else |
|
{ |
|
//This is a milestone release, either a early access, alpha, beta, or RC |
|
|
|
|
|
int mrversion; |
|
try { |
|
mrversion = Integer.parseInt(token.substring(0, prIndex)); |
|
} catch (NumberFormatException e) { |
|
System.out.println(versionError); |
|
return 0; |
|
} |
|
|
|
|
|
String prString = token.substring(prIndex + 1); |
|
|
|
|
|
String msVersion = ""; |
|
int delta = 0; |
|
|
|
if (prString.indexOf("ea") != -1) |
|
{ |
|
msVersion = prString.substring(2); |
|
delta = 50; |
|
} |
|
else if (prString.indexOf("alpha") != -1) |
|
{ |
|
msVersion = prString.substring(5); |
|
delta = 40; |
|
} |
|
else if (prString.indexOf("beta") != -1) |
|
{ |
|
msVersion = prString.substring(4); |
|
delta = 30; |
|
} |
|
else if (prString.indexOf("rc") != -1) |
|
{ |
|
msVersion = prString.substring(2); |
|
delta = 20; |
|
} |
|
|
|
if (msVersion == null || msVersion.equals("")) |
|
{ |
|
|
|
return mrversion * 100 - delta ; |
|
} |
|
else |
|
{ |
|
|
|
try { |
|
return mrversion * 100 - delta + Integer.parseInt(msVersion); |
|
} catch (NumberFormatException e) { |
|
System.out.println(versionError); |
|
return 0; |
|
} |
|
} |
|
} |
|
} |
|
} |