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]