kinman      2002/12/02 14:26:23

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        TldLocationsCache.java
  Log:
  - Patch by [EMAIL PROTECTED] (Petr Jiricka)
  
  Fix 14854: Allow redeploying tag libraries from the same jar,
  do not lock the jar files on Windows
  
  Revision  Changes    Path
  1.9       +50 -24    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TldLocationsCache.java
  
  Index: TldLocationsCache.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TldLocationsCache.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TldLocationsCache.java    9 Oct 2002 18:25:39 -0000       1.8
  +++ TldLocationsCache.java    2 Dec 2002 22:26:23 -0000       1.9
  @@ -134,15 +134,30 @@
   
       private boolean initialized;
       private ServletContext ctxt;
  +    private boolean redeployMode;
   
       //*********************************************************************
       // Constructor and Initilizations
       
       public TldLocationsCache(ServletContext ctxt) {
  +        this(ctxt, false);
  +    }
  +
  +    /** Constructs a new instance of TldLocationsCache. 
  +     * @param ctxt the servlet context of the web application in which Jasper 
  +     *   is running
  +     * @param redeployMode if true, then the compiler will allow redeploying 
  +     *   a tag library from the same jar, at the expense of slowing down the server 
  +     *   a bit. Note that this may only work on JDK 1.3.1_01a and later, because 
  +     *   of JDK bug 4211817 fixed in this release.
  +     *   If redeployMode is false, a faster but less capable mode will be used.
  +     */
  +    public TldLocationsCache(ServletContext ctxt, boolean redeployMode) {
           this.ctxt = ctxt;
  -     mappings = new Hashtable();
  -     tlds = new Hashtable();
  -     initialized = false;
  +        this.redeployMode = redeployMode;
  +        mappings = new Hashtable();
  +        tlds = new Hashtable();
  +        initialized = false;
       }
   
       private void init() {
  @@ -247,6 +262,9 @@
               url = new URL("jar:" + url.toString() + "!/");
               JarURLConnection conn =
                   (JarURLConnection) url.openConnection();
  +            if (redeployMode) {
  +                conn.setUseCaches(false);
  +            }
               jarFile = conn.getJarFile();
               Enumeration entries = jarFile.entries();
               while (entries.hasMoreElements()) {
  @@ -255,32 +273,40 @@
                   if (!name.startsWith("META-INF/")) continue;
                   if (!name.endsWith(".tld")) continue;
                   stream = jarFile.getInputStream(entry);
  -                String uri = parseTldForUri(resourcePath, stream);
  -                if (uri != null) {
  -                    mappings.put(uri, new String[]{ resourcePath, name });
  +                try {
  +                    String uri = parseTldForUri(resourcePath, stream);
  +                    if (uri != null) {
  +                        mappings.put(uri, new String[]{ resourcePath, name });
  +                    }
  +                }
  +                finally {
  +                    if (stream != null) {
  +                        try {
  +                            stream.close();
  +                        } catch (Throwable t) {}
  +                    }
                   }
               }
  -            // FIXME @@@
  -            // -- it seems that the JarURLConnection class caches JarFile 
  -            // objects for particular URLs, and there is no way to get 
  -            // it to release the cached entry, so
  -            // there's no way to redeploy from the same JAR file.  Wierd.
           } catch (Exception ex) {
  -            if (stream != null) {
  -                try {
  -                    stream.close();
  -                } catch (Throwable t) {
  -                 // ignore
  -             }
  -            }
  -            if (jarFile != null) {
  -                try {
  -                    jarFile.close();
  -                } catch (Throwable t) {
  -                 // ignore
  -             }
  +            if (!redeployMode) {
  +                // if not in redeploy mode, close the jar in case of an error
  +                if (jarFile != null) {
  +                    try {
  +                        jarFile.close();
  +                    } catch (Throwable t) { /* ignore */ }
  +                }
               }
            throw new JasperException(ex);
  +        }
  +        finally {
  +            if (redeployMode) {
  +                // if in redeploy mode, always close the jar
  +                if (jarFile != null) {
  +                    try {
  +                        jarFile.close();
  +                    } catch (Throwable t) { /* ignore */ }
  +                }
  +            }
           }
       }
   
  
  
  

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

Reply via email to