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 2012/10/24 00:38:18 UTC

svn commit: r1401503 [1/4] - in /tomcat/trunk: ./ java/org/apache/catalina/ java/org/apache/catalina/core/ java/org/apache/catalina/loader/ java/org/apache/catalina/mapper/ java/org/apache/catalina/servlets/ java/org/apache/catalina/startup/ java/org/a...

Author: markt
Date: Tue Oct 23 22:38:16 2012
New Revision: 1401503

URL: http://svn.apache.org/viewvc?rev=1401503&view=rev
Log:
Merge new resources implementation from sandbox/trunk-resources

Added:
    tomcat/trunk/java/org/apache/catalina/WebResource.java
      - copied unchanged from r1401258, tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResource.java
    tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java
      - copied, changed from r1401258, tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResourceRoot.java
    tomcat/trunk/java/org/apache/catalina/WebResourceSet.java
      - copied unchanged from r1401465, tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResourceSet.java
    tomcat/trunk/java/org/apache/catalina/webresources/
      - copied from r1401495, tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
    tomcat/trunk/test/org/apache/catalina/core/TesterContext.java
      - copied unchanged from r1401495, tomcat/sandbox/trunk-resources/test/org/apache/catalina/core/TesterContext.java
    tomcat/trunk/test/org/apache/catalina/webresources/
      - copied from r1401495, tomcat/sandbox/trunk-resources/test/org/apache/catalina/webresources/
    tomcat/trunk/test/webresources/
      - copied from r1401252, tomcat/sandbox/trunk-resources/test/webresources/
    tomcat/trunk/test/webresources/dir2/
      - copied from r1401465, tomcat/sandbox/trunk-resources/test/webresources/dir2/
Removed:
    tomcat/trunk/java/org/apache/catalina/loader/VirtualWebappLoader.java
    tomcat/trunk/java/org/apache/naming/resources/
    tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java
    tomcat/trunk/test/org/apache/naming/resources/TestProxyDirContext.java
Modified:
    tomcat/trunk/build.xml
    tomcat/trunk/java/org/apache/catalina/Context.java
    tomcat/trunk/java/org/apache/catalina/Loader.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/loader/LocalStrings_es.properties
    tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
    tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java
    tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java
    tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java
    tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
    tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java
    tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java
    tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
    tomcat/trunk/java/org/apache/catalina/util/ConcurrentDateFormat.java
    tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java
    tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java
    tomcat/trunk/java/org/apache/tomcat/JarScannerCallback.java
    tomcat/trunk/java/org/apache/tomcat/util/scan/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java
    tomcat/trunk/test/javax/el/TestCompositeELResolver.java
    tomcat/trunk/test/org/apache/catalina/core/TestStandardContextAliases.java
    tomcat/trunk/test/org/apache/catalina/loader/TestVirtualContext.java
    tomcat/trunk/test/org/apache/catalina/loader/TestVirtualWebappLoader.java
    tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java
    tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
    tomcat/trunk/test/org/apache/jasper/compiler/TestGenerator.java
    tomcat/trunk/test/org/apache/naming/resources/TestNamingContext.java
    tomcat/trunk/webapps/docs/changelog.xml
    tomcat/trunk/webapps/docs/config/context.xml
    tomcat/trunk/webapps/docs/config/loader.xml
    tomcat/trunk/webapps/docs/config/resources.xml
    tomcat/trunk/webapps/docs/security-howto.xml

Modified: tomcat/trunk/build.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/build.xml?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/build.xml (original)
+++ tomcat/trunk/build.xml Tue Oct 23 22:38:16 2012
@@ -492,6 +492,7 @@
         <!-- Exclude simple test files -->
         <exclude name="test/webapp-3.0/bug53257/*.txt"/>
         <exclude name="test/webapp-3.0-fragments/WEB-INF/classes/*.txt"/>
+        <exclude name="test/webresources/**"/>
       </fileset>
       <fileset dir="modules/jdbc-pool" >
         <exclude name=".*/**"/>

Modified: tomcat/trunk/java/org/apache/catalina/Context.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Context.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Context.java Tue Oct 23 22:38:16 2012
@@ -20,7 +20,6 @@ import java.net.URL;
 import java.util.Locale;
 import java.util.Set;
 
-import javax.naming.directory.DirContext;
 import javax.servlet.ServletContainerInitializer;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletRegistration;
@@ -1256,14 +1255,6 @@ public interface Context extends Contain
 
 
     /**
-     * Add a URL for a JAR that contains static resources in a
-     * META-INF/resources directory that should be included in the static
-     * resources for this context.
-     */
-    public void addResourceJarUrl(URL url);
-
-
-    /**
      * Add a ServletContainerInitializer instance to this web application.
      *
      * @param sci       The instance to add
@@ -1391,14 +1382,14 @@ public interface Context extends Contain
     /**
      * Return the Resources with which this Context is associated.
      */
-    public DirContext getResources();
+    public WebResourceRoot getResources();
 
     /**
      * Set the Resources object with which this Context is associated.
      *
      * @param resources The newly associated Resources
      */
-    public void setResources(DirContext resources);
+    public void setResources(WebResourceRoot resources);
 
     /**
      * Return the Manager with which this Context is associated.  If there is
@@ -1413,5 +1404,21 @@ public interface Context extends Contain
      * @param manager The newly associated Manager
      */
     public void setManager(Manager manager);
+
+    /**
+     * Sets the flag that indicates if /WEB-INF/classes should be treated like
+     * an exploded JAR and JAR resources made available as if they were in a
+     * JAR.
+     *
+     * @param addWebinfClassesResources The new value for the flag
+     */
+    public void setAddWebinfClassesResources(boolean addWebinfClassesResources);
+
+    /**
+     * Gets the flag that indicates if /WEB-INF/classes should be treated like
+     * an exploded JAR and JAR resources made available as if they were in a
+     * JAR.
+     */
+    public boolean getAddWebinfClassesResources();
 }
 

Modified: tomcat/trunk/java/org/apache/catalina/Loader.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Loader.java?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Loader.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Loader.java Tue Oct 23 22:38:16 2012
@@ -129,21 +129,6 @@ public interface Loader {
 
 
     /**
-     * Add a new repository to the set of repositories for this class loader.
-     *
-     * @param repository Repository to be added
-     */
-    public void addRepository(String repository);
-
-
-    /**
-     * Return the set of repositories defined for this class loader.
-     * If none are defined, a zero-length array is returned.
-     */
-    public String[] findRepositories();
-
-
-    /**
      * Has the internal repository associated with this Loader been modified,
      * such that the loaded classes should be reloaded?
      */

Copied: tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java (from r1401258, tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResourceRoot.java)
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java?p2=tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java&p1=tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResourceRoot.java&r1=1401258&r2=1401503&rev=1401503&view=diff
==============================================================================
--- tomcat/sandbox/trunk-resources/java/org/apache/catalina/WebResourceRoot.java (original)
+++ tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java Tue Oct 23 22:38:16 2012
@@ -67,7 +67,6 @@ import java.util.Set;
  * <li>Resource JARs         - Same feature but implemented using the same
  *                             mechanism as all the other additional
  *                             resources.</li>
- * <li>TODO                  - More to list here</li>
  * </ul>
  */
 /*

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Tue Oct 23 22:38:16 2012
@@ -19,7 +19,6 @@ package org.apache.catalina.core;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -34,9 +33,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.naming.Binding;
 import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration;
 import javax.servlet.RequestDispatcher;
@@ -62,14 +59,12 @@ import org.apache.catalina.Globals;
 import org.apache.catalina.Host;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Service;
+import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.deploy.FilterDef;
 import org.apache.catalina.mapper.MappingData;
-import org.apache.catalina.util.ResourceSet;
 import org.apache.catalina.util.ServerInfo;
-import org.apache.naming.resources.DirContextURLStreamHandler;
-import org.apache.naming.resources.Resource;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.CharChunk;
 import org.apache.tomcat.util.buf.MessageBytes;
@@ -518,27 +513,12 @@ public class ApplicationContext
         if (normPath == null)
             return (null);
 
-        DirContext resources = context.getResources();
+        WebResourceRoot resources = context.getResources();
         if (resources != null) {
-            String fullPath = context.getPath() + normPath;
-            String hostName = context.getParent().getName();
-            try {
-                resources.lookup(normPath);
-                URI uri = new URI("jndi", null, "", -1,
-                        getJNDIUri(hostName, fullPath), null, null);
-                return new URL(null, uri.toString(),
-                        new DirContextURLStreamHandler(resources));
-            } catch (NamingException e) {
-                // Ignore
-            } catch (Exception e) {
-                // Unexpected
-                log(sm.getString("applicationContext.lookup.error", path,
-                        getContextPath()), e);
-            }
+            return resources.getResource(normPath).getURL();
         }
 
-        return (null);
-
+        return null;
     }
 
 
@@ -563,29 +543,20 @@ public class ApplicationContext
         if (normalizedPath == null)
             return (null);
 
-        DirContext resources = context.getResources();
+        WebResourceRoot resources = context.getResources();
         if (resources != null) {
-            try {
-                Object resource = resources.lookup(normalizedPath);
-                if (resource instanceof Resource)
-                    return (((Resource) resource).streamContent());
-            } catch (NamingException e) {
-                // Ignore
-            } catch (Exception e) {
-                // Unexpected
-                log(sm.getString("applicationContext.lookup.error", path,
-                        getContextPath()), e);
-            }
+            return resources.getResource(normalizedPath).getInputStream();
         }
-        return (null);
 
+        return null;
     }
 
 
     /**
      * Return a Set containing the resource paths of resources member of the
      * specified collection. Each path will be a String starting with
-     * a "/" character. The returned set is immutable.
+     * a "/" character. Paths representing directories will end with a "/"
+     * character. The returned set is immutable.
      *
      * @param path Collection path
      */
@@ -605,33 +576,12 @@ public class ApplicationContext
         if (normalizedPath == null)
             return (null);
 
-        DirContext resources = context.getResources();
+        WebResourceRoot resources = context.getResources();
         if (resources != null) {
-            return (getResourcePathsInternal(resources, normalizedPath));
-        }
-        return (null);
-
-    }
-
-
-    /**
-     * Internal implementation of getResourcesPath() logic.
-     *
-     * @param resources Directory context to search
-     * @param path Collection path
-     */
-    private Set<String> getResourcePathsInternal(DirContext resources,
-            String path) {
-
-        ResourceSet<String> set = new ResourceSet<>();
-        try {
-            listCollectionPaths(set, resources, path);
-        } catch (NamingException e) {
-            return (null);
+            return resources.listWebAppPaths(normalizedPath);
         }
-        set.setLocked(true);
-        return (set);
 
+        return null;
     }
 
 
@@ -1529,47 +1479,6 @@ public class ApplicationContext
     }
 
     /**
-     * List resource paths (recursively), and store all of them in the given
-     * Set.
-     */
-    private static void listCollectionPaths(Set<String> set,
-            DirContext resources, String path) throws NamingException {
-
-        Enumeration<Binding> childPaths = resources.listBindings(path);
-        while (childPaths.hasMoreElements()) {
-            Binding binding = childPaths.nextElement();
-            String name = binding.getName();
-            StringBuilder childPath = new StringBuilder(path);
-            if (!"/".equals(path) && !path.endsWith("/"))
-                childPath.append("/");
-            childPath.append(name);
-            Object object = binding.getObject();
-            if (object instanceof DirContext) {
-                childPath.append("/");
-            }
-            set.add(childPath.toString());
-        }
-
-    }
-
-
-    /**
-     * Get full path, based on the host name and the context path.
-     */
-    private static String getJNDIUri(String hostName, String path) {
-        String result;
-
-        if (path.startsWith("/")) {
-            result = "/" + hostName + path;
-        } else {
-            result = "/" + hostName + "/" + path;
-        }
-
-        return result;
-    }
-
-
-    /**
      * Internal class used as thread-local storage when doing path
      * mapping during dispatch.
      */

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Tue Oct 23 22:38:16 2012
@@ -88,6 +88,7 @@ standardContext.applicationListener=Erro
 standardContext.applicationSkipped=Skipped installing application listeners due to previous error(s)
 standardContext.backgroundProcess.loader=Exception processing loader {0} background process
 standardContext.backgroundProcess.manager=Exception processing manager {0} background process
+standardContext.backgroundProcess.resources=Exception processing resources {0} background process
 standardContext.cluster.noManager=No manager found. Checking if cluster manager should be used. Cluster configured: [{0}], Application distributable: [{1}]
 standardContext.duplicateListener=The listener "{0}" is already configured for this context. The duplicate definition has been ignored.
 standardContext.errorPage.error=Error page location {0} must start with a ''/''

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Oct 23 22:38:16 2012
@@ -27,7 +27,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -48,9 +47,7 @@ import javax.management.NotificationBroa
 import javax.management.NotificationEmitter;
 import javax.management.NotificationFilter;
 import javax.management.NotificationListener;
-import javax.management.ObjectName;
 import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
 import javax.servlet.FilterConfig;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
@@ -87,6 +84,8 @@ import org.apache.catalina.Manager;
 import org.apache.catalina.Pipeline;
 import org.apache.catalina.Realm;
 import org.apache.catalina.Valve;
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.deploy.ApplicationParameter;
 import org.apache.catalina.deploy.ErrorPage;
@@ -108,19 +107,14 @@ import org.apache.catalina.util.ContextN
 import org.apache.catalina.util.ExtensionValidator;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.catalina.util.URLEncoder;
+import org.apache.catalina.webresources.StandardRoot;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.naming.ContextBindings;
-import org.apache.naming.resources.BaseDirContext;
-import org.apache.naming.resources.DirContextURLStreamHandler;
-import org.apache.naming.resources.FileDirContext;
-import org.apache.naming.resources.ProxyDirContext;
-import org.apache.naming.resources.WARDirContext;
 import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.JarScanner;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.IntrospectionUtils;
-import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.scan.StandardJarScanner;
 
 /**
@@ -667,17 +661,7 @@ public class StandardContext extends Con
     protected int cacheTTL = 5000;
 
 
-    /**
-     * List of resource aliases.
-     */
-    private String aliases = null;
-
-
-    private DirContext resources = null;
-    /**
-     * Non proxied resources.
-     */
-    private DirContext webappResources = null;
+    private WebResourceRoot resources;
     private final ReadWriteLock resourcesLock = new ReentrantReadWriteLock();
 
     private long startupTime;
@@ -877,12 +861,14 @@ public class StandardContext extends Con
     }
 
 
+    @Override
     public void setAddWebinfClassesResources(
             boolean addWebinfClassesResources) {
         this.addWebinfClassesResources = addWebinfClassesResources;
     }
 
 
+    @Override
     public boolean getAddWebinfClassesResources() {
         return addWebinfClassesResources;
     }
@@ -1157,56 +1143,6 @@ public class StandardContext extends Con
 
 
     /**
-     * Return the list of resource aliases.
-     */
-    public String getAliases() {
-        return this.aliases;
-    }
-
-
-    /**
-     * Add a URL for a JAR that contains static resources in a
-     * META-INF/resources directory that should be included in the static
-     * resources for this context.
-     */
-    @Override
-    public void addResourceJarUrl(URL url) {
-        DirContext webappResources = getWebappResources();
-        if (webappResources instanceof BaseDirContext) {
-            ((BaseDirContext) webappResources).addResourcesJar(url);
-        } else {
-            log.error(sm.getString("standardContext.noResourceJar", url,
-                    getName()));
-        }
-    }
-
-    /**
-     * Add a URL for a JAR that contains static resources in a
-     * META-INF/resources directory that should be included in the static
-     * resources for this context.
-     */
-    public void addResourcesDirContext(DirContext altDirContext) {
-        DirContext webappResources = getWebappResources();
-        if (webappResources instanceof BaseDirContext) {
-            ((BaseDirContext) webappResources).addAltDirContext(altDirContext);
-        } else {
-            log.error(sm.getString("standardContext.noResourceJar", altDirContext,
-                    getName()));
-        }
-    }
-
-    /**
-     * Set the current alias configuration. The list of aliases should be of the
-     * form "/aliasPath1=docBase1,/aliasPath2=docBase2" where aliasPathN must
-     * include a leading '/' and docBaseN must be an absolute path to either a
-     * .war file or a directory.
-     */
-    public void setAliases(String aliases) {
-        this.aliases = aliases;
-    }
-
-
-    /**
      * Add a ServletContainerInitializer instance to this web application.
      *
      * @param sci       The instance to add
@@ -2479,7 +2415,7 @@ public class StandardContext extends Con
 
 
     @Override
-    public DirContext getResources() {
+    public WebResourceRoot getResources() {
         Lock readLock = resourcesLock.readLock();
         readLock.lock();
         try {
@@ -2490,50 +2426,29 @@ public class StandardContext extends Con
     }
 
 
-    private DirContext getWebappResources() {
-        Lock readLock = resourcesLock.readLock();
-        readLock.lock();
-        try {
-            return webappResources;
-        } finally {
-            readLock.unlock();
-        }
-    }
-
-
     @Override
-    public void setResources(DirContext resources) {
+    public void setResources(WebResourceRoot resources) {
 
         Lock writeLock = resourcesLock.writeLock();
         writeLock.lock();
-        DirContext oldResources = null;
+        WebResourceRoot oldResources = null;
         try {
             if (getState().isAvailable()) {
                 throw new IllegalStateException
                     (sm.getString("standardContext.resources.started"));
             }
 
-            oldResources = this.webappResources;
+            oldResources = this.resources;
             if (oldResources == resources)
                 return;
 
-            if (resources instanceof BaseDirContext) {
-                // Caching
-                ((BaseDirContext) resources).setCached(isCachingAllowed());
-                ((BaseDirContext) resources).setCacheTTL(getCacheTTL());
-                ((BaseDirContext) resources).setCacheMaxSize(getCacheMaxSize());
-                ((BaseDirContext) resources).setCacheObjectMaxSize(
-                        getCacheObjectMaxSize());
-                // Alias support
-                ((BaseDirContext) resources).setAliases(getAliases());
+            this.resources = resources;
+            if (oldResources != null) {
+                oldResources.setContext(null);
             }
-            if (resources instanceof FileDirContext) {
-                ((FileDirContext) resources).setAllowLinking(isAllowLinking());
+            if (resources != null) {
+                resources.setContext(this);
             }
-            this.webappResources = resources;
-
-            // The proxied resources will be refreshed on start
-            this.resources = null;
 
             support.firePropertyChange("resources", oldResources,
                     resources);
@@ -4464,9 +4379,8 @@ public class StandardContext extends Con
      */
     @Override
     public String getRealPath(String path) {
-        DirContext webappResources = getWebappResources();
-        if (webappResources instanceof BaseDirContext) {
-            return ((BaseDirContext) webappResources).getRealPath(path);
+        if (resources != null) {
+            return resources.getResource(path).getCanonicalPath();
         }
         return null;
     }
@@ -4853,68 +4767,27 @@ public class StandardContext extends Con
      * Return <code>true</code> if initialization was successfull,
      * or <code>false</code> otherwise.
      */
-    public boolean resourcesStart() {
+    public boolean resourcesStart() throws LifecycleException {
 
         boolean ok = true;
 
-        Hashtable<String, String> env = new Hashtable<>();
-        if (getParent() != null)
-            env.put(ProxyDirContext.HOST, getParent().getName());
-        env.put(ProxyDirContext.CONTEXT, getName());
-
-        Lock writeLock = resourcesLock.writeLock();
-        writeLock.lock();
-        try {
-            ProxyDirContext proxyDirContext =
-                new ProxyDirContext(env, webappResources);
-            if (webappResources instanceof FileDirContext) {
-                ((FileDirContext) webappResources).setAllowLinking
-                    (isAllowLinking());
-            }
-            if (webappResources instanceof BaseDirContext) {
-                ((BaseDirContext) webappResources).setDocBase(getBasePath());
-                ((BaseDirContext) webappResources).setCached
-                    (isCachingAllowed());
-                ((BaseDirContext) webappResources).setCacheTTL(getCacheTTL());
-                ((BaseDirContext) webappResources).setCacheMaxSize
-                    (getCacheMaxSize());
-                ((BaseDirContext) webappResources).allocate();
-                // Alias support
-                ((BaseDirContext) webappResources).setAliases(getAliases());
+        resources.setAllowLinking(isAllowLinking());
 
-                if (effectiveMajorVersion >=3 && addWebinfClassesResources) {
-                    try {
-                        DirContext webInfCtx =
-                            (DirContext) webappResources.lookup(
-                                    "/WEB-INF/classes");
-                        // Do the lookup to make sure it exists
-                        webInfCtx.lookup("META-INF/resources");
-                        ((BaseDirContext) webappResources).addAltDirContext(
-                                webInfCtx);
-                    } catch (NamingException e) {
-                        // Doesn't exist - ignore and carry on
-                    }
-                }
+        resources.setCachingAllowed(isCachingAllowed());
+        resources.setCacheTtl(getCacheTTL());
+        resources.setCacheMaxSize(getCacheMaxSize());
+        resources.setCacheMaxObjectSize(getCacheObjectMaxSize());
+
+        resources.start();
+
+        if (effectiveMajorVersion >=3 && addWebinfClassesResources) {
+            WebResource webinfClassesResource = resources.getResource(
+                    "/WEB-INF/classes/META-INF/resources");
+            if (webinfClassesResource.isDirectory()) {
+                getResources().createWebResourceSet(
+                        WebResourceRoot.ResourceSetType.RESOURCE_JAR,
+                        webinfClassesResource.getURL(), "", "");
             }
-            // Register the cache in JMX
-            if (isCachingAllowed()) {
-                String contextName = getName();
-                if (!contextName.startsWith("/")) {
-                    contextName = "/" + contextName;
-                }
-                ObjectName resourcesName =
-                    new ObjectName(this.getDomain() + ":type=Cache,host="
-                                   + getHostname() + ",context=" + contextName);
-                Registry.getRegistry(null, null).registerComponent
-                    (proxyDirContext.getCache(), resourcesName, null);
-            }
-            this.resources = proxyDirContext;
-        } catch (Throwable t) {
-            ExceptionUtils.handleThrowable(t);
-            log.error(sm.getString("standardContext.resourcesStart"), t);
-            ok = false;
-        } finally {
-            writeLock.unlock();
         }
 
         return ok;
@@ -4932,33 +4805,12 @@ public class StandardContext extends Con
         writeLock.lock();
         try {
             if (resources != null) {
-                if (resources instanceof Lifecycle) {
-                    ((Lifecycle) resources).stop();
-                }
-                if (webappResources instanceof BaseDirContext) {
-                    ((BaseDirContext) webappResources).release();
-                }
-                // Unregister the cache in JMX
-                if (isCachingAllowed()) {
-                    String contextName = getName();
-                    if (!contextName.startsWith("/")) {
-                        contextName = "/" + contextName;
-                    }
-                    ObjectName resourcesName =
-                        new ObjectName(this.getDomain()
-                                       + ":type=Cache,host="
-                                       + getHostname() + ",context="
-                                       + contextName);
-                    Registry.getRegistry(null, null)
-                        .unregisterComponent(resourcesName);
-                }
+                resources.stop();
             }
-            this.resources = null;
         } catch (Throwable t) {
             ExceptionUtils.handleThrowable(t);
             log.error(sm.getString("standardContext.resourcesStop"), t);
             ok = false;
-            this.resources = null;
         } finally {
             writeLock.unlock();
         }
@@ -5040,16 +4892,12 @@ public class StandardContext extends Con
         }
 
         // Add missing components as necessary
-        DirContext webappResources = getWebappResources();
-        if (webappResources == null) {   // (1) Required by Loader
+        if (getResources() == null) {   // (1) Required by Loader
             if (log.isDebugEnabled())
                 log.debug("Configuring default Resources");
+
             try {
-                if ((getDocBase() != null) && (getDocBase().endsWith(".war")) &&
-                        (!(new File(getBasePath())).isDirectory()))
-                    setResources(new WARDirContext());
-                else
-                    setResources(new FileDirContext());
+                setResources(new StandardRoot(this));
             } catch (IllegalArgumentException e) {
                 log.error("Error initializing resources: " + e.getMessage());
                 ok = false;
@@ -5151,9 +4999,6 @@ public class StandardContext extends Con
                 Realm realm = getRealmInternal();
                 if ((realm != null) && (realm instanceof Lifecycle))
                     ((Lifecycle) realm).start();
-                DirContext resources = getResources();
-                if ((resources != null) && (resources instanceof Lifecycle))
-                    ((Lifecycle) resources).start();
 
                 // Notify our interested LifecycleListeners
                 fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null);
@@ -5503,9 +5348,6 @@ public class StandardContext extends Con
             if (context != null)
                 context.clearAttributes();
 
-            // Stop resources
-            resourcesStop();
-
             Realm realm = getRealmInternal();
             if ((realm != null) && (realm instanceof Lifecycle)) {
                 ((Lifecycle) realm).stop();
@@ -5519,6 +5361,9 @@ public class StandardContext extends Con
                 ((Lifecycle) loader).stop();
             }
 
+            // Stop resources
+            resourcesStop();
+
         } finally {
 
             // Unbinding thread
@@ -5595,6 +5440,10 @@ public class StandardContext extends Con
             ((Lifecycle) manager).destroy();
         }
 
+        if (resources != null) {
+            resources.destroy();
+        }
+
         super.destroyInternal();
     }
 
@@ -5620,6 +5469,16 @@ public class StandardContext extends Con
                         e);
             }
         }
+        WebResourceRoot resources = getResources();
+        if (resources != null) {
+            try {
+                resources.backgroundProcess();
+            } catch (Exception e) {
+                log.warn(sm.getString(
+                        "standardContext.backgroundProcess.resources",
+                        resources), e);
+            }
+        }
         super.backgroundProcess();
     }
 
@@ -5794,16 +5653,11 @@ public class StandardContext extends Con
         ClassLoader oldContextClassLoader =
             Thread.currentThread().getContextClassLoader();
 
-        if (getResources() == null)
-            return oldContextClassLoader;
-
         if (getLoader().getClassLoader() != null) {
             Thread.currentThread().setContextClassLoader
                 (getLoader().getClassLoader());
         }
 
-        DirContextURLStreamHandler.bindThread(getResources());
-
         if (isUseNaming()) {
             try {
                 ContextBindings.bindThread(this, this);
@@ -5814,7 +5668,6 @@ public class StandardContext extends Con
         }
 
         return oldContextClassLoader;
-
     }
 
 
@@ -5827,8 +5680,6 @@ public class StandardContext extends Con
             ContextBindings.unbindThread(this, this);
         }
 
-        DirContextURLStreamHandler.unbindThread();
-
         Thread.currentThread().setContextClassLoader(oldContextClassLoader);
     }
 
@@ -6233,6 +6084,10 @@ public class StandardContext extends Con
             namingResources.init();
         }
 
+        if (resources != null) {
+            resources.start();
+        }
+
         // Send j2ee.object.created notification
         if (this.getObjectName() != null) {
             Notification notification = new Notification("j2ee.object.created",

Modified: tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml Tue Oct 23 22:38:16 2012
@@ -70,10 +70,6 @@
                is="true"
                type="boolean"/>
 
-    <attribute name="aliases"
-               description="List of resource aliases"
-               type="java.lang.String" />
-
     <attribute name="altDDName"
                description="The alternate deployment descriptor name."
                type="java.lang.String" />

Modified: tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties Tue Oct 23 22:38:16 2012
@@ -13,12 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-virtualWebappLoader.token=Processing token [{0}]
-virtualWebappLoader.token.file=Adding location: [{0}]
-virtualWebappLoader.token.glob.dir=Listing files in a directory: [{0}]
-virtualWebappLoader.token.notDirectory=Path is skipped, because it does not exist or is not a directory: [{0}]
-virtualWebappLoader.token.notExists=Path is skipped, because it does not exist: [{0}]
-virtualWebappLoader.token.notFile=Path is skipped, because it does not exist or is not a file: [{0}]
 webappClassLoader.illegalJarPath=Illegal JAR entry detected with name {0}
 webappClassLoader.jdbcRemoveFailed=JDBC driver de-registration failed for web application [{0}]
 webappClassLoader.jdbcRemoveStreamError=Exception closing input stream during JDBC driver de-registration for web application [{0}]
@@ -53,4 +47,4 @@ webappLoader.starting=Starting this Load
 webappLoader.stopping=Stopping this Loader
 webappLoader.copyFailure=Failed to copy resources
 webappLoader.mkdirFailure=Failed to create destination directory to copy resources
-webappLoader.namingFailure=Failed to access resource {0}
+webappLoader.readFailure=Unable to read resource {0}

Modified: tomcat/trunk/java/org/apache/catalina/loader/LocalStrings_es.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/LocalStrings_es.properties?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/LocalStrings_es.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/LocalStrings_es.properties Tue Oct 23 22:38:16 2012
@@ -12,12 +12,6 @@
 # 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.
-virtualWebappLoader.token = Procesando ficha [{0}]
-virtualWebappLoader.token.file = A\u00F1adiendo localizaci\u00F3n\: [{0}]
-virtualWebappLoader.token.glob.dir = listando ficheros en un directorio\: [{0}]
-virtualWebappLoader.token.notDirectory = Se salta la ruta porque no existe o no es un directorio\: [{0}]
-virtualWebappLoader.token.notExists = Ruta saltada porque no existe\: [{0}]
-virtualWebappLoader.token.notFile = Se salta la ruta porque no exuste o no es un fichero\: [{0}]
 webappClassLoader.illegalJarPath = Detectada entrada ilegal de JAR con nombre {0}
 webappClassLoader.jdbcRemoveFailed = Ha fallado el desregistro del conductor JDBC para la aplicaci\u00F3n web [{0}]
 webappClassLoader.jdbcRemoveStreamError = Excepci\u00F3n al cerrar flujo de entrada durante desregistro de conductor JDBC para apliicaci\u00F3n web [{0}]
@@ -51,4 +45,3 @@ webappLoader.starting = Arrancando este 
 webappLoader.stopping = Parando este Cargador
 webappLoader.copyFailure = No pude copiar los recursos
 webappLoader.mkdirFailure = No pude crear directorio de destino para copiar los recursos
-webappLoader.namingFailure = No pude acceder al recurso {0}

Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=1401503&r1=1401502&r2=1401503&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Tue Oct 23 22:38:16 2012
@@ -14,8 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 package org.apache.catalina.loader;
 
 import java.io.ByteArrayInputStream;
@@ -60,21 +58,13 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 
-import javax.naming.Binding;
-import javax.naming.NameClassPair;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-
 import org.apache.catalina.Globals;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleListener;
 import org.apache.catalina.LifecycleState;
-import org.apache.naming.JndiPermission;
-import org.apache.naming.resources.ProxyDirContext;
-import org.apache.naming.resources.Resource;
-import org.apache.naming.resources.ResourceAttributes;
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.IntrospectionUtils;
 import org.apache.tomcat.util.res.StringManager;
@@ -267,7 +257,7 @@ public class WebappClassLoader
      * Associated directory context giving access to the resources in this
      * webapp.
      */
-    protected DirContext resources = null;
+    protected WebResourceRoot resources = null;
 
 
     /**
@@ -310,10 +300,9 @@ public class WebappClassLoader
 
 
     /**
-     * The list of local repositories, in the order they should be searched
-     * for locally loaded classes or resources.
+     * The local repository for locally loaded classes or resources.
      */
-    protected String[] repositories = new String[0];
+    protected String repository = null;
 
 
      /**
@@ -323,11 +312,11 @@ public class WebappClassLoader
 
 
     /**
-     * Repositories translated as path in the work directory (for Jasper
-     * originally), but which is used to generate fake URLs should getURLs be
+     * Repository translated as path in the work directory (for Jasper
+     * originally), but which is used to generate a fake URL should getURLs be
      * called.
      */
-    protected File[] files = new File[0];
+    protected File file = null;
 
 
     /**
@@ -416,16 +405,6 @@ public class WebappClassLoader
 
 
     /**
-     * Has external repositories.
-     */
-    protected boolean hasExternalRepositories = false;
-
-    /**
-     * Search external repositories first
-     */
-    protected boolean searchExternalFirst = false;
-
-    /**
      * need conversion for properties files
      */
     protected boolean needConvert = false;
@@ -484,38 +463,22 @@ public class WebappClassLoader
      */
     private boolean clearReferencesHttpClientKeepAliveThread = true;
 
-    /**
-     * Name of associated context used with logging and JMX to associate with
-     * the right web application. Particularly useful for the clear references
-     * messages. Defaults to unknown but if standard Tomcat components are used
-     * it will be updated during initialisation from the resources.
-     */
-    private String contextName = "unknown";
-
 
     // ------------------------------------------------------------- Properties
 
-
     /**
      * Get associated resources.
      */
-    public DirContext getResources() {
-
+    public WebResourceRoot getResources() {
         return this.resources;
-
     }
 
 
     /**
      * Set associated resources.
      */
-    public void setResources(DirContext resources) {
-
+    public void setResources(WebResourceRoot resources) {
         this.resources = resources;
-
-        if (resources instanceof ProxyDirContext) {
-            contextName = ((ProxyDirContext) resources).getContextName();
-        }
     }
 
 
@@ -523,9 +486,11 @@ public class WebappClassLoader
      * Return the context name for this class loader.
      */
     public String getContextName() {
-
-        return (this.contextName);
-
+        if (resources == null) {
+            return "Unknown";
+        } else {
+            return resources.getContext().getName();
+        }
     }
 
 
@@ -575,21 +540,6 @@ public class WebappClassLoader
     }
 
     /**
-     * @return Returns the searchExternalFirst.
-     */
-    public boolean getSearchExternalFirst() {
-        return searchExternalFirst;
-    }
-
-    /**
-     * @param searchExternalFirst Whether external repositories should be searched first
-     */
-    public void setSearchExternalFirst(boolean searchExternalFirst) {
-        this.searchExternalFirst = searchExternalFirst;
-    }
-
-
-    /**
      * If there is a Java SecurityManager create a read FilePermission
      * or JndiPermission for the file directory path.
      *
@@ -604,21 +554,13 @@ public class WebappClassLoader
 
         if (securityManager != null) {
             Permission permission = null;
-            if (path.startsWith("jndi:") || path.startsWith("jar:jndi:")) {
-                if (!path.endsWith("/")) {
-                    path = path + "/";
-                }
-                permission = new JndiPermission(path + "*");
-                addPermission(permission);
-            } else {
-                if (!path.endsWith(File.separator)) {
-                    permission = new FilePermission(path, "read");
-                    addPermission(permission);
-                    path = path + File.separator;
-                }
-                permission = new FilePermission(path + "-", "read");
+            if (!path.endsWith(File.separator)) {
+                permission = new FilePermission(path, "read");
                 addPermission(permission);
+                path = path + File.separator;
             }
+            permission = new FilePermission(path + "-", "read");
+            addPermission(permission);
         }
     }
 
@@ -797,42 +739,7 @@ public class WebappClassLoader
 
 
     /**
-     * Add a new repository to the set of places this ClassLoader can look for
-     * classes to be loaded.
-     *
-     * @param repository Name of a source of classes to be loaded, such as a
-     *  directory pathname, a JAR file pathname, or a ZIP file pathname
-     *
-     * @exception IllegalArgumentException if the specified repository is
-     *  invalid or does not exist
-     */
-    public void addRepository(String repository) {
-
-        // Ignore any of the standard repositories, as they are set up using
-        // either addJar or addRepository
-        if (repository.startsWith("/WEB-INF/lib")
-            || repository.startsWith("/WEB-INF/classes"))
-            return;
-
-        // Add this repository to our underlying class loader
-        try {
-            URL url = new URL(repository);
-            super.addURL(url);
-            hasExternalRepositories = true;
-            repositoryURLs = null;
-        } catch (MalformedURLException e) {
-            IllegalArgumentException iae = new IllegalArgumentException
-                ("Invalid repository: " + repository);
-            iae.initCause(e);
-            throw iae;
-        }
-
-    }
-
-
-    /**
-     * Add a new repository to the set of places this ClassLoader can look for
-     * classes to be loaded.
+     * Set the place this ClassLoader can look for classes to be loaded.
      *
      * @param repository Name of a source of classes to be loaded, such as a
      *  directory pathname, a JAR file pathname, or a ZIP file pathname
@@ -840,7 +747,7 @@ public class WebappClassLoader
      * @exception IllegalArgumentException if the specified repository is
      *  invalid or does not exist
      */
-    synchronized void addRepository(String repository, File file) {
+    synchronized void setRepository(String repository, File file) {
 
         // Note : There should be only one (of course), but I think we should
         // keep this a bit generic
@@ -851,24 +758,8 @@ public class WebappClassLoader
         if (log.isDebugEnabled())
             log.debug("addRepository(" + repository + ")");
 
-        int i;
-
-        // Add this repository to our internal list
-        String[] result = new String[repositories.length + 1];
-        for (i = 0; i < repositories.length; i++) {
-            result[i] = repositories[i];
-        }
-        result[repositories.length] = repository;
-        repositories = result;
-
-        // Add the file to the list
-        File[] result2 = new File[files.length + 1];
-        for (i = 0; i < files.length; i++) {
-            result2[i] = files[i];
-        }
-        result2[files.length] = file;
-        files = result2;
-
+        this.repository = repository;
+        this.file = file;
     }
 
 
@@ -902,31 +793,23 @@ public class WebappClassLoader
 
         }
 
-        try {
-
-            // Register the JAR for tracking
+        // Register the JAR for tracking
 
-            long lastModified =
-                ((ResourceAttributes) resources.getAttributes(jar))
-                .getLastModified();
-
-            String[] result = new String[paths.length + 1];
-            for (i = 0; i < paths.length; i++) {
-                result[i] = paths[i];
-            }
-            result[paths.length] = jar;
-            paths = result;
+        long lastModified = resources.getResource(jar).getLastModified();
 
-            long[] result3 = new long[lastModifiedDates.length + 1];
-            for (i = 0; i < lastModifiedDates.length; i++) {
-                result3[i] = lastModifiedDates[i];
-            }
-            result3[lastModifiedDates.length] = lastModified;
-            lastModifiedDates = result3;
+        String[] result = new String[paths.length + 1];
+        for (i = 0; i < paths.length; i++) {
+            result[i] = paths[i];
+        }
+        result[paths.length] = jar;
+        paths = result;
 
-        } catch (NamingException e) {
-            // Ignore
+        long[] result3 = new long[lastModifiedDates.length + 1];
+        for (i = 0; i < lastModifiedDates.length; i++) {
+            result3[i] = lastModifiedDates[i];
         }
+        result3[lastModifiedDates.length] = lastModified;
+        lastModifiedDates = result3;
 
         // If the JAR currently contains invalid classes, don't actually use it
         // for classloading
@@ -951,19 +834,6 @@ public class WebappClassLoader
 
 
     /**
-     * Return a String array of the current repositories for this class
-     * loader.  If there are no repositories, a zero-length array is
-     * returned.For security reason, returns a clone of the Array (since
-     * String are immutable).
-     */
-    public String[] findRepositories() {
-
-        return (repositories.clone());
-
-    }
-
-
-    /**
      * Have one or more classes or resources been modified so that a reload
      * is appropriate?
      */
@@ -983,21 +853,15 @@ public class WebappClassLoader
             length = length2;
 
         for (int i = 0; i < length; i++) {
-            try {
-                long lastModified =
-                    ((ResourceAttributes) resources.getAttributes(paths[i]))
-                    .getLastModified();
-                if (lastModified != lastModifiedDates[i]) {
-                    if( log.isDebugEnabled() )
-                        log.debug("  Resource '" + paths[i]
-                                  + "' was modified; Date is now: "
-                                  + new java.util.Date(lastModified) + " Was: "
-                                  + new java.util.Date(lastModifiedDates[i]));
-                    return (true);
-                }
-            } catch (NamingException e) {
-                log.error("    Resource '" + paths[i] + "' is missing");
-                return (true);
+            long lastModified =
+                    resources.getResource(paths[i]).getLastModified();
+            if (lastModified != lastModifiedDates[i]) {
+                if( log.isDebugEnabled() )
+                    log.debug("  Resource '" + paths[i]
+                              + "' was modified; Date is now: "
+                              + new java.util.Date(lastModified) + " Was: "
+                              + new java.util.Date(lastModifiedDates[i]));
+                return true;
             }
         }
 
@@ -1006,54 +870,41 @@ public class WebappClassLoader
         // Check if JARs have been added or removed
         if (getJarPath() != null) {
 
-            try {
-                NamingEnumeration<Binding> enumeration =
-                    resources.listBindings(getJarPath());
-                int i = 0;
-                while (enumeration.hasMoreElements() && (i < length)) {
-                    NameClassPair ncPair = enumeration.nextElement();
-                    String name = ncPair.getName();
-                    // Ignore non JARs present in the lib folder
-                    if (!name.endsWith(".jar"))
-                        continue;
-                    if (!name.equals(jarNames[i])) {
-                        // Missing JAR
-                        log.info("    Additional JARs have been added : '"
-                                 + name + "'");
-                        return (true);
-                    }
-                    i++;
-                }
-                if (enumeration.hasMoreElements()) {
-                    while (enumeration.hasMoreElements()) {
-                        NameClassPair ncPair = enumeration.nextElement();
-                        String name = ncPair.getName();
-                        // Additional non-JAR files are allowed
-                        if (name.endsWith(".jar")) {
-                            // There was more JARs
-                            log.info("    Additional JARs have been added");
-                            return (true);
-                        }
+            WebResource[] jars = resources.listResources(getJarPath());
+
+            int i = 0;
+            int j = 0;
+            for (; j < jars.length && i < length; j++) {
+                // Ignore non JARs present in the lib folder
+                String name = jars[j].getName();
+                if (!name.endsWith(".jar"))
+                    continue;
+                if (!name.equals(jarNames[i])) {
+                    // Missing JAR
+                    log.info("    Additional JARs have been added : '"
+                             + name + "'");
+                    return true;
+                }
+                i++;
+            }
+            if (j < jars.length ) {
+                for (; j < jars.length; j++) {
+                    // Additional non-JAR files are allowed
+                    if (jars[j].getName().endsWith(".jar")) {
+                        // There was more JARs
+                        log.info("    Additional JARs have been added");
+                        return true;
                     }
-                } else if (i < jarNames.length) {
-                    // There was less JARs
-                    log.info("    Additional JARs have been added");
-                    return (true);
                 }
-            } catch (NamingException e) {
-                if (log.isDebugEnabled())
-                    log.debug("    Failed tracking modifications of '"
-                        + getJarPath() + "'");
-            } catch (ClassCastException e) {
-                log.error("    Failed tracking modifications of '"
-                          + getJarPath() + "' : " + e.getMessage());
+            } else if (i < jarNames.length) {
+                // There was less JARs
+                log.info("    Additional JARs have been added");
+                return (true);
             }
-
         }
 
         // No classes have been modified
-        return (false);
-
+        return false;
     }
 
 
@@ -1065,19 +916,14 @@ public class WebappClassLoader
 
         StringBuilder sb = new StringBuilder("WebappClassLoader\r\n");
         sb.append("  context: ");
-        sb.append(contextName);
+        sb.append(getContextName());
         sb.append("\r\n");
         sb.append("  delegate: ");
         sb.append(delegate);
         sb.append("\r\n");
-        sb.append("  repositories:\r\n");
-        if (repositories != null) {
-            for (int i = 0; i < repositories.length; i++) {
-                sb.append("    ");
-                sb.append(repositories[i]);
-                sb.append("\r\n");
-            }
-        }
+        sb.append("  repository: ");
+        sb.append(repository);
+        sb.append("\r\n");
         if (this.parent != null) {
             sb.append("----------> Parent Classloader:\r\n");
             sb.append(this.parent.toString());
@@ -1092,17 +938,6 @@ public class WebappClassLoader
 
 
     /**
-     * Add the specified URL to the classloader.
-     */
-    @Override
-    protected void addURL(URL url) {
-        super.addURL(url);
-        hasExternalRepositories = true;
-        repositoryURLs = null;
-    }
-
-
-    /**
      * Expose this method for use by the unit tests.
      */
     protected final Class<?> doDefineClass(String name, byte[] b, int off, int len,
@@ -1151,55 +986,20 @@ public class WebappClassLoader
         try {
             if (log.isTraceEnabled())
                 log.trace("      findClassInternal(" + name + ")");
-            if (hasExternalRepositories && searchExternalFirst) {
-                try {
-                    clazz = super.findClass(name);
-                } catch(ClassNotFoundException cnfe) {
-                    // Ignore - will search internal repositories next
-                } catch(AccessControlException ace) {
-                    log.warn("WebappClassLoader.findClassInternal(" + name
-                            + ") security exception: " + ace.getMessage(), ace);
-                    throw new ClassNotFoundException(name, ace);
-                } catch (RuntimeException e) {
-                    if (log.isTraceEnabled())
-                        log.trace("      -->RuntimeException Rethrown", e);
-                    throw e;
-                }
-            }
-            if ((clazz == null)) {
-                try {
-                    clazz = findClassInternal(name);
-                } catch(ClassNotFoundException cnfe) {
-                    if (!hasExternalRepositories || searchExternalFirst) {
-                        throw cnfe;
-                    }
-                } catch(AccessControlException ace) {
-                    log.warn("WebappClassLoader.findClassInternal(" + name
-                            + ") security exception: " + ace.getMessage(), ace);
-                    throw new ClassNotFoundException(name, ace);
-                } catch (RuntimeException e) {
-                    if (log.isTraceEnabled())
-                        log.trace("      -->RuntimeException Rethrown", e);
-                    throw e;
-                }
-            }
-            if ((clazz == null) && hasExternalRepositories && !searchExternalFirst) {
-                try {
-                    clazz = super.findClass(name);
-                } catch(AccessControlException ace) {
-                    log.warn("WebappClassLoader.findClassInternal(" + name
-                            + ") security exception: " + ace.getMessage(), ace);
-                    throw new ClassNotFoundException(name, ace);
-                } catch (RuntimeException e) {
-                    if (log.isTraceEnabled())
-                        log.trace("      -->RuntimeException Rethrown", e);
-                    throw e;
-                }
-            }
-            if (clazz == null) {
+            try {
+                clazz = findClassInternal(name);
+            } catch(ClassNotFoundException cnfe) {
                 if (log.isDebugEnabled())
                     log.debug("    --> Returning ClassNotFoundException");
-                throw new ClassNotFoundException(name);
+                throw cnfe;
+            } catch(AccessControlException ace) {
+                log.warn("WebappClassLoader.findClassInternal(" + name
+                        + ") security exception: " + ace.getMessage(), ace);
+                throw new ClassNotFoundException(name, ace);
+            } catch (RuntimeException e) {
+                if (log.isTraceEnabled())
+                    log.trace("      -->RuntimeException Rethrown", e);
+                throw e;
             }
         } catch (ClassNotFoundException e) {
             if (log.isTraceEnabled())
@@ -1241,27 +1041,19 @@ public class WebappClassLoader
 
         URL url = null;
 
-        if (hasExternalRepositories && searchExternalFirst)
-            url = super.findResource(name);
-
-        if (url == null) {
-            ResourceEntry entry = resourceEntries.get(name);
-            if (entry == null) {
-                if (securityManager != null) {
-                    PrivilegedAction<ResourceEntry> dp =
-                        new PrivilegedFindResourceByName(name, name);
-                    entry = AccessController.doPrivileged(dp);
-                } else {
-                    entry = findResourceInternal(name, name);
-                }
-            }
-            if (entry != null) {
-                url = entry.source;
+        ResourceEntry entry = resourceEntries.get(name);
+        if (entry == null) {
+            if (securityManager != null) {
+                PrivilegedAction<ResourceEntry> dp =
+                    new PrivilegedFindResourceByName(name, name);
+                entry = AccessController.doPrivileged(dp);
+            } else {
+                entry = findResourceInternal(name, name);
             }
         }
-
-        if ((url == null) && hasExternalRepositories && !searchExternalFirst)
-            url = super.findResource(name);
+        if (entry != null) {
+            url = entry.source;
+        }
 
         if (log.isDebugEnabled()) {
             if (url != null)
@@ -1289,45 +1081,24 @@ public class WebappClassLoader
         if (log.isDebugEnabled())
             log.debug("    findResources(" + name + ")");
 
-        //we use a LinkedHashSet instead of a Vector to avoid duplicates with virtualmappings
         LinkedHashSet<URL> result = new LinkedHashSet<>();
 
         int jarFilesLength = jarFiles.length;
-        int repositoriesLength = repositories.length;
-
-        int i;
-
-        // Adding the results of a call to the superclass
-        if (hasExternalRepositories && searchExternalFirst) {
-
-            Enumeration<URL> otherResourcePaths = super.findResources(name);
 
-            while (otherResourcePaths.hasMoreElements()) {
-                result.add(otherResourcePaths.nextElement());
-            }
-
-        }
-        // Looking at the repositories
-        for (i = 0; i < repositoriesLength; i++) {
-            try {
-                String fullPath = repositories[i] + name;
-                resources.lookup(fullPath);
-                // Note : Not getting an exception here means the resource was
-                // found
-                try {
-                    result.add(getURI(new File(files[i], name)));
-                } catch (MalformedURLException e) {
-                    // Ignore
+        if (repository != null) {
+            // Looking at the repository
+            WebResource[] webResources = resources.getResources(repository + name);
+            for (WebResource webResource : webResources) {
+                if (webResource.exists()) {
+                    result.add(webResource.getURL());
                 }
-            } catch (NamingException e) {
-                // Ignore
             }
         }
 
         // Looking at the JAR files
         synchronized (jarFiles) {
             if (openJARs()) {
-                for (i = 0; i < jarFilesLength; i++) {
+                for (int i = 0; i < jarFilesLength; i++) {
                     JarEntry jarEntry = jarFiles[i].getJarEntry(name);
                     if (jarEntry != null) {
                         try {
@@ -1342,17 +1113,6 @@ public class WebappClassLoader
             }
         }
 
-        // Adding the results of a call to the superclass
-        if (hasExternalRepositories && !searchExternalFirst) {
-
-            Enumeration<URL> otherResourcePaths = super.findResources(name);
-
-            while (otherResourcePaths.hasMoreElements()) {
-                result.add(otherResourcePaths.nextElement());
-            }
-
-        }
-
         final Iterator<URL> iterator = result.iterator();
 
         return new Enumeration<URL>() {
@@ -1508,12 +1268,6 @@ public class WebappClassLoader
             if (log.isDebugEnabled())
                 log.debug("  --> Returning stream from local");
             stream = findLoadedResource(name);
-            try {
-                if (hasExternalRepositories && (stream == null))
-                    stream = url.openStream();
-            } catch (IOException e) {
-                // Ignore
-            }
             if (stream != null)
                 return (stream);
         }
@@ -1758,35 +1512,22 @@ public class WebappClassLoader
             return repositoryURLs.clone();
         }
 
-        URL[] external = super.getURLs();
+        int resultLength;
+        if (file == null) {
+            resultLength = jarRealFiles.length;
+        } else {
+            resultLength = jarRealFiles.length + 1;
+        }
 
-        int filesLength = files.length;
-        int jarFilesLength = jarRealFiles.length;
-        int externalsLength = external.length;
         int off = 0;
-        int i;
 
         try {
-
-            URL[] urls = new URL[filesLength + jarFilesLength + externalsLength];
-            if (searchExternalFirst) {
-                for (i = 0; i < externalsLength; i++) {
-                    urls[i] = external[i];
-                }
-                off = externalsLength;
-            }
-            for (i = 0; i < filesLength; i++) {
-                urls[off + i] = getURI(files[i]);
-            }
-            off += filesLength;
-            for (i = 0; i < jarFilesLength; i++) {
-                urls[off + i] = getURI(jarRealFiles[i]);
-            }
-            off += jarFilesLength;
-            if (!searchExternalFirst) {
-                for (i = 0; i < externalsLength; i++) {
-                    urls[off + i] = external[i];
-                }
+            URL[] urls = new URL[resultLength];
+            if (file != null) {
+                urls[off ++] = getURI(file);
+            }
+            for (File jarRealFile : jarRealFiles) {
+                urls[off++] = getURI(jarRealFile);
             }
 
             repositoryURLs = urls;
@@ -1901,12 +1642,9 @@ public class WebappClassLoader
 
         started = false;
 
-        int length = files.length;
-        for (int i = 0; i < length; i++) {
-            files[i] = null;
-        }
+        file = null;
 
-        length = jarFiles.length;
+        int length = jarFiles.length;
         for (int i = 0; i < length; i++) {
             try {
                 if (jarFiles[i] != null) {
@@ -1921,16 +1659,15 @@ public class WebappClassLoader
         notFoundResources.clear();
         resourceEntries.clear();
         resources = null;
-        repositories = null;
+        repository = null;
         repositoryURLs = null;
-        files = null;
+        file = null;
         jarFiles = null;
         jarRealFiles = null;
         jarPath = null;
         jarNames = null;
         lastModifiedDates = null;
         paths = null;
-        hasExternalRepositories = false;
         parent = null;
 
         permissionList.clear();
@@ -2068,14 +1805,14 @@ public class WebappClassLoader
                     "clearJdbcDriverRegistrations").invoke(obj);
             for (String name : driverNames) {
                 log.error(sm.getString("webappClassLoader.clearJdbc",
-                        contextName, name));
+                        getContextName(), name));
             }
         } catch (Exception e) {
             // So many things to go wrong above...
             Throwable t = ExceptionUtils.unwrapInvocationTargetException(e);
             ExceptionUtils.handleThrowable(t);
             log.warn(sm.getString(
-                    "webappClassLoader.jdbcRemoveFailed", contextName), t);
+                    "webappClassLoader.jdbcRemoveFailed", getContextName()), t);
         } finally {
             if (is != null) {
                 try {
@@ -2083,7 +1820,7 @@ public class WebappClassLoader
                 } catch (IOException ioe) {
                     log.warn(sm.getString(
                             "webappClassLoader.jdbcRemoveStreamError",
-                            contextName), ioe);
+                            getContextName()), ioe);
                 }
             }
         }
@@ -2263,10 +2000,10 @@ public class WebappClassLoader
 
                     if (isRequestThread(thread)) {
                         log.error(sm.getString("webappClassLoader.warnRequestThread",
-                                contextName, thread.getName()));
+                                getContextName(), thread.getName()));
                     } else {
                         log.error(sm.getString("webappClassLoader.warnThread",
-                                contextName, thread.getName()));
+                                getContextName(), thread.getName()));
                     }
 
                     // Don't try an stop the threads unless explicitly
@@ -2314,19 +2051,19 @@ public class WebappClassLoader
                     } catch (SecurityException e) {
                         log.warn(sm.getString(
                                 "webappClassLoader.stopThreadFail",
-                                thread.getName(), contextName), e);
+                                thread.getName(), getContextName()), e);
                     } catch (NoSuchFieldException e) {
                         log.warn(sm.getString(
                                 "webappClassLoader.stopThreadFail",
-                                thread.getName(), contextName), e);
+                                thread.getName(), getContextName()), e);
                     } catch (IllegalArgumentException e) {
                         log.warn(sm.getString(
                                 "webappClassLoader.stopThreadFail",
-                                thread.getName(), contextName), e);
+                                thread.getName(), getContextName()), e);
                     } catch (IllegalAccessException e) {
                         log.warn(sm.getString(
                                 "webappClassLoader.stopThreadFail",
-                                thread.getName(), contextName), e);
+                                thread.getName(), getContextName()), e);
                     }
 
                     // This method is deprecated and for good reason. This is
@@ -2408,7 +2145,7 @@ public class WebappClassLoader
             }
 
             log.error(sm.getString("webappClassLoader.warnTimerThread",
-                    contextName, thread.getName()));
+                    getContextName(), thread.getName()));
 
         } catch (Exception e) {
             // So many things to go wrong above...
@@ -2416,7 +2153,7 @@ public class WebappClassLoader
             ExceptionUtils.handleThrowable(t);
             log.warn(sm.getString(
                     "webappClassLoader.stopTimerThreadFail",
-                    thread.getName(), contextName), t);
+                    thread.getName(), getContextName()), t);
         }
     }
 
@@ -2461,25 +2198,25 @@ public class WebappClassLoader
             }
         } catch (SecurityException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (NoSuchFieldException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (ClassNotFoundException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (IllegalArgumentException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (IllegalAccessException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (InvocationTargetException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (NoSuchMethodException e) {
             log.warn(sm.getString("webappClassLoader.checkThreadLocalsForLeaksFail",
-                    contextName), e);
+                    getContextName()), e);
         }
     }
 
@@ -2513,7 +2250,7 @@ public class WebappClassLoader
                         }
                         if (potentialLeak) {
                             Object[] args = new Object[5];
-                            args[0] = contextName;
+                            args[0] = getContextName();
                             if (key != null) {
                                 args[1] = getPrettyClassName(key.getClass());
                                 try {
@@ -2683,19 +2420,19 @@ public class WebappClassLoader
             }
         } catch (ClassNotFoundException e) {
             log.info(sm.getString("webappClassLoader.clearRmiInfo",
-                    contextName), e);
+                    getContextName()), e);
         } catch (SecurityException e) {
             log.warn(sm.getString("webappClassLoader.clearRmiFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (NoSuchFieldException e) {
             log.warn(sm.getString("webappClassLoader.clearRmiFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (IllegalArgumentException e) {
             log.warn(sm.getString("webappClassLoader.clearRmiFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (IllegalAccessException e) {
             log.warn(sm.getString("webappClassLoader.clearRmiFail",
-                    contextName), e);
+                    getContextName()), e);
         }
     }
 
@@ -2760,30 +2497,30 @@ public class WebappClassLoader
             if (countRemoved > 0 && log.isDebugEnabled()) {
                 log.debug(sm.getString(
                         "webappClassLoader.clearReferencesResourceBundlesCount",
-                        Integer.valueOf(countRemoved), contextName));
+                        Integer.valueOf(countRemoved), getContextName()));
             }
         } catch (SecurityException e) {
             log.error(sm.getString(
                     "webappClassLoader.clearReferencesResourceBundlesFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (NoSuchFieldException e) {
             if (System.getProperty("java.vendor").startsWith("Sun")) {
                 log.error(sm.getString(
                 "webappClassLoader.clearReferencesResourceBundlesFail",
-                contextName), e);
+                getContextName()), e);
             } else {
                 log.debug(sm.getString(
                 "webappClassLoader.clearReferencesResourceBundlesFail",
-                contextName), e);
+                getContextName()), e);
             }
         } catch (IllegalArgumentException e) {
             log.error(sm.getString(
                     "webappClassLoader.clearReferencesResourceBundlesFail",
-                    contextName), e);
+                    getContextName()), e);
         } catch (IllegalAccessException e) {
             log.error(sm.getString(
                     "webappClassLoader.clearReferencesResourceBundlesFail",
-                    contextName), e);
+                    getContextName()), e);
         }
     }
 
@@ -2959,31 +2696,19 @@ public class WebappClassLoader
         boolean isClassResource = path.endsWith(".class");
 
         int jarFilesLength = jarFiles.length;
-        int repositoriesLength = repositories.length;
 
-        int i;
-
-        Resource resource = null;
+        WebResource resource = null;
 
         boolean fileNeedConvert = false;
 
-        for (i = 0; (entry == null) && (i < repositoriesLength); i++) {
-            try {
+        if (repository != null) {
+            String fullPath = repository + path;
+            resource = resources.getResource(fullPath);
 
-                String fullPath = repositories[i] + path;
+            if (resource.exists()) {
 
-                Object lookupResult = resources.lookup(fullPath);
-                if (lookupResult instanceof Resource) {
-                    resource = (Resource) lookupResult;
-                }
-
-                // Note : Not getting an exception here means the resource was
-                // found
-
-                ResourceAttributes attributes =
-                    (ResourceAttributes) resources.getAttributes(fullPath);
-                contentLength = (int) attributes.getContentLength();
-                String canonicalPath = attributes.getCanonicalPath();
+                contentLength = (int) resource.getContentLength();
+                String canonicalPath = resource.getCanonicalPath();
                 if (canonicalPath != null) {
                     // we create the ResourceEntry based on the information returned
                     // by the DirContext rather than just using the path to the
@@ -2993,52 +2718,39 @@ public class WebappClassLoader
                 } else {
                     // probably a resource not in the filesystem (e.g. in a
                     // packaged war)
-                    entry = findResourceInternal(files[i], path);
+                    entry = findResourceInternal(file, path);
                 }
-                entry.lastModified = attributes.getLastModified();
-
-                if (resource != null) {
-
+                entry.lastModified = resource.getLastModified();
 
-                    try {
-                        binaryStream = resource.streamContent();
-                    } catch (IOException e) {
-                        return null;
-                    }
+                binaryStream = resource.getInputStream();
 
-                    if (needConvert) {
-                        if (path.endsWith(".properties")) {
-                            fileNeedConvert = true;
-                        }
+                if (needConvert) {
+                    if (path.endsWith(".properties")) {
+                        fileNeedConvert = true;
                     }
+                }
 
-                    // Register the full path for modification checking
-                    // Note: Only syncing on a 'constant' object is needed
-                    synchronized (allPermission) {
-
-                        int j;
-
-                        long[] result2 =
-                            new long[lastModifiedDates.length + 1];
-                        for (j = 0; j < lastModifiedDates.length; j++) {
-                            result2[j] = lastModifiedDates[j];
-                        }
-                        result2[lastModifiedDates.length] = entry.lastModified;
-                        lastModifiedDates = result2;
+                // Register the full path for modification checking
+                // Note: Only syncing on a 'constant' object is needed
+                synchronized (allPermission) {
 
-                        String[] result = new String[paths.length + 1];
-                        for (j = 0; j < paths.length; j++) {
-                            result[j] = paths[j];
-                        }
-                        result[paths.length] = fullPath;
-                        paths = result;
+                    int j;
 
+                    long[] result2 =
+                        new long[lastModifiedDates.length + 1];
+                    for (j = 0; j < lastModifiedDates.length; j++) {
+                        result2[j] = lastModifiedDates[j];
                     }
+                    result2[lastModifiedDates.length] = entry.lastModified;
+                    lastModifiedDates = result2;
 
+                    String[] result = new String[paths.length + 1];
+                    for (j = 0; j < paths.length; j++) {
+                        result[j] = paths[j];
+                    }
+                    result[paths.length] = fullPath;
+                    paths = result;
                 }
-
-            } catch (NamingException e) {
-                // Ignore
             }
         }
 
@@ -3053,7 +2765,7 @@ public class WebappClassLoader
                 if (!openJARs()) {
                     return null;
                 }
-                for (i = 0; (entry == null) && (i < jarFilesLength); i++) {
+                for (int i = 0; (entry == null) && (i < jarFilesLength); i++) {
 
                     jarEntry = jarFiles[i].getJarEntry(path);
 



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