You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ya...@apache.org on 2018/09/17 06:36:13 UTC

[struts] branch master updated (45689e9 -> 0a3e2fa)

This is an automated email from the ASF dual-hosted git repository.

yasserzamani pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/struts.git.


    from 45689e9  Merge pull request #251 from zmacomber/patch-1
     new 4714fe8  delete temp files on close instead of on JVM exists
     new 0a3e2fa  monitor file only if needed

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../xwork2/util/fs/DefaultFileManager.java         |  4 +-
 .../xwork2/util/fs/JarEntryRevision.java           | 27 ++---------
 .../xwork2/util/fs/StrutsJarURLConnection.java     | 20 ++++++--
 .../providers/XmlConfigurationProviderTest.java    | 56 +++++++++++++++++++---
 .../xwork2/util/DefaultFileManagerTest.java        | 50 +++++++++++--------
 .../xwork2/util/fs/JarEntryRevisionTest.java       | 18 +++++++
 6 files changed, 122 insertions(+), 53 deletions(-)


[struts] 02/02: monitor file only if needed

Posted by ya...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

yasserzamani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 0a3e2fa8a40de00322c6ebfc6359430eed8becce
Author: Yasser Zamani <ya...@apache.org>
AuthorDate: Mon Sep 10 18:18:42 2018 +0430

    monitor file only if needed
    
    See also: WW-4948
    
    (cherry picked from commit b816cc1)
---
 .../xwork2/util/fs/DefaultFileManager.java         |  4 +-
 .../providers/XmlConfigurationProviderTest.java    | 56 +++++++++++++++++++---
 .../xwork2/util/DefaultFileManagerTest.java        | 50 +++++++++++--------
 3 files changed, 83 insertions(+), 27 deletions(-)

diff --git a/core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java b/core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java
index f5fe7e1..21d6cc0 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java
@@ -70,7 +70,9 @@ public class DefaultFileManager implements FileManager {
             return null;
         }
         InputStream is = openFile(fileUrl);
-        monitorFile(fileUrl);
+        if (reloadingConfigs) {
+            monitorFile(fileUrl);
+        }
         return is;
     }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java
index 252e1ba..b66c2ff 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderTest.java
@@ -78,12 +78,14 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
     }
 
     public void testNeedsReload() throws Exception {
-        container.getInstance(FileManagerFactory.class).setReloadingConfigs("true");
         final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-actions.xml";
-        ConfigurationProvider provider = buildConfigurationProvider(filename);
-        container.getInstance(FileManagerFactory.class).setReloadingConfigs("true");
+        ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
+        container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
+        container.inject(provider);
+        provider.init(configuration);
+        provider.loadPackages();
 
-        assertTrue(!provider.needsReload()); // Revision exists and timestamp didn't change
+        assertFalse(provider.needsReload()); // Revision exists and timestamp didn't change
 
         File file = new File(getClass().getResource("/" + filename).toURI());
         assertTrue("not exists: " + file.toString(), file.exists());
@@ -92,6 +94,24 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
         assertTrue(provider.needsReload());
     }
 
+    public void testNeedsReloadNotReloadingConfigs() throws Exception {
+        final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-actions.xml";
+        buildConfigurationProvider(filename);
+        ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
+        container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(false);
+        container.inject(provider);
+        provider.init(configuration);
+        provider.loadPackages();
+
+        assertFalse(provider.needsReload()); // Revision exists and timestamp didn't change
+
+        File file = new File(getClass().getResource("/" + filename).toURI());
+        assertTrue("not exists: " + file.toString(), file.exists());
+        changeFileTime(file);
+
+        assertFalse(provider.needsReload());
+    }
+
     public void testInheritence() throws Exception {
         final String filename = "com/opensymphony/xwork2/config/providers/xwork-include-parent.xml";
         ConfigurationProvider provider = buildConfigurationProvider(filename);
@@ -155,10 +175,13 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
 
     public void testEmptySpaces() throws Exception {
         final String filename = "com/opensymphony/xwork2/config/providers/xwork- test.xml";
+        ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
         container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
+        container.inject(provider);
+        provider.init(configuration);
+        provider.loadPackages();
 
-        ConfigurationProvider provider = buildConfigurationProvider(filename);
-        assertTrue(!provider.needsReload());
+        assertFalse(provider.needsReload());
 
         URI uri = ClassLoaderUtil.getResource(filename, ConfigurationProvider.class).toURI();
 
@@ -170,6 +193,27 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
         assertTrue(provider.needsReload());
     }
 
+    public void testEmptySpacesNotReloadingConfigs() throws Exception {
+        final String filename = "com/opensymphony/xwork2/config/providers/xwork- test.xml";
+        buildConfigurationProvider(filename);
+        ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
+        container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(false);
+        container.inject(provider);
+        provider.init(configuration);
+        provider.loadPackages();
+
+        assertFalse(provider.needsReload());
+
+        URI uri = ClassLoaderUtil.getResource(filename, ConfigurationProvider.class).toURI();
+
+        File file = new File(uri);
+
+        assertTrue(file.exists());
+        changeFileTime(file);
+
+        assertFalse(provider.needsReload());
+    }
+
     public void testConfigsInJarFiles() throws Exception {
         container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
         testProvider("xwork-jar.xml");
diff --git a/core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java
index 32d2485..c13e873 100644
--- a/core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java
@@ -21,16 +21,9 @@ package com.opensymphony.xwork2.util;
 import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.FileManagerFactory;
 import com.opensymphony.xwork2.XWorkTestCase;
-import com.opensymphony.xwork2.util.fs.DefaultFileManager;
-import org.apache.struts2.util.fs.JBossFileManager;
 
-import java.io.IOException;
 import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
+import java.net.*;
 
 /**
  * FileManager Tester.
@@ -49,23 +42,40 @@ public class DefaultFileManagerTest extends XWorkTestCase {
         fileManager = container.getInstance(FileManagerFactory.class).getFileManager();
     }
 
-    public void disabled_testGetFileInJar() throws Exception {
-        testLoadFile("xwork-jar.xml");
-        testLoadFile("xwork - jar.xml");
-        testLoadFile("xwork-zip.xml");
-        testLoadFile("xwork - zip.xml");
-        testLoadFile("xwork-jar2.xml");
-        testLoadFile("xwork - jar2.xml");
-        testLoadFile("xwork-zip2.xml");
-        testLoadFile("xwork - zip2.xml");
+    public void testGetFileInJar() throws Exception {
+        testLoadFile("xwork-jar.xml", false);
+        testLoadFile("xwork - jar.xml", false);
+        testLoadFile("xwork-zip.xml", false);
+        testLoadFile("xwork - zip.xml", false);
+        testLoadFile("xwork-jar2.xml", false);
+        testLoadFile("xwork - jar2.xml", false);
+        testLoadFile("xwork-zip2.xml", false);
+        testLoadFile("xwork - zip2.xml", false);
+
+        testLoadFile("xwork-jar.xml", true);
+        testLoadFile("xwork - jar.xml", true);
+        testLoadFile("xwork-zip.xml", true);
+        testLoadFile("xwork - zip.xml", true);
+        testLoadFile("xwork-jar2.xml", true);
+        testLoadFile("xwork - jar2.xml", true);
+        testLoadFile("xwork-zip2.xml", true);
+        testLoadFile("xwork - zip2.xml", true);
     }
 
-    private void testLoadFile(String fileName) {
-        fileManager.setReloadingConfigs(true);
+    private void testLoadFile(String fileName, boolean reloadConfigs) throws Exception {
+        fileManager.setReloadingConfigs(reloadConfigs);
         URL url = ClassLoaderUtil.getResource(fileName, DefaultFileManagerTest.class);
         InputStream file = fileManager.loadFile(url);
         assertNotNull(file);
-        assertTrue(fileManager.fileNeedsReloading(fileName));
+        file.close();
+        assertFalse(fileManager.fileNeedsReloading(url.toString()));
+
+        long now = System.currentTimeMillis();
+        JarURLConnection conn = (JarURLConnection) url.openConnection();
+        conn.getJarEntry().setTime(now + 60000);
+        conn.getInputStream().close();
+
+        assertEquals(reloadConfigs, fileManager.fileNeedsReloading(url.toString()));
     }
 
     public void testReloadingConfigs() throws Exception {


[struts] 01/02: delete temp files on close instead of on JVM exists

Posted by ya...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

yasserzamani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 4714fe889c76198b8f2c14ec8924e467db9dab10
Author: Yasser Zamani <ya...@apache.org>
AuthorDate: Thu Sep 6 12:59:21 2018 +0430

    delete temp files on close instead of on JVM exists
    
    (cherry picked from commit b802baa)
---
 .../xwork2/util/fs/JarEntryRevision.java           | 27 ++++------------------
 .../xwork2/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 a0fea58..9fb0534 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 44a376a..e733ac7 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 54a10b9..6969ccd 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()}