remm        2003/06/12 15:41:19

  Modified:    catalina/src/share/org/apache/catalina/startup
                        TldConfig.java
  Log:
  - Replace JAR URL code with regular JAR files (as the CL is forced to generate
    JAR URLs).
  - Jasper apparently causes JAR locking.
  - Struts is locking iteslf up. My theory is that it is caused by loading up a DTD
    for validation by the XML parser through a JAR URL without setting caches to false.
    I'll investigate more.
  
  Revision  Changes    Path
  1.11      +39 -63    
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/TldConfig.java
  
  Index: TldConfig.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/TldConfig.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- TldConfig.java    24 Apr 2003 19:35:49 -0000      1.10
  +++ TldConfig.java    12 Jun 2003 22:41:19 -0000      1.11
  @@ -232,7 +232,7 @@
           }
           paths = globalJarPaths.iterator();
           while (paths.hasNext()) {
  -            tldScanJar((JarURLConnection) paths.next());
  +            tldScanJar((File) paths.next());
           }
   
           String list[] = getTldListeners();
  @@ -294,11 +294,11 @@
   
        paths = globalJarPaths.iterator();
        while (paths.hasNext()) {
  -         JarURLConnection conn = (JarURLConnection) paths.next();
  -         long lastM = conn.getLastModified();
  +         File jarFile = (File) paths.next();
  +         long lastM = jarFile.lastModified();
            if (lastM > lastModified) lastModified = lastM;
            if (log.isDebugEnabled()) {
  -             log.debug("Last modified " + conn.getJarFileURL().toString()
  +             log.debug("Last modified " + jarFile.getAbsolutePath()
                          + " " + lastM);
            }
        }
  @@ -438,33 +438,35 @@
           }
   
        URL url = context.getServletContext().getResource(resourcePath);
  -     if (url == null) {
  +        if (url == null) {
            throw new IllegalArgumentException
                (sm.getString("contextConfig.tldResourcePath",
                              resourcePath));
        }
  -     url = new URL("jar:" + url.toString() + "!/");
  -     JarURLConnection conn = (JarURLConnection) url.openConnection();
  -     conn.setUseCaches(false);
  -     tldScanJar(conn);
  +
  +        File file = new File(url.getFile());
  +        file = file.getCanonicalFile();
  +        tldScanJar(file);
  +
       }
   
  -    /*
  +
  +    /**
        * Scans all TLD entries in the given JAR for application listeners.
        *
        * @param conn URLConnection to the JAR file whose TLD entries are
        * scanned for application listeners
        */
  -    private void tldScanJar(JarURLConnection conn) throws Exception {
  +    private void tldScanJar(File file) throws Exception {
   
           JarFile jarFile = null;
           String name = null;
           InputStream inputStream = null;
   
  -     String jarPath = conn.getJarFileURL().toString();
  +     String jarPath = file.getAbsolutePath();
   
        try {
  -         jarFile = conn.getJarFile();
  +         jarFile = new JarFile(file);
               Enumeration entries = jarFile.entries();
               while (entries.hasMoreElements()) {
                   JarEntry entry = (JarEntry) entries.nextElement();
  @@ -512,6 +514,7 @@
           }
       }
   
  +
       /**
        * Scan the TLD contents in the specified input stream, and register
        * any application event listeners found there.  <b>NOTE</b> - It is
  @@ -692,7 +695,8 @@
           }
       }
   
  -    /*
  +
  +    /**
        * Returns the paths to all JAR files accessible to all parent
        * classloaders of the web application class loader.
        *
  @@ -703,60 +707,32 @@
        * <CATALINA_HOME>/common/lib).
        *
        * @return Set of paths to all JAR files accessible to all parent class
  -     * loaders of the web application class loader
  +     *         loaders of the web application class loader
        */
       private Set getGlobalJarPaths() throws IOException {
   
           Set globalJarPaths = new HashSet();
   
  -     ClassLoader loader = Thread.currentThread().getContextClassLoader();
  -     while (loader != null) {
  -         if (loader instanceof URLClassLoader) {
  -             URL[] urls = ((URLClassLoader) loader).getURLs();
  -             for (int i=0; i<urls.length; i++) {
  -                 JarURLConnection jarConn = null;
  -                 URLConnection conn = urls[i].openConnection();
  -                 if (conn instanceof JarURLConnection) {
  -                     jarConn = (JarURLConnection) conn;
  -                 } else {
  -                     String urlStr = urls[i].toString();
  -                     if (urlStr.startsWith("file:")
  -                             && urlStr.endsWith(".jar")) {
  -                         URL jarURL = new URL("jar:" + urlStr + "!/");
  -                         jarConn = (JarURLConnection) jarURL.openConnection();
  -                         try {
  -                             /*
  -                              * Call getJarFile() to see if JAR file exists
  -                              * (throws exception in case it doesn't)
  -                              */
  -                             jarConn.getJarFile();
  -                             /*
  -                              * JAR file exists.
  -                              * Need to create new JarURLConnection due to
  -                              * bug 4756443. If it were not for this bug,
  -                              * the sequence of calls in this try block
  -                              * would be as follows:
  -                              *   jarConn.setUseCaches(false);
  -                              *   jarConn.getJarFile();
  -                              *   globalJarPaths.add(jarConn);
  -                              */
  -                             jarConn = (JarURLConnection)
  -                                 jarURL.openConnection();
  -                             jarConn.setUseCaches(false);
  -                             globalJarPaths.add(jarConn);
  -                         } catch (Exception e) {
  -                             /*
  -                              * Ignore any JAR files that may have been
  -                              * specified on the class path but don't exist
  -                              */
  -                         }
  -                     }
  -                 }
  -             }
  -         }
  -         loader = loader.getParent();
  -     }
  +        ClassLoader loader = Thread.currentThread().getContextClassLoader();
  +        while (loader != null) {
  +            if (loader instanceof URLClassLoader) {
  +                URL[] urls = ((URLClassLoader) loader).getURLs();
  +                for (int i=0; i<urls.length; i++) {
  +                    // Expect file URLs
  +                    // This is definitely not as clean as using JAR URLs either
  +                    // over file or the custom jndi handler, but a lot less
  +                    // buggy overall
  +                    File file = new File(urls[i].getFile());
  +                    file = file.getCanonicalFile();
  +                    if ((file.exists()) 
  +                        && (file.getAbsolutePath().endsWith(".jar"))) {
  +                        globalJarPaths.add(file);
  +                    }
  +                }
  +            }
  +            loader = loader.getParent();
  +        }
   
  -     return globalJarPaths;
  +        return globalJarPaths;
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to