/*
* @(#)ExtensionInfo.java 1.11 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*
*/
package sun.misc;
import java.util.StringTokenizer;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
/**
* This class holds all necessary information to install or
* upgrade a extension on the user's disk
*
* @author Jerome Dochez
* @version 1.5, 02/02/00
*/
public class ExtensionInfo {
/**
* <p>
* public static values returned by the isCompatible method
* </p>
*/
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;
/**
* <p>
* attributes fully describer an extension. The underlying described
* extension may be installed and requested.
* <p>
*/
public String title;
public String name;
public String specVersion;
public String specVendor;
public String implementationVersion;
public String vendor;
public String vendorId;
public String url;
/**
* <p>
* Create a new unintialized extension information object
* </p>
*/
public ExtensionInfo() {
}
/**
* <p>
* Create and initialize an extension information object.
* The initialization uses the attributes passed as being
* the content of a manifest file to load the extension
* information from.
* Since manifest file may contain information on several
* extension they may depend on, the extension key parameter
* is prepanded to the attribute name to make the key used
* to retrieve the attribute from the manifest file
* <p>
* @param extensionKey unique extension key in the manifest
* @param attr Attributes of a manifest file
*/
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);
attrKey = s + Name.SPECIFICATION_TITLE.toString();
title = attr.getValue(attrKey);
attrKey = s + Name.SPECIFICATION_VERSION.toString();
specVersion = attr.getValue(attrKey);
attrKey = s + Name.SPECIFICATION_VERSION.toString();
specVersion = attr.getValue(attrKey);
attrKey = s + Name.IMPLEMENTATION_VERSION.toString();
implementationVersion = attr.getValue(attrKey);
attrKey = s + Name.IMPLEMENTATION_VENDOR.toString();
vendor = attr.getValue(attrKey);
attrKey = s + Name.IMPLEMENTATION_VENDOR_ID.toString();
vendorId = attr.getValue(attrKey);
attrKey =s + Name.IMPLEMENTATION_URL.toString();
url = attr.getValue(attrKey);
}
/**
* <p>
* @return true if the extension described by this extension information
* is compatible with the extension described by the extension
* information passed as a parameter
* </p>
*
* @param the requested extension information to compare to
*/
public int isCompatibleWith(ExtensionInfo ei) {
if (name == null || ei.name == null)
return INCOMPATIBLE;
if (name.compareTo(ei.name)==0) {
System.out.println("Potential match");
// is this true, if not spec version is specified, we consider
// the value as being "any".
if (specVersion == null || ei.specVersion == null)
return COMPATIBLE;
int version = compareExtensionVersion(specVersion, ei.specVersion);
if (version<0) {
// this extension specification is "older"
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
// implementation attributes
if (vendorId != null && ei.vendorId != null) {
// They care who provides the extension
if (vendorId.compareTo(ei.vendorId)!=0) {
// They want to use another vendor implementation
return REQUIRE_VENDOR_SWITCH;
} else {
// Vendor matches, let's see the implementation version
if (implementationVersion != null && ei.implementationVersion != null) {
// they care about the implementation version
version = compareExtensionVersion(implementationVersion, ei.implementationVersion);
if (version<0) {
// This extension is an older implementation
return REQUIRE_IMPLEMENTATION_UPGRADE;
}
}
}
}
// All othe cases, we consider the extensions to be compatible
return COMPATIBLE;
}
}
return INCOMPATIBLE;
}
/**
* <p>
* helper method to print sensible information on the undelying described
* extension
* </p>
*/
public String toString() {
return "Extension : " + title + "(" + name + "), spec version(" +
specVersion + "), impl version(" + implementationVersion +
") from " + vendor + "(" + vendorId + ")";
}
/*
* <p>
* helper method to compare two versions.
* version are in the x.y.z.t pattern.
* </p>
* @param source version to compare to
* @param target version used to compare against
* @return < 0 if source < version
* > 0 if source > version
* = 0 if source = version
*/
private int compareExtensionVersion(String source, String target)
throws NumberFormatException
{
StringTokenizer stk = new StringTokenizer(source, ".,");
StringTokenizer ttk = new StringTokenizer(target, ".,");
while(stk.hasMoreTokens() || ttk.hasMoreTokens()) {
int sver, tver;
if (stk.hasMoreTokens())
sver = Integer.parseInt(stk.nextToken());
else
sver = 0;
if (ttk.hasMoreTokens())
tver = Integer.parseInt(ttk.nextToken());
else
tver = 0;
if (sver<tver)
return -1;
if (sver>tver)
return 1;
// equality, continue with the next version number
}
// complete equality
return 0;
}
}