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>