From 4714fe889c76198b8f2c14ec8924e467db9dab10 Mon Sep 17 00:00:00 2001 From: Yasser Zamani Date: Thu, 6 Sep 2018 12:59:21 +0430 Subject: [PATCH] delete temp files on close instead of on JVM exists (cherry picked from commit b802baa) --- .../xwork2/util/fs/JarEntryRevision.java | 27 +++---------------- .../util/fs/StrutsJarURLConnection.java | 20 +++++++++++--- .../xwork2/util/fs/JarEntryRevisionTest.java | 18 +++++++++++++ 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java b/core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java index a0fea58c4..9fb05348e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java @@ -37,9 +37,7 @@ public class JarEntryRevision extends Revision { private long lastModified; public static Revision build(URL fileUrl, FileManager fileManager) { - StrutsJarURLConnection conn = null; - try { - conn = StrutsJarURLConnection.openConnection(fileUrl); + try (StrutsJarURLConnection conn = StrutsJarURLConnection.openConnection(fileUrl)) { conn.setUseCaches(false); URL url = fileManager.normalizeToFileProtocol(fileUrl); if (url != null) { @@ -51,14 +49,6 @@ public class JarEntryRevision extends Revision { LOG.warn("Could not create JarEntryRevision for [{}]!", fileUrl, e); return null; } - finally { - if(null != conn) { - try { - conn.getInputStream().close(); - } catch (IOException ignored) { - } - } - } } private JarEntryRevision(URL jarFileURL, long lastModified) { @@ -70,21 +60,12 @@ public class JarEntryRevision extends Revision { } public boolean needsReloading() { - StrutsJarURLConnection conn = null; long lastLastModified = lastModified; - try { - conn = StrutsJarURLConnection.openConnection(jarFileURL); + try (StrutsJarURLConnection conn = StrutsJarURLConnection.openConnection(jarFileURL)) { conn.setUseCaches(false); lastLastModified = conn.getJarEntry().getTime(); - } catch (IOException ignored) { - } - finally { - if(null != conn) { - try { - conn.getInputStream().close(); - } catch (IOException ignored) { - } - } + } catch (Throwable e) { + LOG.warn("Could not check if needsReloading for [{}]!", jarFileURL, e); } return lastModified < lastLastModified; diff --git a/core/src/main/java/com/opensymphony/xwork2/util/fs/StrutsJarURLConnection.java b/core/src/main/java/com/opensymphony/xwork2/util/fs/StrutsJarURLConnection.java index 44a376aaf..e733ac7ce 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/fs/StrutsJarURLConnection.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/fs/StrutsJarURLConnection.java @@ -44,7 +44,7 @@ import java.util.jar.JarFile; * While {@link JarURLConnection#parseSpecs(URL)} is private, then we had to extend {@link URLConnection} instead * @since 2.5.15 */ -class StrutsJarURLConnection extends URLConnection { +class StrutsJarURLConnection extends URLConnection implements AutoCloseable { private static final String FILE_URL_PREFIX = "file:"; private JarURLConnection jarURLConnection; @@ -123,8 +123,8 @@ class StrutsJarURLConnection extends URLConnection { Path tmpFile = Files.createTempFile("jar_cache", null); try { Files.copy(in, tmpFile, StandardCopyOption.REPLACE_EXISTING); - JarFile jarFile = new JarFile(tmpFile.toFile(), true, JarFile.OPEN_READ); - tmpFile.toFile().deleteOnExit(); + JarFile jarFile = new JarFile(tmpFile.toFile(), true, JarFile.OPEN_READ + | JarFile.OPEN_DELETE); return jarFile; } catch (Throwable thr) { try { @@ -171,6 +171,20 @@ class StrutsJarURLConnection extends URLConnection { } } + @Override + public void close() throws Exception { + try { + getInputStream().close(); + } catch (IOException ignored) { + } + if (jarURLConnection == null) { + try { + jarFile.close(); + } catch (IOException ignored) { + } + } + } + static StrutsJarURLConnection openConnection(URL url) throws IOException { return new StrutsJarURLConnection(url); } diff --git a/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java b/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java index 54a10b90a..6969ccd3f 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java @@ -21,7 +21,9 @@ package com.opensymphony.xwork2.util.fs; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.XWorkTestCase; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.filefilter.WildcardFileFilter; import java.io.File; import java.io.FileOutputStream; @@ -30,6 +32,8 @@ import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; @@ -113,6 +117,20 @@ public class JarEntryRevisionTest extends XWorkTestCase { assertTrue(entry.needsReloading()); } + @Override + protected void tearDown() throws Exception { + Path tmpFile = Files.createTempFile("jar_cache", null); + Path tmpFolder = tmpFile.getParent(); + int count = FileUtils.listFiles(tmpFolder.toFile(), new WildcardFileFilter("jar_cache*"), + null).size(); + if (tmpFile.toFile().delete()) { + count--; + } + assertEquals(0, count); + + super.tearDown(); + } + /** * WW-4901 Simulating container implementation of {@link URL#openConnection()}