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]

Reply via email to