Author: markt Date: Sat Dec 31 05:26:41 2005 New Revision: 360278 URL: http://svn.apache.org/viewcvs?rev=360278&view=rev Log: Port fix for bug 37854 (extension compatibility checking too strict) from TC4. Also fixes following issues discovered during testing: - The unique ID used for an extension is not unique and since a vendor is not required to specify all the manifest attributes for an extension (the spec says should rather than must) a unique ID cannot be easily generated - Even if a unique ID could be generated for an installed extension you can not generate one for a required extension since some attributes are optional. This makes it impossible to search the installed extensions for a match to a required extension using a key.
Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/Extension.java tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ExtensionValidator.java tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ManifestResource.java Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/Extension.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/Extension.java?rev=360278&r1=360277&r2=360278&view=diff ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/Extension.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/Extension.java Sat Dec 31 05:26:41 2005 @@ -64,14 +64,6 @@ } /** - * UniqueId created by combining the extension name and implementation - * version. - */ - public String getUniqueId() { - return this.extensionName + this.implementationVersion; - } - - /** * The URL from which the most recent version of this optional package * can be obtained if it is not already installed. */ @@ -194,19 +186,28 @@ if (!extensionName.equals(required.getExtensionName())) return (false); - // Available specification version must be >= required - if (!isNewer(specificationVersion, required.getSpecificationVersion())) - return (false); - - // Implementation Vendor ID must match - if (implementationVendorId == null) - return (false); - if (!implementationVendorId.equals(required.getImplementationVendorId())) - return (false); - - // Implementation version must be >= required - if (!isNewer(implementationVersion, required.getImplementationVersion())) - return (false); + // If specified, available specification version must be >= required + if (required.getSpecificationVersion() != null) { + if (!isNewer(specificationVersion, + required.getSpecificationVersion())) + return (false); + } + + // If specified, Implementation Vendor ID must match + if (required.getImplementationVendorId() != null) { + if (implementationVendorId == null) + return (false); + if (!implementationVendorId.equals(required + .getImplementationVendorId())) + return (false); + } + + // If specified, Implementation version must be >= required + if (required.getImplementationVersion() != null) { + if (!isNewer(implementationVersion, + required.getImplementationVersion())) + return (false); + } // This available optional package satisfies the requirements return (true); Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ExtensionValidator.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ExtensionValidator.java?rev=360278&r1=360277&r2=360278&view=diff ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ExtensionValidator.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ExtensionValidator.java Sat Dec 31 05:26:41 2005 @@ -21,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.StringTokenizer; @@ -61,7 +60,7 @@ private static StringManager sm = StringManager.getManager("org.apache.catalina.util"); - private static HashMap containerAvailableExtensions = null; + private static ArrayList containerAvailableExtensions = null; private static ArrayList containerManifestResources = new ArrayList(); @@ -243,7 +242,7 @@ ArrayList resources) { boolean passes = true; int failureCount = 0; - HashMap availableExtensions = null; + ArrayList availableExtensions = null; Iterator it = resources.iterator(); while (it.hasNext()) { @@ -255,38 +254,46 @@ // build the list of available extensions if necessary if (availableExtensions == null) { - availableExtensions = buildAvailableExtensionsMap(resources); + availableExtensions = buildAvailableExtensionsList(resources); } // load the container level resource map if it has not been built // yet if (containerAvailableExtensions == null) { containerAvailableExtensions - = buildAvailableExtensionsMap(containerManifestResources); + = buildAvailableExtensionsList(containerManifestResources); } // iterate through the list of required extensions Iterator rit = requiredList.iterator(); while (rit.hasNext()) { + boolean found = false; Extension requiredExt = (Extension)rit.next(); - String extId = requiredExt.getUniqueId(); // check the applicaion itself for the extension - if (availableExtensions != null - && availableExtensions.containsKey(extId)) { - Extension targetExt = (Extension) - availableExtensions.get(extId); - if (targetExt.isCompatibleWith(requiredExt)) { - requiredExt.setFulfilled(true); - } + if (availableExtensions != null) { + Iterator ait = availableExtensions.iterator(); + while (ait.hasNext()) { + Extension targetExt = (Extension) ait.next(); + if (targetExt.isCompatibleWith(requiredExt)) { + requiredExt.setFulfilled(true); + found = true; + break; + } + } + } // check the container level list for the extension - } else if (containerAvailableExtensions != null - && containerAvailableExtensions.containsKey(extId)) { - Extension targetExt = (Extension) - containerAvailableExtensions.get(extId); - if (targetExt.isCompatibleWith(requiredExt)) { - requiredExt.setFulfilled(true); - } - } else { + if (!found && containerAvailableExtensions != null) { + Iterator cit = containerAvailableExtensions.iterator(); + while (cit.hasNext()) { + Extension targetExt = (Extension) cit.next(); + if (targetExt.isCompatibleWith(requiredExt)) { + requiredExt.setFulfilled(true); + found = true; + break; + } + } + } + if (!found) { // Failure log.info(sm.getString( "extensionValidator.extension-not-found-error", @@ -324,29 +331,29 @@ * * @return HashMap Map of available extensions */ - private static HashMap buildAvailableExtensionsMap(ArrayList resources) { + private static ArrayList buildAvailableExtensionsList(ArrayList resources) { - HashMap availableMap = null; + ArrayList availableList = null; Iterator it = resources.iterator(); while (it.hasNext()) { ManifestResource mre = (ManifestResource)it.next(); - HashMap map = mre.getAvailableExtensions(); - if (map != null) { - Iterator values = map.values().iterator(); + ArrayList list = mre.getAvailableExtensions(); + if (list != null) { + Iterator values = list.iterator(); while (values.hasNext()) { Extension ext = (Extension) values.next(); - if (availableMap == null) { - availableMap = new HashMap(); - availableMap.put(ext.getUniqueId(), ext); - } else if (!availableMap.containsKey(ext.getUniqueId())) { - availableMap.put(ext.getUniqueId(), ext); + if (availableList == null) { + availableList = new ArrayList(); + availableList.add(ext); + } else { + availableList.add(ext); } } } } - return availableMap; + return availableList; } /** Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ManifestResource.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ManifestResource.java?rev=360278&r1=360277&r2=360278&view=diff ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ManifestResource.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/util/ManifestResource.java Sat Dec 31 05:26:41 2005 @@ -15,7 +15,6 @@ */ package org.apache.catalina.util; -import java.util.HashMap; import java.util.Iterator; import java.util.jar.Manifest; import java.util.jar.Attributes; @@ -39,7 +38,7 @@ public static final int WAR = 2; public static final int APPLICATION = 3; - private HashMap availableExtensions = null; + private ArrayList availableExtensions = null; private ArrayList requiredExtensions = null; private String resourceName = null; @@ -62,11 +61,11 @@ } /** - * Gets the map of available extensions + * Gets the list of available extensions * - * @return Map of available extensions + * @return List of available extensions */ - public HashMap getAvailableExtensions() { + public ArrayList getAvailableExtensions() { return availableExtensions; } @@ -110,19 +109,6 @@ } /** - * Convienience method to check if this <code>ManifestResource</code> - * has an extension available. - * - * @param key extension identifier - * - * @return true if extension available - */ - public boolean containsExtension(String key) { - return (availableExtensions != null) ? - availableExtensions.containsKey(key) : false; - } - - /** * Returns <code>true</code> if all required extension dependencies * have been meet for this <code>ManifestResource</code> object. * @@ -222,17 +208,17 @@ * * @param manifest Manifest to be parsed * - * @return Map of available extensions, or null if the web application + * @return List of available extensions, or null if the web application * does not bundle any extensions */ - private HashMap getAvailableExtensions(Manifest manifest) { + private ArrayList getAvailableExtensions(Manifest manifest) { Attributes attributes = manifest.getMainAttributes(); String name = attributes.getValue("Extension-Name"); if (name == null) return null; - HashMap extensionMap = new HashMap(); + ArrayList extensionList = new ArrayList(); Extension extension = new Extension(); extension.setExtensionName(name); @@ -247,11 +233,9 @@ extension.setSpecificationVersion( attributes.getValue("Specification-Version")); - if (!extensionMap.containsKey(extension.getUniqueId())) { - extensionMap.put(extension.getUniqueId(), extension); - } + extensionList.add(extension); - return extensionMap; + return extensionList; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]