You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/07/28 16:57:31 UTC

[tomcat] branch main updated: Remove the ExtensionValidator and associated classes

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new f7100b4  Remove the ExtensionValidator and associated classes
f7100b4 is described below

commit f7100b436c0ab2ef32f44bc03b841e79897cc710
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Jul 28 17:57:21 2021 +0100

    Remove the ExtensionValidator and associated classes
---
 TOMCAT-NEXT.txt                                    |   9 +-
 .../apache/catalina/core/LocalStrings.properties   |   1 -
 .../catalina/core/LocalStrings_fr.properties       |   1 -
 .../catalina/core/LocalStrings_ja.properties       |   1 -
 .../catalina/core/LocalStrings_ko.properties       |   1 -
 .../catalina/core/LocalStrings_zh_CN.properties    |   1 -
 java/org/apache/catalina/core/StandardContext.java |  16 -
 java/org/apache/catalina/core/StandardServer.java  |  30 --
 java/org/apache/catalina/util/Extension.java       | 310 ------------------
 .../apache/catalina/util/ExtensionValidator.java   | 360 ---------------------
 .../apache/catalina/util/LocalStrings.properties   |   5 -
 .../catalina/util/LocalStrings_cs.properties       |   2 -
 .../catalina/util/LocalStrings_de.properties       |   2 -
 .../catalina/util/LocalStrings_es.properties       |   5 -
 .../catalina/util/LocalStrings_fr.properties       |   5 -
 .../catalina/util/LocalStrings_ja.properties       |   5 -
 .../catalina/util/LocalStrings_ko.properties       |   5 -
 .../catalina/util/LocalStrings_ru.properties       |   2 -
 .../catalina/util/LocalStrings_zh_CN.properties    |   5 -
 .../org/apache/catalina/util/ManifestResource.java | 233 -------------
 java/org/apache/jasper/compiler/AntCompiler.java   |  19 --
 webapps/docs/changelog.xml                         |   5 +-
 22 files changed, 6 insertions(+), 1017 deletions(-)

diff --git a/TOMCAT-NEXT.txt b/TOMCAT-NEXT.txt
index f5329f6..735f1ba 100644
--- a/TOMCAT-NEXT.txt
+++ b/TOMCAT-NEXT.txt
@@ -27,14 +27,11 @@ Items carried over from the 9.0.x list:
 
 Deferred until 10.1.x:
 
- 1. Remove the ExtensionValidator and associated classes (assuming that the
-    minimum Java version is Java 9 or later).
-
- 2. Remove org.apache.tomcat.jni and replace with the minimum necessary to
+ 1. Remove org.apache.tomcat.jni and replace with the minimum necessary to
     interface with OpenSSL and clones.
     We might want to park this one until we see what is available direct from
     the JRE with project Panama.
 
- 3. Remove APR connector.
+ 2. Remove APR connector.
 
- 4. Review code forked from Commons projects and consider removing unused code.
+ 3. Review code forked from Commons projects and consider removing unused code.
diff --git a/java/org/apache/catalina/core/LocalStrings.properties b/java/org/apache/catalina/core/LocalStrings.properties
index f79faf3..345d197 100644
--- a/java/org/apache/catalina/core/LocalStrings.properties
+++ b/java/org/apache/catalina/core/LocalStrings.properties
@@ -173,7 +173,6 @@ standardContext.duplicateListener=The listener [{0}] is already configured for t
 standardContext.errorPage.error=Error page location [{0}] must start with a ''/''
 standardContext.errorPage.required=ErrorPage cannot be null
 standardContext.errorPage.warning=WARNING: Error page location [{0}] must start with a ''/'' in Servlet 2.4
-standardContext.extensionValidationError=Error while attempting to validate required application extensions
 standardContext.filterFail=One or more Filters failed to start. Full details will be found in the appropriate container log file
 standardContext.filterMap.either=Filter mapping must specify either a <url-pattern> or a <servlet-name>
 standardContext.filterMap.name=Filter mapping specifies an unknown filter name [{0}]
diff --git a/java/org/apache/catalina/core/LocalStrings_fr.properties b/java/org/apache/catalina/core/LocalStrings_fr.properties
index 0394d08..9c61af5 100644
--- a/java/org/apache/catalina/core/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/core/LocalStrings_fr.properties
@@ -173,7 +173,6 @@ standardContext.duplicateListener=L''écouteur [{0}] est déjà configuré pour
 standardContext.errorPage.error=La position de la page d''erreur (ErrorPage) [{0}] doit commencer par un ''/''
 standardContext.errorPage.required=La page d'erreur (ErrorPage) ne peut être nulle
 standardContext.errorPage.warning=WARNING : La position de la page d''erreur (ErrorPage) [{0}] doit commencer par un ''/'' dans l''API Servlet 2.4
-standardContext.extensionValidationError=Erreur lors de la validation des extensions requises par l'application
 standardContext.filterFail=Un ou plusieurs filtres n'ont pas pu démarrer, les détails sont dans le fichier log du conteneur
 standardContext.filterMap.either=L'association de filtre (filter mapping) doit indiquer soit une <url-pattern> soit une <servlet-name>
 standardContext.filterMap.name=L''association de filtre (filter mapping) indique un nom de filtre inconnu [{0}]
diff --git a/java/org/apache/catalina/core/LocalStrings_ja.properties b/java/org/apache/catalina/core/LocalStrings_ja.properties
index 2c4bc74..d1dc3b2 100644
--- a/java/org/apache/catalina/core/LocalStrings_ja.properties
+++ b/java/org/apache/catalina/core/LocalStrings_ja.properties
@@ -173,7 +173,6 @@ standardContext.duplicateListener=リスナー[{0}]は、すでにこのコン
 standardContext.errorPage.error=エラーページの位置 [{0}] は''/''で始まらなければいけません
 standardContext.errorPage.required=ErrorPage は null に出来ません
 standardContext.errorPage.warning=警告: Servlet 2.4ではエラーページの場所 [{0}] は''/''で始まらなければいけません
-standardContext.extensionValidationError=アプリケーション拡張に必要な検証を試行中のエラー
 standardContext.filterFail=1つまたは複数のフィルタを開始できませんでした。 完全な詳細は適切なコンテナログファイルにあります。
 standardContext.filterMap.either=フィルタマッピングは<url-pattern>又は<servlet-name>のどちらかを指定しなければいけません
 standardContext.filterMap.name=フィルタマッピングは未知のフィルタ名 [{0}] を指定しました
diff --git a/java/org/apache/catalina/core/LocalStrings_ko.properties b/java/org/apache/catalina/core/LocalStrings_ko.properties
index c848444..6aa8338 100644
--- a/java/org/apache/catalina/core/LocalStrings_ko.properties
+++ b/java/org/apache/catalina/core/LocalStrings_ko.properties
@@ -173,7 +173,6 @@ standardContext.duplicateListener=리스너 [{0}]이(가) 이미 이 컨텍스
 standardContext.errorPage.error=오류 페이지 위치 [{0}]은(는) 반드시 ''/''로 시작해야 합니다.
 standardContext.errorPage.required=ErrorPage는 널이어서는 안됩니다.
 standardContext.errorPage.warning=경고: Servlet 2.4에서 오류 페이지 위치 [{0}]은(는) 반드시 ''/''로 시작해야 합니다.
-standardContext.extensionValidationError=필수적으로 요구되는 애플리케이션 extension들이 유효한지 확인하려 시도하는 중 오류 발생
 standardContext.filterFail=하나 이상의 필터들이 시작하지 못했습니다. 모든 상세 사항은 적절한 컨테이너 로그 파일에서 찾을 수 있습니다.
 standardContext.filterMap.either=필터 매핑은 반드시 <url-pattern> 또는 <servlet-name>, 둘 중 하나를 지정해야 합니다.
 standardContext.filterMap.name=필터 매핑이 알 수 없는 필터 이름 [{0}]을(를) 지정하고 있습니다.
diff --git a/java/org/apache/catalina/core/LocalStrings_zh_CN.properties b/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
index c7bad2f..1c81baa 100644
--- a/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
+++ b/java/org/apache/catalina/core/LocalStrings_zh_CN.properties
@@ -174,7 +174,6 @@ standardContext.duplicateListener=当前上下文已经配置了监听器[{0}]
 standardContext.errorPage.error=错误页面位置[{0}]必须以“ /”开头
 standardContext.errorPage.required=ErrorPage不能为null
 standardContext.errorPage.warning=警告:在Servlet 2.4中,错误页位置 [{0}] 必须以"/"开头
-standardContext.extensionValidationError=尝试校验必需的应用程序扩展时发生错误
 standardContext.filterFail=一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到
 standardContext.filterMap.either=过滤器映射必须指定 <url-pattern> 或 <servlet-name>
 standardContext.filterMap.name=Filter mapping 指定了一个未知的 filter名称 [{0}]
diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java
index abdfced..7eeb1b2 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -106,7 +106,6 @@ import org.apache.catalina.session.StandardManager;
 import org.apache.catalina.util.CharsetMapper;
 import org.apache.catalina.util.ContextName;
 import org.apache.catalina.util.ErrorPageSupport;
-import org.apache.catalina.util.ExtensionValidator;
 import org.apache.catalina.util.URLEncoder;
 import org.apache.catalina.webresources.StandardRoot;
 import org.apache.juli.logging.Log;
@@ -4986,21 +4985,6 @@ public class StandardContext extends ContainerBase
         // Initialize character set mapper
         getCharsetMapper();
 
-        // Validate required extensions
-        boolean dependencyCheck = true;
-        try {
-            dependencyCheck = ExtensionValidator.validateApplication
-                (getResources(), this);
-        } catch (IOException ioe) {
-            log.error(sm.getString("standardContext.extensionValidationError"), ioe);
-            dependencyCheck = false;
-        }
-
-        if (!dependencyCheck) {
-            // do not make application available if dependency check fails
-            ok = false;
-        }
-
         // Reading the "catalina.useNaming" environment variable
         String useNamingProperty = System.getProperty("catalina.useNaming");
         if ((useNamingProperty != null)
diff --git a/java/org/apache/catalina/core/StandardServer.java b/java/org/apache/catalina/core/StandardServer.java
index d0ead54..b2684b5 100644
--- a/java/org/apache/catalina/core/StandardServer.java
+++ b/java/org/apache/catalina/core/StandardServer.java
@@ -25,9 +25,6 @@ import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.security.AccessControlException;
 import java.util.Random;
 import java.util.concurrent.ExecutionException;
@@ -50,7 +47,6 @@ import org.apache.catalina.Service;
 import org.apache.catalina.deploy.NamingResourcesImpl;
 import org.apache.catalina.mbeans.MBeanFactory;
 import org.apache.catalina.startup.Catalina;
-import org.apache.catalina.util.ExtensionValidator;
 import org.apache.catalina.util.LifecycleMBeanBase;
 import org.apache.catalina.util.ServerInfo;
 import org.apache.juli.logging.Log;
@@ -1011,32 +1007,6 @@ public final class StandardServer extends LifecycleMBeanBase implements Server {
         // Register the naming resources
         globalNamingResources.init();
 
-        // Populate the extension validator with JARs from common and shared
-        // class loaders
-        if (getCatalina() != null) {
-            ClassLoader cl = getCatalina().getParentClassLoader();
-            // Walk the class loader hierarchy. Stop at the system class loader.
-            // This will add the shared (if present) and common class loaders
-            while (cl != null && cl != ClassLoader.getSystemClassLoader()) {
-                if (cl instanceof URLClassLoader) {
-                    URL[] urls = ((URLClassLoader) cl).getURLs();
-                    for (URL url : urls) {
-                        if (url.getProtocol().equals("file")) {
-                            try {
-                                File f = new File (url.toURI());
-                                if (f.isFile() &&
-                                        f.getName().endsWith(".jar")) {
-                                    ExtensionValidator.addSystemResource(f);
-                                }
-                            } catch (URISyntaxException | IOException e) {
-                                // Ignore
-                            }
-                        }
-                    }
-                }
-                cl = cl.getParent();
-            }
-        }
         // Initialize our defined Services
         for (Service service : services) {
             service.init();
diff --git a/java/org/apache/catalina/util/Extension.java b/java/org/apache/catalina/util/Extension.java
deleted file mode 100644
index ccc77f1..0000000
--- a/java/org/apache/catalina/util/Extension.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.catalina.util;
-
-
-import java.util.StringTokenizer;
-
-
-/**
- * Utility class that represents either an available "Optional Package"
- * (formerly known as "Standard Extension") as described in the manifest
- * of a JAR file, or the requirement for such an optional package.  It is
- * used to support the requirements of the Servlet Specification, version
- * 2.3, related to providing shared extensions to all webapps.
- * <p>
- * In addition, static utility methods are available to scan a manifest
- * and return an array of either available or required optional modules
- * documented in that manifest.
- * <p>
- * For more information about optional packages, see the document
- * <em>Optional Package Versioning</em> in the documentation bundle for your
- * Java2 Standard Edition package, in file
- * <code>guide/extensions/versioning.html</code>.
- *
- * @author Craig McClanahan
- * @author Justyna Horwat
- * @author Greg Murray
- */
-public final class Extension {
-
-
-    // ------------------------------------------------------------- Properties
-
-
-    /**
-     * The name of the optional package being made available, or required.
-     */
-    private String extensionName = null;
-
-
-    public String getExtensionName() {
-        return this.extensionName;
-    }
-
-    public void setExtensionName(String extensionName) {
-        this.extensionName = extensionName;
-    }
-
-    /**
-     * The URL from which the most recent version of this optional package
-     * can be obtained if it is not already installed.
-     */
-    private String implementationURL = null;
-
-    public String getImplementationURL() {
-        return this.implementationURL;
-    }
-
-    public void setImplementationURL(String implementationURL) {
-        this.implementationURL = implementationURL;
-    }
-
-
-    /**
-     * The name of the company or organization that produced this
-     * implementation of this optional package.
-     */
-    private String implementationVendor = null;
-
-    public String getImplementationVendor() {
-        return this.implementationVendor;
-    }
-
-    public void setImplementationVendor(String implementationVendor) {
-        this.implementationVendor = implementationVendor;
-    }
-
-
-    /**
-     * The unique identifier of the company that produced the optional
-     * package contained in this JAR file.
-     */
-    private String implementationVendorId = null;
-
-    public String getImplementationVendorId() {
-        return this.implementationVendorId;
-    }
-
-    public void setImplementationVendorId(String implementationVendorId) {
-        this.implementationVendorId = implementationVendorId;
-    }
-
-
-    /**
-     * The version number (dotted decimal notation) for this implementation
-     * of the optional package.
-     */
-    private String implementationVersion = null;
-
-    public String getImplementationVersion() {
-        return this.implementationVersion;
-    }
-
-    public void setImplementationVersion(String implementationVersion) {
-        this.implementationVersion = implementationVersion;
-    }
-
-
-    /**
-     * The name of the company or organization that originated the
-     * specification to which this optional package conforms.
-     */
-    private String specificationVendor = null;
-
-    public String getSpecificationVendor() {
-        return this.specificationVendor;
-    }
-
-    public void setSpecificationVendor(String specificationVendor) {
-        this.specificationVendor = specificationVendor;
-    }
-
-
-    /**
-     * The version number (dotted decimal notation) of the specification
-     * to which this optional package conforms.
-     */
-    private String specificationVersion = null;
-
-    public String getSpecificationVersion() {
-        return this.specificationVersion;
-    }
-
-    public void setSpecificationVersion(String specificationVersion) {
-        this.specificationVersion = specificationVersion;
-    }
-
-
-    /**
-     * fulfilled is true if all the required extension dependencies have been
-     * satisfied
-     */
-    private boolean fulfilled = false;
-
-    public void setFulfilled(boolean fulfilled) {
-        this.fulfilled = fulfilled;
-    }
-
-    public boolean isFulfilled() {
-        return fulfilled;
-    }
-
-    // --------------------------------------------------------- Public Methods
-
-    /**
-     * Return <code>true</code> if the specified <code>Extension</code>
-     * (which represents an optional package required by this application)
-     * is satisfied by this <code>Extension</code> (which represents an
-     * optional package that is already installed.  Otherwise, return
-     * <code>false</code>.
-     *
-     * @param required Extension of the required optional package
-     * @return <code>true</code> if the extension is satisfied
-     */
-    public boolean isCompatibleWith(Extension required) {
-
-        // Extension Name must match
-        if (extensionName == null) {
-            return false;
-        }
-        if (!extensionName.equals(required.getExtensionName())) {
-            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;
-
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("Extension[");
-        sb.append(extensionName);
-        if (implementationURL != null) {
-            sb.append(", implementationURL=");
-            sb.append(implementationURL);
-        }
-        if (implementationVendor != null) {
-            sb.append(", implementationVendor=");
-            sb.append(implementationVendor);
-        }
-        if (implementationVendorId != null) {
-            sb.append(", implementationVendorId=");
-            sb.append(implementationVendorId);
-        }
-        if (implementationVersion != null) {
-            sb.append(", implementationVersion=");
-            sb.append(implementationVersion);
-        }
-        if (specificationVendor != null) {
-            sb.append(", specificationVendor=");
-            sb.append(specificationVendor);
-        }
-        if (specificationVersion != null) {
-            sb.append(", specificationVersion=");
-            sb.append(specificationVersion);
-        }
-        sb.append(']');
-        return sb.toString();
-    }
-
-
-    // -------------------------------------------------------- Private Methods
-
-
-
-    /**
-     * Return <code>true</code> if the first version number is greater than
-     * or equal to the second; otherwise return <code>false</code>.
-     *
-     * @param first First version number (dotted decimal)
-     * @param second Second version number (dotted decimal)
-     *
-     * @exception NumberFormatException on a malformed version number
-     */
-    private boolean isNewer(String first, String second)
-        throws NumberFormatException {
-
-        if ((first == null) || (second == null)) {
-            return false;
-        }
-        if (first.equals(second)) {
-            return true;
-        }
-
-        StringTokenizer fTok = new StringTokenizer(first, ".", true);
-        StringTokenizer sTok = new StringTokenizer(second, ".", true);
-        int fVersion = 0;
-        int sVersion = 0;
-        while (fTok.hasMoreTokens() || sTok.hasMoreTokens()) {
-            if (fTok.hasMoreTokens()) {
-                fVersion = Integer.parseInt(fTok.nextToken());
-            } else {
-                fVersion = 0;
-            }
-            if (sTok.hasMoreTokens()) {
-                sVersion = Integer.parseInt(sTok.nextToken());
-            } else {
-                sVersion = 0;
-            }
-            if (fVersion < sVersion) {
-                return false;
-            } else if (fVersion > sVersion) {
-                return true;
-            }
-            if (fTok.hasMoreTokens()) {
-                fTok.nextToken();
-            }
-            if (sTok.hasMoreTokens()) {
-                sTok.nextToken();
-            }
-        }
-
-        return true;  // Exact match
-
-    }
-
-
-}
diff --git a/java/org/apache/catalina/util/ExtensionValidator.java b/java/org/apache/catalina/util/ExtensionValidator.java
deleted file mode 100644
index 772f705..0000000
--- a/java/org/apache/catalina/util/ExtensionValidator.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.catalina.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.StringTokenizer;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-
-import org.apache.catalina.Context;
-import org.apache.catalina.WebResource;
-import org.apache.catalina.WebResourceRoot;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.res.StringManager;
-
-
-/**
- * Ensures that all extension dependencies are resolved for a WEB application
- * are met. This class builds a list of extensions available to an application
- * and then validates those extensions.
- *
- * See http://docs.oracle.com/javase/1.4.2/docs/guide/extensions/spec.html
- * for a detailed explanation of the extension mechanism in Java.
- *
- * @author Greg Murray
- * @author Justyna Horwat
- */
-public final class ExtensionValidator {
-
-    private static final Log log = LogFactory.getLog(ExtensionValidator.class);
-
-    /**
-     * The string resources for this package.
-     */
-    private static final StringManager sm =
-            StringManager.getManager("org.apache.catalina.util");
-
-    private static volatile List<Extension> containerAvailableExtensions = null;
-    private static final List<ManifestResource> containerManifestResources =
-            new ArrayList<>();
-
-
-    // ----------------------------------------------------- Static Initializer
-
-
-    /**
-     *  This static initializer loads the container level extensions that are
-     *  available to all web applications. This method scans all extension
-     *  directories available via the "java.ext.dirs" System property.
-     *
-     *  The System Class-Path is also scanned for jar files that may contain
-     *  available extensions.
-     */
-    static {
-
-        // check for container level optional packages
-        String systemClasspath = System.getProperty("java.class.path");
-
-        StringTokenizer strTok = new StringTokenizer(systemClasspath,
-                                                     File.pathSeparator);
-
-        // build a list of jar files in the classpath
-        while (strTok.hasMoreTokens()) {
-            String classpathItem = strTok.nextToken();
-            if (classpathItem.toLowerCase(Locale.ENGLISH).endsWith(".jar")) {
-                File item = new File(classpathItem);
-                if (item.isFile()) {
-                    try {
-                        addSystemResource(item);
-                    } catch (IOException e) {
-                        log.error(sm.getString
-                                  ("extensionValidator.failload", item), e);
-                    }
-                }
-            }
-        }
-
-        // add specified folders to the list
-        addFolderList("java.ext.dirs");
-    }
-
-
-    // --------------------------------------------------------- Public Methods
-
-
-    /**
-     * Runtime validation of a Web Application.
-     *
-     * This method uses JNDI to look up the resources located under a
-     * <code>DirContext</code>. It locates Web Application MANIFEST.MF
-     * file in the /META-INF/ directory of the application and all
-     * MANIFEST.MF files in each JAR file located in the WEB-INF/lib
-     * directory and creates an <code>ArrayList</code> of
-     * <code>ManifestResource</code> objects. These objects are then passed
-     * to the validateManifestResources method for validation.
-     *
-     * @param resources The resources configured for this Web Application
-     * @param context   The context from which the Logger and path to the
-     *                  application
-     *
-     * @return true if all required extensions satisfied
-     * @throws IOException Error reading resources needed for validation
-     */
-    public static synchronized boolean validateApplication(
-                                           WebResourceRoot resources,
-                                           Context context)
-                    throws IOException {
-
-        String appName = context.getName();
-        List<ManifestResource> appManifestResources = new ArrayList<>();
-
-        // Web application manifest
-        WebResource resource = resources.getResource("/META-INF/MANIFEST.MF");
-        if (resource.isFile()) {
-            try (InputStream inputStream = resource.getInputStream()) {
-                Manifest manifest = new Manifest(inputStream);
-                ManifestResource mre = new ManifestResource
-                    (sm.getString("extensionValidator.web-application-manifest"),
-                    manifest, ManifestResource.WAR);
-                appManifestResources.add(mre);
-            }
-        }
-
-        // Web application library manifests
-        WebResource[] manifestResources =
-                resources.getClassLoaderResources("/META-INF/MANIFEST.MF");
-        for (WebResource manifestResource : manifestResources) {
-            if (manifestResource.isFile()) {
-                // Primarily used for error reporting
-                String jarName = manifestResource.getURL().toExternalForm();
-                Manifest jmanifest = manifestResource.getManifest();
-                if (jmanifest != null) {
-                    ManifestResource mre = new ManifestResource(jarName,
-                            jmanifest, ManifestResource.APPLICATION);
-                    appManifestResources.add(mre);
-                }
-            }
-        }
-
-        return validateManifestResources(appName, appManifestResources);
-    }
-
-
-    /**
-     * Checks to see if the given system JAR file contains a MANIFEST, and adds
-     * it to the container's manifest resources.
-     *
-     * @param jarFile The system JAR whose manifest to add
-     * @throws IOException Error reading JAR file
-     */
-    public static void addSystemResource(File jarFile) throws IOException {
-        try (InputStream is = new FileInputStream(jarFile)) {
-            Manifest manifest = getManifest(is);
-            if (manifest != null) {
-                ManifestResource mre = new ManifestResource(jarFile.getAbsolutePath(), manifest,
-                        ManifestResource.SYSTEM);
-                containerManifestResources.add(mre);
-            }
-        }
-    }
-
-
-    // -------------------------------------------------------- Private Methods
-
-
-    /**
-     * Validates an <code>ArrayList</code> of <code>ManifestResource</code>
-     * objects. This method requires an application name (which is the
-     * context root of the application at runtime).
-     *
-     * <code>false</false> is returned if the extension dependencies
-     * represented by any given <code>ManifestResource</code> objects
-     * is not met.
-     *
-     * This method should also provide static validation of a Web Application
-     * if provided with the necessary parameters.
-     *
-     * @param appName The name of the Application that will appear in the
-     *                error messages
-     * @param resources A list of <code>ManifestResource</code> objects
-     *                  to be validated.
-     *
-     * @return true if manifest resource file requirements are met
-     */
-    private static boolean validateManifestResources(String appName,
-            List<ManifestResource> resources) {
-        boolean passes = true;
-        int failureCount = 0;
-        List<Extension> availableExtensions = null;
-
-        for (ManifestResource mre : resources) {
-            ArrayList<Extension> requiredList = mre.getRequiredExtensions();
-            if (requiredList == null) {
-                continue;
-            }
-
-            // build the list of available extensions if necessary
-            if (availableExtensions == null) {
-                availableExtensions = buildAvailableExtensionsList(resources);
-            }
-
-            // load the container level resource map if it has not been built
-            // yet
-            if (containerAvailableExtensions == null) {
-                containerAvailableExtensions
-                    = buildAvailableExtensionsList(containerManifestResources);
-            }
-
-            // iterate through the list of required extensions
-            for (Extension requiredExt : requiredList) {
-                boolean found = false;
-                // check the application itself for the extension
-                if (availableExtensions != null) {
-                    for (Extension targetExt : availableExtensions) {
-                        if (targetExt.isCompatibleWith(requiredExt)) {
-                            requiredExt.setFulfilled(true);
-                            found = true;
-                            break;
-                        }
-                    }
-                }
-                // check the container level list for the extension
-                if (!found && containerAvailableExtensions != null) {
-                    for (Extension targetExt : containerAvailableExtensions) {
-                        if (targetExt.isCompatibleWith(requiredExt)) {
-                            requiredExt.setFulfilled(true);
-                            found = true;
-                            break;
-                        }
-                    }
-                }
-                if (!found) {
-                    // Failure
-                    log.info(sm.getString(
-                        "extensionValidator.extension-not-found-error",
-                        appName, mre.getResourceName(),
-                        requiredExt.getExtensionName()));
-                    passes = false;
-                    failureCount++;
-                }
-            }
-        }
-
-        if (!passes) {
-            log.info(sm.getString(
-                     "extensionValidator.extension-validation-error", appName,
-                     failureCount + ""));
-        }
-
-        return passes;
-    }
-
-   /*
-    * Build this list of available extensions so that we do not have to
-    * re-build this list every time we iterate through the list of required
-    * extensions. All available extensions in all of the
-    * <code>ManifestResource</code> objects will be added to a
-    * <code>HashMap</code> which is returned on the first dependency list
-    * processing pass.
-    *
-    * The key is the name + implementation version.
-    *
-    * NOTE: A list is built only if there is a dependency that needs
-    * to be checked (performance optimization).
-    *
-    * @param resources A list of <code>ManifestResource</code> objects
-    *
-    * @return HashMap Map of available extensions
-    */
-    private static List<Extension> buildAvailableExtensionsList(
-            List<ManifestResource> resources) {
-
-        List<Extension> availableList = null;
-
-        for (ManifestResource mre : resources) {
-            ArrayList<Extension> list = mre.getAvailableExtensions();
-            if (list != null) {
-                for (Extension ext : list) {
-                    if (availableList == null) {
-                        availableList = new ArrayList<>();
-                        availableList.add(ext);
-                    } else {
-                        availableList.add(ext);
-                    }
-                }
-            }
-        }
-
-        return availableList;
-    }
-
-    /**
-     * Return the Manifest from a jar file or war file
-     *
-     * @param inStream Input stream to a WAR or JAR file
-     * @return The WAR's or JAR's manifest
-     */
-    private static Manifest getManifest(InputStream inStream) throws IOException {
-        Manifest manifest = null;
-        try (JarInputStream jin = new JarInputStream(inStream)) {
-            manifest = jin.getManifest();
-        }
-        return manifest;
-    }
-
-
-    /**
-     * Add the JARs specified to the extension list.
-     */
-    private static void addFolderList(String property) {
-
-        // get the files in the extensions directory
-        String extensionsDir = System.getProperty(property);
-        if (extensionsDir != null) {
-            StringTokenizer extensionsTok
-                = new StringTokenizer(extensionsDir, File.pathSeparator);
-            while (extensionsTok.hasMoreTokens()) {
-                File targetDir = new File(extensionsTok.nextToken());
-                if (!targetDir.isDirectory()) {
-                    continue;
-                }
-                File[] files = targetDir.listFiles();
-                if (files == null) {
-                    continue;
-                }
-                for (File file : files) {
-                    if (file.getName().toLowerCase(Locale.ENGLISH).endsWith(".jar") && file.isFile()) {
-                        try {
-                            addSystemResource(file);
-                        } catch (IOException e) {
-                            log.error(sm.getString("extensionValidator.failload", file), e);
-                        }
-                    }
-                }
-            }
-        }
-
-    }
-}
diff --git a/java/org/apache/catalina/util/LocalStrings.properties b/java/org/apache/catalina/util/LocalStrings.properties
index 9dcb2ff..7725828 100644
--- a/java/org/apache/catalina/util/LocalStrings.properties
+++ b/java/org/apache/catalina/util/LocalStrings.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=An exception occurs when running the PrivilegedExcept
 customObjectInputStream.logRequired=A valid logger is required for class name filtering with logging
 customObjectInputStream.nomatch=The class [{0}] did not match the regular expression [{1}] for classes allowed to be deserialized
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: Required extension [{2}] not found.
-extensionValidator.extension-validation-error=ExtensionValidator[{0}]: Failed to find [{1}] required extension(s).
-extensionValidator.failload=Failure loading extension [{0}]
-extensionValidator.web-application-manifest=Web Application Manifest
-
 introspection.classLoadFailed=Failed to load class [{0}]
 
 lifecycleBase.alreadyDestroyed=The destroy() method was called on component [{0}] after destroy() had already been called. The second call will be ignored.
diff --git a/java/org/apache/catalina/util/LocalStrings_cs.properties b/java/org/apache/catalina/util/LocalStrings_cs.properties
index 15a7609..9dced58 100644
--- a/java/org/apache/catalina/util/LocalStrings_cs.properties
+++ b/java/org/apache/catalina/util/LocalStrings_cs.properties
@@ -16,8 +16,6 @@
 customObjectInputStream.logRequired=Je vyžadován platný logger pro filtrování třídy s logováním
 customObjectInputStream.nomatch=Třída [{0}] neodpovídá regulárnímu výrazu [{1}] s definicí tříd povolených k deserializaci
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: Požadované rozšíření [{2}] nebylo nalezeno.
-
 introspection.classLoadFailed=Načtení třídy [{0}] selhalo
 
 netmask.cidrNegative=CIDR [{0}] je negativní
diff --git a/java/org/apache/catalina/util/LocalStrings_de.properties b/java/org/apache/catalina/util/LocalStrings_de.properties
index 3c50518..18d7386 100644
--- a/java/org/apache/catalina/util/LocalStrings_de.properties
+++ b/java/org/apache/catalina/util/LocalStrings_de.properties
@@ -16,8 +16,6 @@
 customObjectInputStream.logRequired=Ein gültiger Logger ist für Klassennamenfilterung mit Loggen nötig
 customObjectInputStream.nomatch=Die Klasse [{0}] wird nicht mit dem regulären Ausdruck [{1}] gefunden, der erlaubte deserialisierte Klassen bestimmt.
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: Benötigte Erweiterung [{2}] nicht gefunden
-
 introspection.classLoadFailed=Konnte Klasse [{0}] nicht laden
 
 lifecycleBase.initFail=Konnte Komponente [{0}] nicht initialisieren
diff --git a/java/org/apache/catalina/util/LocalStrings_es.properties b/java/org/apache/catalina/util/LocalStrings_es.properties
index 55a89a9..288b73f 100644
--- a/java/org/apache/catalina/util/LocalStrings_es.properties
+++ b/java/org/apache/catalina/util/LocalStrings_es.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=Una excepción se ha producido durante la ejecución
 customObjectInputStream.logRequired=Se requiere un logeador váliso para el nombre de la clase filtrado con logeo
 customObjectInputStream.nomatch=La clase  [{0}] no concuerda con la expresión regular [{1}] para clases que tienen permitido el deserializamiento
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: La extensión no encuentra el [{2}] requerido.
-extensionValidator.extension-validation-error=ExtensionValidator[{0}]: Imposible de hallar la(s) extension(es) [{1}] requerida(s).
-extensionValidator.failload=No pude cargar la extensión [{0}]
-extensionValidator.web-application-manifest=Manifiesto de Aplicación Web
-
 introspection.classLoadFailed=Fallo al cargar la clase [{0}]
 
 lifecycleBase.initFail=Fallo al iniciar el componente [{0}]
diff --git a/java/org/apache/catalina/util/LocalStrings_fr.properties b/java/org/apache/catalina/util/LocalStrings_fr.properties
index d9a7db9..64d4c33 100644
--- a/java/org/apache/catalina/util/LocalStrings_fr.properties
+++ b/java/org/apache/catalina/util/LocalStrings_fr.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=Une exception s'est produite lors de l'execution du b
 customObjectInputStream.logRequired=Un enregistreur ("logger") valide est requis pour filtrer par nom de classe
 customObjectInputStream.nomatch=La classe [{0}] n''est pas acceptée par l''expression régulière [{1}] qui autorise la désérialisation
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}] : L''extension requise [{2}] est introuvable.
-extensionValidator.extension-validation-error=ExtensionValidator[{0}] : Impossible de trouver [{1}] extension(s) requise(s).
-extensionValidator.failload=Erreur de chargement de l''extension [{0}]
-extensionValidator.web-application-manifest=Web Application Manifest
-
 introspection.classLoadFailed=Echec du chargement de la classe [{0}]
 
 lifecycleBase.alreadyDestroyed=La méthode destroy() a été appelée sur le composant [{0}] après que destroy() ait déjà été appelé, le deuxième appel sera ignoré
diff --git a/java/org/apache/catalina/util/LocalStrings_ja.properties b/java/org/apache/catalina/util/LocalStrings_ja.properties
index 012734c..f7d1f75 100644
--- a/java/org/apache/catalina/util/LocalStrings_ja.properties
+++ b/java/org/apache/catalina/util/LocalStrings_ja.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=PrivilegedExceptionActionブロックを実行中に
 customObjectInputStream.logRequired=ロギングによるクラス名のフィルタリングには有効なロガーが必要です
 customObjectInputStream.nomatch=クラス [{0}] はデシリアライズが許可されたクラス名の正規表現 [{1}] にマッチしません。
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: 必要な拡張 [{2}] が見つかりません。
-extensionValidator.extension-validation-error=ExtensionValidator[{0}]: 必要な拡張 [{1}] が見つかりません。
-extensionValidator.failload=拡張 [{0}] のロードに失敗しました
-extensionValidator.web-application-manifest=Webアプリケーションマニフェスト
-
 introspection.classLoadFailed=クラス [{0}] の読み込みに失敗しました。
 
 lifecycleBase.alreadyDestroyed=destroy()メソッドが既に呼び出された後で、コンポーネント[{0}]に対して呼び出されました。 2番目の呼び出しは無視されます。
diff --git a/java/org/apache/catalina/util/LocalStrings_ko.properties b/java/org/apache/catalina/util/LocalStrings_ko.properties
index 5f99267..6cf93df 100644
--- a/java/org/apache/catalina/util/LocalStrings_ko.properties
+++ b/java/org/apache/catalina/util/LocalStrings_ko.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=PrivilegedExceptionAction 블록을 실행하는 동
 customObjectInputStream.logRequired=로그를 남기면서 클래스 이름을 필터링 하기 위해서는 유효한 Logger가 필요합니다.
 customObjectInputStream.nomatch=클래스 [{0}]은(는), 역직렬화 되도록 허용된 클래스들의 정규식 패턴 [{1}]과(와) 부합되지 않습니다.
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}] : 필수 extension [{2}]을(를) 찾을 수 없습니다.
-extensionValidator.extension-validation-error=ExtensionValidator[{0}]: 필수 extension(들)을 찾는 과정에서 [{1}]번의 실패 발생
-extensionValidator.failload=Extension [{0}]을(를) 로드하는 중 실패
-extensionValidator.web-application-manifest=웹 애플리케이션 Manifest
-
 introspection.classLoadFailed=클래스 [{0}]을(를) 로드하지 못했습니다.
 
 lifecycleBase.alreadyDestroyed=이미 destroy() 메소드가 호출되었던 구성요소 [{0}]에서, 다시 destroy()가 호출되었습니다. 두번째 호출은 무시될 것입니다.
diff --git a/java/org/apache/catalina/util/LocalStrings_ru.properties b/java/org/apache/catalina/util/LocalStrings_ru.properties
index 1a64b87..9cdaa09 100644
--- a/java/org/apache/catalina/util/LocalStrings_ru.properties
+++ b/java/org/apache/catalina/util/LocalStrings_ru.properties
@@ -13,6 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]:  требуемое расширение [{2}] не найдено.
-
 introspection.classLoadFailed=Не возможно загрузить класс [{0}]
diff --git a/java/org/apache/catalina/util/LocalStrings_zh_CN.properties b/java/org/apache/catalina/util/LocalStrings_zh_CN.properties
index 5a40c92..aa80dea 100644
--- a/java/org/apache/catalina/util/LocalStrings_zh_CN.properties
+++ b/java/org/apache/catalina/util/LocalStrings_zh_CN.properties
@@ -18,11 +18,6 @@ SecurityUtil.doAsPrivilege=运行PrivilegedExceptionAction块时发生异常。
 customObjectInputStream.logRequired=使用日志记录进行类名过滤需要一个有效的日志记录器
 customObjectInputStream.nomatch=因为类允许被反序列化,类[{0}]未能匹配常规的表达式[{1}]
 
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: 请求的拓展[{2}]未找到。
-extensionValidator.extension-validation-error=扩展验证程序[{0}]:找不到[{1}]所需的扩展。
-extensionValidator.failload=加载扩展名[{0}]失败
-extensionValidator.web-application-manifest=web 应用程序清单
-
 introspection.classLoadFailed=加载 class [{0}] 失败
 
 lifecycleBase.alreadyDestroyed=在调用destroy()之后,在组件[{0}]上调用了destroy()方法。第二个呼叫将被忽略。
diff --git a/java/org/apache/catalina/util/ManifestResource.java b/java/org/apache/catalina/util/ManifestResource.java
deleted file mode 100644
index d4c80de..0000000
--- a/java/org/apache/catalina/util/ManifestResource.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.catalina.util;
-
-import java.util.ArrayList;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-
-/**
- *  Representation of a Manifest file and its available extensions and
- *  required extensions
- *
- * @author Greg Murray
- * @author Justyna Horwat
- */
-public class ManifestResource {
-
-    // ------------------------------------------------------------- Properties
-
-    // These are the resource types for determining effect error messages
-    public static final int SYSTEM = 1;
-    public static final int WAR = 2;
-    public static final int APPLICATION = 3;
-
-    private ArrayList<Extension> availableExtensions = null;
-    private ArrayList<Extension> requiredExtensions = null;
-
-    private final String resourceName;
-    private final int resourceType;
-
-    public ManifestResource(String resourceName, Manifest manifest,
-                            int resourceType) {
-        this.resourceName = resourceName;
-        this.resourceType = resourceType;
-        processManifest(manifest);
-    }
-
-    /**
-     * Gets the name of the resource
-     *
-     * @return The name of the resource
-     */
-    public String getResourceName() {
-        return resourceName;
-    }
-
-    /**
-     * Gets the list of available extensions
-     *
-     * @return List of available extensions
-     */
-    public ArrayList<Extension> getAvailableExtensions() {
-        return availableExtensions;
-    }
-
-    /**
-     * Gets the list of required extensions
-     *
-     * @return List of required extensions
-     */
-    public ArrayList<Extension> getRequiredExtensions() {
-        return requiredExtensions;
-    }
-
-    // --------------------------------------------------------- Public Methods
-
-    /**
-     * Gets the number of available extensions
-     *
-     * @return The number of available extensions
-     */
-    public int getAvailableExtensionCount() {
-        return (availableExtensions != null) ? availableExtensions.size() : 0;
-    }
-
-    /**
-     * Gets the number of required extensions
-     *
-     * @return The number of required extensions
-     */
-    public int getRequiredExtensionCount() {
-        return (requiredExtensions != null) ? requiredExtensions.size() : 0;
-    }
-
-    /**
-     * Returns <code>true</code> if all required extension dependencies
-     * have been meet for this <code>ManifestResource</code> object.
-     *
-     * @return boolean true if all extension dependencies have been satisfied
-     */
-    public boolean isFulfilled() {
-        if (requiredExtensions == null) {
-            return true;
-        }
-        for (Extension ext : requiredExtensions) {
-            if (!ext.isFulfilled()) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("ManifestResource[");
-        sb.append(resourceName);
-
-        sb.append(", isFulfilled=");
-        sb.append(isFulfilled() +"");
-        sb.append(", requiredExtensionCount =");
-        sb.append(getRequiredExtensionCount());
-        sb.append(", availableExtensionCount=");
-        sb.append(getAvailableExtensionCount());
-        switch (resourceType) {
-            case SYSTEM : sb.append(", resourceType=SYSTEM"); break;
-            case WAR : sb.append(", resourceType=WAR"); break;
-            case APPLICATION : sb.append(", resourceType=APPLICATION"); break;
-        }
-        sb.append(']');
-        return sb.toString();
-    }
-
-
-    // -------------------------------------------------------- Private Methods
-
-    private void processManifest(Manifest manifest) {
-        availableExtensions = getAvailableExtensions(manifest);
-        requiredExtensions = getRequiredExtensions(manifest);
-    }
-
-    /**
-     * Return the set of <code>Extension</code> objects representing optional
-     * packages that are required by the application associated with the
-     * specified <code>Manifest</code>.
-     *
-     * @param manifest Manifest to be parsed
-     *
-     * @return List of required extensions, or null if the application
-     * does not require any extensions
-     */
-    private ArrayList<Extension> getRequiredExtensions(Manifest manifest) {
-
-        Attributes attributes = manifest.getMainAttributes();
-        String names = attributes.getValue("Extension-List");
-        if (names == null) {
-            return null;
-        }
-
-        ArrayList<Extension> extensionList = new ArrayList<>();
-        names += " ";
-
-        while (true) {
-
-            int space = names.indexOf(' ');
-            if (space < 0) {
-                break;
-            }
-            String name = names.substring(0, space).trim();
-            names = names.substring(space + 1);
-
-            String value =
-                attributes.getValue(name + "-Extension-Name");
-            if (value == null) {
-                continue;
-            }
-            Extension extension = new Extension();
-            extension.setExtensionName(value);
-            extension.setImplementationURL
-                (attributes.getValue(name + "-Implementation-URL"));
-            extension.setImplementationVendorId
-                (attributes.getValue(name + "-Implementation-Vendor-Id"));
-            String version = attributes.getValue(name + "-Implementation-Version");
-            extension.setImplementationVersion(version);
-            extension.setSpecificationVersion
-                (attributes.getValue(name + "-Specification-Version"));
-            extensionList.add(extension);
-        }
-        return extensionList;
-    }
-
-    /**
-     * Return the set of <code>Extension</code> objects representing optional
-     * packages that are bundled with the application associated with the
-     * specified <code>Manifest</code>.
-     *
-     * @param manifest Manifest to be parsed
-     *
-     * @return List of available extensions, or null if the web application
-     * does not bundle any extensions
-     */
-    private ArrayList<Extension> getAvailableExtensions(Manifest manifest) {
-
-        Attributes attributes = manifest.getMainAttributes();
-        String name = attributes.getValue("Extension-Name");
-        if (name == null) {
-            return null;
-        }
-
-        ArrayList<Extension> extensionList = new ArrayList<>();
-
-        Extension extension = new Extension();
-        extension.setExtensionName(name);
-        extension.setImplementationURL(
-            attributes.getValue("Implementation-URL"));
-        extension.setImplementationVendor(
-            attributes.getValue("Implementation-Vendor"));
-        extension.setImplementationVendorId(
-            attributes.getValue("Implementation-Vendor-Id"));
-        extension.setImplementationVersion(
-            attributes.getValue("Implementation-Version"));
-        extension.setSpecificationVersion(
-            attributes.getValue("Specification-Version"));
-
-        extensionList.add(extension);
-
-        return extensionList;
-    }
-
-}
diff --git a/java/org/apache/jasper/compiler/AntCompiler.java b/java/org/apache/jasper/compiler/AntCompiler.java
index d81eaa1..bbd6d7c 100644
--- a/java/org/apache/jasper/compiler/AntCompiler.java
+++ b/java/org/apache/jasper/compiler/AntCompiler.java
@@ -272,25 +272,6 @@ public class AntCompiler extends Compiler {
         }
     }
 
-    private String quotePathList(String list) {
-        StringBuilder result = new StringBuilder(list.length() + 10);
-        StringTokenizer st = new StringTokenizer(list, File.pathSeparator);
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken();
-            if (token.indexOf(' ') == -1) {
-                result.append(token);
-            } else {
-                result.append('\"');
-                result.append(token);
-                result.append('\"');
-            }
-            if (st.hasMoreTokens()) {
-                result.append(File.pathSeparatorChar);
-            }
-        }
-        return result.toString();
-    }
-
 
     protected static class SystemLogHandler extends PrintStream {
 
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 4cbf894..b2bd7c8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -150,8 +150,9 @@
         increased to 11. (markt)
       </scode>
       <scode>
-        Remove all references to the endorsed standards override feature as it
-        is not supported in Java 11. (markt)
+        Remove all references to the endorsed standards override feature and the
+        specifying of optional packages (extensions) in the manifest as these
+        are not supported in Java 11. (markt)
       </scode>
     </changelog>
   </subsection>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org