remm        2003/08/06 01:58:19

  Modified:    catalina/src/share/org/apache/catalina/loader
                        WebappClassLoader.java
  Log:
  - Fix problems with the Eclipse test case by extracting all non class resources
    from a JAR on access.
  - This of course has a performance penalty, but is the only way to have
    this use case work. It is not very valid, but I gave up trying to get people to
    change their code.
  - This is needed, because it is the only way to save valuable server resources
    (file descriptors and memory on Unix, plus JAR locking on Windows preventing
    webapp management without a Tomcat restart).
  
  Revision  Changes    Path
  1.18      +82 -15    
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java
  
  Index: WebappClassLoader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- WebappClassLoader.java    15 Jun 2003 07:22:16 -0000      1.17
  +++ WebappClassLoader.java    6 Aug 2003 08:58:19 -0000       1.18
  @@ -1079,29 +1079,15 @@
               // Locating the repository for special handling in the case 
               // of a JAR
               ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
  -            FileOutputStream os = null;
               try {
                   String repository = entry.codeBase.toString();
                   if (repository.endsWith(".jar")) {
                       // Copy binary content to the work directory if not present
                       File resourceFile = new File(loaderDir, name);
  -                    if (entry.lastModified > resourceFile.lastModified()) {
  -                        resourceFile.getParentFile().mkdirs();
  -                        os = new FileOutputStream(resourceFile);
  -                        os.write(entry.binaryContent);
  -                    }
                       url = resourceFile.toURL();
                   }
               } catch (Exception e) {
                   // Ignore
  -                e.printStackTrace();
  -            } finally {
  -                if (os != null) {
  -                    try {
  -                        os.close();
  -                    } catch (IOException ex) {
  -                    }
  -                }
               }
               if (log.isDebugEnabled())
                   log.debug("  --> Returning '" + url.toString() + "'");
  @@ -1529,6 +1515,10 @@
           permissionList.clear();
           loaderPC.clear();
   
  +        if (loaderDir != null) {
  +            deleteDir(loaderDir);
  +        }
  +
       }
   
   
  @@ -1815,6 +1805,58 @@
                       } catch (IOException e) {
                           return null;
                       }
  +
  +                    // Extract resources contained in JAR to the workdir
  +                    if (!(path.endsWith(".class"))) {
  +                        byte[] buf = new byte[1024];
  +                        File resourceFile = new File
  +                            (loaderDir, jarEntry.getName());
  +                        if (!resourceFile.exists()) {
  +                            Enumeration entries = jarFiles[i].entries();
  +                            while (entries.hasMoreElements()) {
  +                                JarEntry jarEntry2 = 
  +                                    (JarEntry) entries.nextElement();
  +                                if (!(jarEntry2.isDirectory()) 
  +                                    && (!jarEntry2.getName().endsWith
  +                                        (".class"))) {
  +                                    resourceFile = new File
  +                                        (loaderDir, jarEntry2.getName());
  +                                    resourceFile.getParentFile().mkdirs();
  +                                    FileOutputStream os = null;
  +                                    InputStream is = null;
  +                                    try {
  +                                        is = jarFiles[i].getInputStream
  +                                            (jarEntry2);
  +                                        os = new FileOutputStream
  +                                            (resourceFile);
  +                                        while (true) {
  +                                            int n = is.read(buf);
  +                                            if (n <= 0) {
  +                                                break;
  +                                            }
  +                                            os.write(buf, 0, n);
  +                                        }
  +                                    } catch (IOException e) {
  +                                        // Ignore
  +                                    } finally {
  +                                        try {
  +                                            if (is != null) {
  +                                                is.close();
  +                                            }
  +                                        } catch (IOException e) {
  +                                        }
  +                                        try {
  +                                            if (os != null) {
  +                                                os.close();
  +                                            }
  +                                        } catch (IOException e) {
  +                                        }
  +                                    }
  +                                }
  +                            }
  +                        }
  +                    }
  +
                   }
   
               }
  @@ -2078,6 +2120,31 @@
           throws MalformedURLException {
   
           return jdkCompat.getURI(file);
  +
  +    }
  +
  +
  +    /**
  +     * Delete the specified directory, including all of its contents and
  +     * subdirectories recursively.
  +     *
  +     * @param dir File object representing the directory to be deleted
  +     */
  +    protected static void deleteDir(File dir) {
  +
  +        String files[] = dir.list();
  +        if (files == null) {
  +            files = new String[0];
  +        }
  +        for (int i = 0; i < files.length; i++) {
  +            File file = new File(dir, files[i]);
  +            if (file.isDirectory()) {
  +                deleteDir(file);
  +            } else {
  +                file.delete();
  +            }
  +        }
  +        dir.delete();
   
       }
   
  
  
  

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

Reply via email to