Author: markt Date: Tue Jan 27 19:38:10 2015 New Revision: 1655129 URL: http://svn.apache.org/r1655129 Log: Obtain JarFile from ArchiveResourceSet when required so useage can be tracked and the JarFile closed when it is no longer needed.
Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResource.java tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java tomcat/trunk/java/org/apache/catalina/webresources/JarResource.java tomcat/trunk/java/org/apache/catalina/webresources/JarWarResource.java Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResource.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResource.java?rev=1655129&r1=1655128&r2=1655129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResource.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResource.java Tue Jan 27 19:38:10 2015 @@ -22,7 +22,6 @@ import java.net.MalformedURLException; import java.net.URL; import java.security.cert.Certificate; import java.util.jar.JarEntry; -import java.util.jar.JarFile; import java.util.jar.Manifest; public abstract class AbstractArchiveResource extends AbstractResource { @@ -61,6 +60,10 @@ public abstract class AbstractArchiveRes } } + protected AbstractArchiveResourceSet getArchiveResourceSet() { + return archiveResourceSet; + } + protected final String getBase() { return archiveResourceSet.getBase(); } @@ -213,13 +216,11 @@ public abstract class AbstractArchiveRes protected class JarInputStreamWrapper extends InputStream { - private final JarFile jarFile; private final JarEntry jarEntry; private final InputStream is; - public JarInputStreamWrapper(JarFile jarFile, JarEntry jarEntry, InputStream is) { - this.jarFile = jarFile; + public JarInputStreamWrapper(JarEntry jarEntry, InputStream is) { this.jarEntry = jarEntry; this.is = is; } @@ -259,7 +260,7 @@ public abstract class AbstractArchiveRes public void close() throws IOException { // Closing the JarFile releases the file lock on the JAR and also // closes all input streams created from the JarFile. - jarFile.close(); + archiveResourceSet.closeJarFile(); } Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java?rev=1655129&r1=1655128&r2=1655129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java Tue Jan 27 19:38:10 2015 @@ -17,6 +17,7 @@ package org.apache.catalina.webresources; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; @@ -24,6 +25,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.jar.Manifest; import org.apache.catalina.WebResource; @@ -37,6 +39,11 @@ public abstract class AbstractArchiveRes private String baseUrlString; private Manifest manifest; + private JarFile archive = null; + private final Object archiveLock = new Object(); + private long archiveUseCount = 0; + private long archiveLastUsed = 0; + protected final void setManifest(Manifest manifest) { this.manifest = manifest; @@ -270,4 +277,36 @@ public abstract class AbstractArchiveRes throw new IllegalArgumentException( sm.getString("abstractArchiveResourceSet.setReadOnlyFalse")); } + + protected JarFile openJarFile() throws IOException { + synchronized (archiveLock) { + if (archive == null) { + archive = new JarFile(getBase()); + } + archiveUseCount++; + archiveLastUsed = System.currentTimeMillis(); + return archive; + } + } + + protected void closeJarFile() { + synchronized (archiveLock) { + archiveUseCount--; + } + } + + @Override + public void backgroundProcess() { + synchronized (archiveLock) { + if (archive != null && archiveUseCount == 0 && + (System.currentTimeMillis() - archiveLastUsed) > 1000) { + try { + archive.close(); + } catch (IOException e) { + // Log at least WARN + } + archive = null; + } + } + } } Modified: tomcat/trunk/java/org/apache/catalina/webresources/JarResource.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarResource.java?rev=1655129&r1=1655128&r2=1655129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/JarResource.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/JarResource.java Tue Jan 27 19:38:10 2015 @@ -40,11 +40,11 @@ public class JarResource extends Abstrac @Override protected JarInputStreamWrapper getJarInputStreamWrapper() { try { - JarFile jarFile = new JarFile(getBase()); + JarFile jarFile = getArchiveResourceSet().openJarFile(); // Need to create a new JarEntry so the certificates can be read JarEntry jarEntry = jarFile.getJarEntry(getResource().getName()); InputStream is = jarFile.getInputStream(jarEntry); - return new JarInputStreamWrapper(jarFile, jarEntry, is); + return new JarInputStreamWrapper(jarEntry, is); } catch (IOException e) { if (log.isDebugEnabled()) { log.debug(sm.getString("jarResource.getInputStreamFail", Modified: tomcat/trunk/java/org/apache/catalina/webresources/JarWarResource.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarWarResource.java?rev=1655129&r1=1655128&r2=1655129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/JarWarResource.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/JarWarResource.java Tue Jan 27 19:38:10 2015 @@ -45,7 +45,7 @@ public class JarWarResource extends Abst @Override protected JarInputStreamWrapper getJarInputStreamWrapper() { try { - JarFile warFile = new JarFile(getBase()); + JarFile warFile = getArchiveResourceSet().openJarFile(); JarEntry jarFileInWar = warFile.getJarEntry(archivePath); InputStream isInWar = warFile.getInputStream(jarFileInWar); @@ -70,7 +70,7 @@ public class JarWarResource extends Abst return null; } - return new JarInputStreamWrapper(warFile, entry, jarIs); + return new JarInputStreamWrapper(entry, jarIs); } catch (IOException e) { if (log.isDebugEnabled()) { log.debug(sm.getString("fileResource.getInputStreamFail", --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org