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 b13e7857ffcd40446e2a9629ae49949b3c441c94
Author: Yasser Zamani <yasserzam...@apache.org>
AuthorDate: Thu Nov 1 15:17:02 2018 +0330

    not miss container provided fileUrl and ...
    
    lazy monitoring for performance. Fix and test stopping reload configs at 
runtime.
    
    Fixes WW-4974
    
    (cherry picked from commit ecb7bee)
---
 .../xwork2/util/fs/DefaultFileManager.java         | 21 ++++++--------
 .../providers/XmlConfigurationProviderTest.java    | 33 ++++++++++++++++++++++
 .../xwork2/config/providers/xwork-test-reload.xml  | 31 ++++++++++++++++++++
 3 files changed, 73 insertions(+), 12 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 d39e914..5708bd5 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
@@ -41,6 +41,7 @@ public class DefaultFileManager implements FileManager {
     private static final int JAR_FILE_PATH = 3;
 
     protected static final Map<String, Revision> files = 
Collections.synchronizedMap(new HashMap<String, Revision>());
+    private static final List<URL> lazyMonitoredFilesCache = 
Collections.synchronizedList(new ArrayList<URL>());
 
     protected boolean reloadingConfigs = false;
 
@@ -49,19 +50,13 @@ public class DefaultFileManager implements FileManager {
 
     public void setReloadingConfigs(boolean reloadingConfigs) {
         if (reloadingConfigs && !this.reloadingConfigs) {
+            //starting monitoring cached not-monitored files (lazy monitoring 
on demand because of performance)
             this.reloadingConfigs = true;
-            //starting monitoring not-monitored loaded files on demand
-            synchronized (files) {
-                for (String fileName :
-                        files.keySet()) {
-                    if (null == files.get(fileName)) {
-                        try {
-                            monitorFile(new URL(fileName));
-                        } catch (MalformedURLException e) {
-                            LOG.warn("Error creating URL from [{}]!", 
fileName, e);
-                        }
-                    }
+            synchronized (lazyMonitoredFilesCache) {
+                for (URL fileUrl : lazyMonitoredFilesCache) {
+                    monitorFile(fileUrl);
                 }
+                lazyMonitoredFilesCache.clear();
             }
         }
         this.reloadingConfigs = reloadingConfigs;
@@ -105,7 +100,9 @@ public class DefaultFileManager implements FileManager {
     public void monitorFile(URL fileUrl) {
         String fileName = fileUrl.toString();
         if (!reloadingConfigs) {
-            files.put(fileName, null);
+            //reserve file for monitoring on demand because of performance
+            files.remove(fileName);
+            lazyMonitoredFilesCache.add(fileUrl);
             return;
         }
         Revision revision;
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 63f9b53..faa6b93 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
@@ -31,6 +31,9 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -94,6 +97,36 @@ public class XmlConfigurationProviderTest extends 
ConfigurationTestBase {
         assertTrue(provider.needsReload());
     }
 
+    public void testReload() throws Exception {
+        final String filename = 
"com/opensymphony/xwork2/config/providers/xwork-test-reload.xml";
+        ConfigurationProvider provider = new 
XmlConfigurationProvider(filename, true);
+        loadConfigurationProviders(provider);
+
+        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());
+
+        Path configPath = Paths.get(file.getAbsolutePath());
+        String content = new String(Files.readAllBytes(configPath));
+        content = content.replaceAll("<constant 
name=\"struts.configuration.xml.reload\" value=\"true\" />",
+                "<constant name=\"struts.configuration.xml.reload\" 
value=\"false\" />");
+        Files.write(configPath, content.getBytes()); // user demand: stop 
reloading configs
+
+        try {
+            assertTrue(provider.needsReload()); // config file has changed in 
previous lines
+
+            configurationManager.reload();
+
+            changeFileTime(file);
+            assertFalse(provider.needsReload());    // user already has 
stopped reloading configs
+        } finally {
+            content = content.replaceAll("<constant 
name=\"struts.configuration.xml.reload\" value=\"false\" />",
+                    "<constant name=\"struts.configuration.xml.reload\" 
value=\"true\" />");
+            Files.write(configPath, content.getBytes());
+        }
+    }
+
     public void testNeedsReloadNotReloadingConfigs() throws Exception {
         final String filename = 
"com/opensymphony/xwork2/config/providers/xwork-test-actions.xml";
         buildConfigurationProvider(filename);
diff --git 
a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
 
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
new file mode 100644
index 0000000..ffd5755
--- /dev/null
+++ 
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE xwork PUBLIC
+    "-//Apache Struts//XWork 2.5//EN"
+    "http://struts.apache.org/dtds/xwork-2.5.dtd";
+ >
+
+<xwork>
+
+    <constant name="struts.configuration.xml.reload" value="true" />
+
+</xwork>

Reply via email to