Index: java/org/apache/catalina/util/Extension.java =================================================================== --- java/org/apache/catalina/util/Extension.java (revision 1740624) +++ java/org/apache/catalina/util/Extension.java (working copy) @@ -19,6 +19,7 @@ package org.apache.catalina.util; +import java.util.Objects; import java.util.StringTokenizer; @@ -248,7 +249,27 @@ } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Extension)) return false; + Extension extension = (Extension) o; + return Objects.equals(extensionName, extension.extensionName) && + Objects.equals(implementationURL, extension.implementationURL) && + Objects.equals(implementationVendor, extension.implementationVendor) && + Objects.equals(implementationVendorId, extension.implementationVendorId) && + Objects.equals(implementationVersion, extension.implementationVersion) && + Objects.equals(specificationVendor, extension.specificationVendor) && + Objects.equals(specificationVersion, extension.specificationVersion); + } + @Override + public int hashCode() { + return Objects.hash(extensionName, implementationURL, implementationVendor, implementationVendorId, + implementationVersion, specificationVendor, specificationVersion); + } + + // -------------------------------------------------------- Private Methods Index: java/org/apache/catalina/util/ExtensionValidator.java =================================================================== --- java/org/apache/catalina/util/ExtensionValidator.java (revision 1740624) +++ java/org/apache/catalina/util/ExtensionValidator.java (working copy) @@ -21,8 +21,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.Locale; +import java.util.Set; import java.util.StringTokenizer; import java.util.jar.JarInputStream; import java.util.jar.Manifest; @@ -56,10 +58,10 @@ private static final StringManager sm = StringManager.getManager("org.apache.catalina.util"); - private static volatile ArrayList containerAvailableExtensions = + private static volatile Set containerAvailableExtensions = null; - private static final ArrayList containerManifestResources = - new ArrayList<>(); + private static final Set containerManifestResources = + new HashSet<>(); // ----------------------------------------------------- Static Initializer @@ -129,7 +131,7 @@ throws IOException { String appName = context.getName(); - ArrayList appManifestResources = new ArrayList<>(); + Set appManifestResources = new HashSet<>(); // Web application manifest WebResource resource = resources.getResource("/META-INF/MANIFEST.MF"); @@ -206,15 +208,15 @@ * @return true if manifest resource file requirements are met */ private static boolean validateManifestResources(String appName, - ArrayList resources) { + Set resources) { boolean passes = true; int failureCount = 0; - ArrayList availableExtensions = null; + Set availableExtensions = null; Iterator it = resources.iterator(); while (it.hasNext()) { ManifestResource mre = it.next(); - ArrayList requiredList = mre.getRequiredExtensions(); + Set requiredList = mre.getRequiredExtensions(); if (requiredList == null) { continue; } @@ -299,21 +301,21 @@ * * @return HashMap Map of available extensions */ - private static ArrayList buildAvailableExtensionsList( - ArrayList resources) { + private static Set buildAvailableExtensionsList( + Set resources) { - ArrayList availableList = null; + Set availableList = null; Iterator it = resources.iterator(); while (it.hasNext()) { ManifestResource mre = it.next(); - ArrayList list = mre.getAvailableExtensions(); + Set list = mre.getAvailableExtensions(); if (list != null) { Iterator values = list.iterator(); while (values.hasNext()) { Extension ext = values.next(); if (availableList == null) { - availableList = new ArrayList<>(); + availableList = new HashSet<>(); availableList.add(ext); } else { availableList.add(ext); Index: java/org/apache/catalina/util/ManifestResource.java =================================================================== --- java/org/apache/catalina/util/ManifestResource.java (revision 1740624) +++ java/org/apache/catalina/util/ManifestResource.java (working copy) @@ -17,7 +17,10 @@ package org.apache.catalina.util; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; +import java.util.Objects; +import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -37,8 +40,8 @@ public static final int WAR = 2; public static final int APPLICATION = 3; - private ArrayList availableExtensions = null; - private ArrayList requiredExtensions = null; + private Set availableExtensions = null; + private Set requiredExtensions = null; private final String resourceName; private final int resourceType; @@ -64,7 +67,7 @@ * * @return List of available extensions */ - public ArrayList getAvailableExtensions() { + public Set getAvailableExtensions() { return availableExtensions; } @@ -73,7 +76,7 @@ * * @return List of required extensions */ - public ArrayList getRequiredExtensions() { + public Set getRequiredExtensions() { return requiredExtensions; } @@ -136,7 +139,23 @@ return (sb.toString()); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ManifestResource)) return false; + ManifestResource that = (ManifestResource) o; + return Objects.equals(availableExtensions, that.availableExtensions) && + Objects.equals(requiredExtensions, that.requiredExtensions) && + Objects.equals(resourceName, that.resourceName) && + resourceType == that.resourceType; + } + @Override + public int hashCode() { + return Objects.hash(availableExtensions, requiredExtensions, resourceName, resourceType); + } + + // -------------------------------------------------------- Private Methods private void processManifest(Manifest manifest) { @@ -154,7 +173,7 @@ * @return List of required extensions, or null if the application * does not require any extensions */ - private ArrayList getRequiredExtensions(Manifest manifest) { + private Set getRequiredExtensions(Manifest manifest) { Attributes attributes = manifest.getMainAttributes(); String names = attributes.getValue("Extension-List"); @@ -161,7 +180,7 @@ if (names == null) return null; - ArrayList extensionList = new ArrayList<>(); + Set extensionList = new HashSet<>(); names += " "; while (true) { @@ -201,7 +220,7 @@ * @return List of available extensions, or null if the web application * does not bundle any extensions */ - private ArrayList getAvailableExtensions(Manifest manifest) { + private Set getAvailableExtensions(Manifest manifest) { Attributes attributes = manifest.getMainAttributes(); String name = attributes.getValue("Extension-Name"); @@ -208,7 +227,7 @@ if (name == null) return null; - ArrayList extensionList = new ArrayList<>(); + Set extensionList = new HashSet<>(); Extension extension = new Extension(); extension.setExtensionName(name);