From f619eaefbff013a624f533a76cd1c963caa02b91 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 6 Nov 2012 14:23:51 +0000 Subject: [PATCH] WW-3918 removes FileManager#isReloadConfigs() method and use @Inject("struts.configuration.xml.reload") git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@1406145 13f79535-47bb-0310-9956-ffa450edef68 --- .../struts2/util/fs/JBossFileManager.java | 5 ++-- .../struts2/dispatcher/DispatcherTest.java | 25 ++++++++++-------- .../DefaultOValValidationManager.java | 9 ++++++- .../com/opensymphony/xwork2/FileManager.java | 6 ++--- .../xwork2/config/ConfigurationManager.java | 7 +++-- .../conversion/impl/XWorkConverter.java | 9 ++++++- .../xwork2/util/fs/DefaultFileManager.java | 4 --- .../AnnotationActionValidatorManager.java | 9 ++++++- .../DefaultActionValidatorManager.java | 9 ++++++- .../xwork2/util/DefaultFileManagerTest.java | 26 ++++++++++++++++--- .../fs/DefaultFileManagerFactoryTest.java | 4 --- 11 files changed, 77 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java b/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java index 6eec44371..6b6b8f2eb 100644 --- a/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java +++ b/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java @@ -154,8 +154,9 @@ public class JBossFileManager extends DefaultFileManager { } private void readFile(List urls, File physicalFile) throws MalformedURLException { - if (physicalFile.isDirectory()) { - for (File file : physicalFile.listFiles()) { + File[] files = physicalFile.listFiles(); + if (physicalFile.isDirectory() && files != null) { + for (File file : files) { if (file.isFile()) { addIfAbsent(urls, file.toURI().toURL()); } else if (file.isDirectory()) { diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java index bd15d3f37..b1b132033 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java @@ -23,8 +23,8 @@ package org.apache.struts2.dispatcher; import com.mockobjects.dynamic.C; import com.mockobjects.dynamic.Mock; -import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.InterceptorMapping; @@ -33,7 +33,6 @@ import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.interceptor.Interceptor; import com.opensymphony.xwork2.util.LocalizedTextUtil; -import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsTestCase; import org.apache.struts2.dispatcher.FilterDispatcherTest.InnerDestroyableObjectFactory; @@ -194,17 +193,19 @@ public class DispatcherTest extends StrutsTestCase { cm.setConfiguration((Configuration)mockConfiguration.proxy()); Mock mockContainer = new Mock(Container.class); - mockConfiguration.expectAndReturn("getContainer", mockContainer.proxy()); + String reloadConfigs = container.getInstance(String.class, XWorkConstants.RELOAD_XML_CONFIGURATION); + mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(XWorkConstants.RELOAD_XML_CONFIGURATION)), + reloadConfigs); mockContainer.expectAndReturn("getInstance", C.args(C.eq(ObjectFactory.class)), destroyedObjectFactory); + mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(XWorkConstants.RELOAD_XML_CONFIGURATION)), + reloadConfigs); + + mockConfiguration.expectAndReturn("getContainer", mockContainer.proxy()); mockConfiguration.expectAndReturn("getContainer", mockContainer.proxy()); mockConfiguration.expectAndReturn("getContainer", mockContainer.proxy()); - FileManagerFactory fileManagerFactory = new DefaultFileManagerFactory(); - container.inject(fileManagerFactory); - mockContainer.expectAndReturn("getInstance", C.args(C.eq(FileManagerFactory.class)), fileManagerFactory); - mockContainer.expectAndReturn("getInstance", C.args(C.eq(FileManagerFactory.class)), fileManagerFactory); mockConfiguration.expect("destroy"); mockConfiguration.matchAndReturn("getPackageConfigs", new HashMap()); - + du.setConfigurationManager(cm); assertFalse(destroyedObjectFactory.destroyed); du.cleanup(); @@ -229,9 +230,11 @@ public class DispatcherTest extends StrutsTestCase { Mock mockContainer = new Mock(Container.class); mockContainer.matchAndReturn("getInstance", C.args(C.eq(ObjectFactory.class)), new ObjectFactory()); - DefaultFileManagerFactory factory = new DefaultFileManagerFactory(); - container.inject(factory); - mockContainer.matchAndReturn("getInstance", C.args(C.eq(FileManagerFactory.class)), factory); + String reloadConfigs = container.getInstance(String.class, XWorkConstants.RELOAD_XML_CONFIGURATION); + mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(XWorkConstants.RELOAD_XML_CONFIGURATION)), + reloadConfigs); + mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(XWorkConstants.RELOAD_XML_CONFIGURATION)), + reloadConfigs); Mock mockConfiguration = new Mock(Configuration.class); mockConfiguration.matchAndReturn("getPackageConfigs", packageConfigs); diff --git a/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/DefaultOValValidationManager.java b/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/DefaultOValValidationManager.java index b2f8160cd..8c35fe010 100644 --- a/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/DefaultOValValidationManager.java +++ b/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/DefaultOValValidationManager.java @@ -10,6 +10,7 @@ import net.sf.oval.configuration.Configurer; import net.sf.oval.configuration.annotation.AnnotationsConfigurer; import net.sf.oval.configuration.annotation.JPAAnnotationsConfigurer; import net.sf.oval.configuration.xml.XMLConfigurer; +import org.apache.struts2.StrutsConstants; import java.net.URL; import java.util.ArrayList; @@ -29,8 +30,14 @@ public class DefaultOValValidationManager implements OValValidationManager { protected boolean validateJPAAnnotations; + private boolean reloadConfigs; private FileManager fileManager; + @Inject(value = StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD, required = false) + public void setReloadingConfigs(String reloadingConfigs) { + this.reloadConfigs = Boolean.parseBoolean(reloadingConfigs); + } + @Inject public void setFileManagerFactory(FileManagerFactory fileManagerFactory) { this.fileManager = fileManagerFactory.getFileManager(); @@ -41,7 +48,7 @@ public class DefaultOValValidationManager implements OValValidationManager { final String validatorKey = buildValidatorKey(clazz, context); if (validatorCache.containsKey(validatorKey)) { - if (fileManager.isReloadingConfigs()) { + if (reloadConfigs) { List configurers = buildXMLConfigurers(clazz, context, true, null); //add an annotation configurer diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/FileManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/FileManager.java index 06f981e55..5c6806b8c 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/FileManager.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/FileManager.java @@ -17,10 +17,8 @@ public interface FileManager { */ void setReloadingConfigs(boolean reloadingConfigs); - boolean isReloadingConfigs(); - /** - * Checks if given file changed and must be reloaded if {@link #isReloadingConfigs()} is true + * Checks if given file changed and must be reloaded if {@link #setReloadingConfigs(boolean)} is true * * @param fileName to check * @return true if file changed @@ -45,7 +43,7 @@ public interface FileManager { InputStream loadFile(URL fileUrl); /** - * Adds file to list of monitored files if {@link #isReloadingConfigs()} is true + * Adds file to list of monitored files if {@link #setReloadingConfigs(boolean)} is true * * @param fileUrl {@link URL} to file to be monitored */ diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java index 94eebfdd6..fb2e4d04b 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java @@ -15,8 +15,7 @@ */ package com.opensymphony.xwork2.config; -import com.opensymphony.xwork2.FileManager; -import com.opensymphony.xwork2.FileManagerFactory; +import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.config.providers.XWorkConfigurationProvider; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; @@ -173,8 +172,8 @@ public class ConfigurationManager { * @param container current container used to obtain instance of {@link com.opensymphony.xwork2.util.fs.DefaultFileManager} */ public synchronized void conditionalReload(Container container) { - FileManager fileManager = container.getInstance(FileManagerFactory.class).getFileManager(); - if (fileManager.isReloadingConfigs() || providersChanged) { + boolean reloadConfigs = Boolean.parseBoolean(container.getInstance(String.class, XWorkConstants.RELOAD_XML_CONFIGURATION)); + if (reloadConfigs || providersChanged) { if (LOG.isDebugEnabled()) { LOG.debug("Checking ConfigurationProviders for reload."); } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java index f9c157be5..deec536cf 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java @@ -19,6 +19,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.XWorkMessages; import com.opensymphony.xwork2.XWorkException; import com.opensymphony.xwork2.conversion.TypeConverter; @@ -184,6 +185,7 @@ public class XWorkConverter extends DefaultTypeConverter { private TypeConverter defaultTypeConverter; private ObjectFactory objectFactory; private FileManager fileManager; + private boolean reloadingConfigs; protected XWorkConverter() { } @@ -207,6 +209,11 @@ public class XWorkConverter extends DefaultTypeConverter { this.fileManager = fileManagerFactory.getFileManager(); } + @Inject(value = XWorkConstants.RELOAD_XML_CONFIGURATION, required = false) + public void setReloadingConfigs(String reloadingConfigs) { + this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs); + } + public static String getConversionErrorMessage(String propertyName, ValueStack stack) { String defaultMessage = LocalizedTextUtil.findDefaultText(XWorkMessages.DEFAULT_INVALID_FIELDVALUE, ActionContext.getContext().getLocale(), @@ -744,7 +751,7 @@ public class XWorkConverter extends DefaultTypeConverter { private Map conditionalReload(Class clazz, Map oldValues) throws Exception { Map mapping = oldValues; - if (fileManager.isReloadingConfigs()) { + if (reloadingConfigs) { URL fileUrl = ClassLoaderUtil.getResource(buildConverterFilename(clazz), clazz); if (fileManager.fileNeedsReloading(fileUrl.toString())) { mapping = buildConverterMapping(clazz); diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java index f03963d00..4e25a4be3 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java @@ -52,10 +52,6 @@ public class DefaultFileManager implements FileManager { this.reloadingConfigs = reloadingConfigs; } - public boolean isReloadingConfigs() { - return reloadingConfigs; - } - public boolean fileNeedsReloading(URL fileUrl) { return fileUrl != null && fileNeedsReloading(fileUrl.toString()); } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java index df40b5974..6f1d54835 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java @@ -21,6 +21,7 @@ import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; +import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ClassLoaderUtil; @@ -63,6 +64,7 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager private ValidatorFactory validatorFactory; private ValidatorFileParser validatorFileParser; private FileManager fileManager; + private boolean reloadingConfigs; @Inject public void setValidatorFactory(ValidatorFactory fac) { @@ -79,6 +81,11 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager this.fileManager = fileManagerFactory.getFileManager(); } + @Inject(value = XWorkConstants.RELOAD_XML_CONFIGURATION, required = false) + public void setReloadingConfigs(String reloadingConfigs) { + this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs); + } + public List getValidators(Class clazz, String context) { return getValidators(clazz, context, null); } @@ -88,7 +95,7 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager final List cfgs; if (validatorCache.containsKey(validatorKey)) { - if (fileManager.isReloadingConfigs()) { + if (reloadingConfigs) { validatorCache.put(validatorKey, buildValidatorConfigs(clazz, context, true, null)); } } else { diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java index c5293d797..9bb80e683 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java @@ -18,6 +18,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; +import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ClassLoaderUtil; import com.opensymphony.xwork2.util.ValueStack; @@ -55,6 +56,7 @@ public class DefaultActionValidatorManager implements ActionValidatorManager { private ValidatorFactory validatorFactory; private ValidatorFileParser validatorFileParser; private FileManager fileManager; + private boolean reloadingConfigs; @Inject public void setValidatorFileParser(ValidatorFileParser parser) { @@ -71,6 +73,11 @@ public class DefaultActionValidatorManager implements ActionValidatorManager { this.fileManager = fileManagerFactory.getFileManager(); } + @Inject(value = XWorkConstants.RELOAD_XML_CONFIGURATION, required = false) + public void setReloadingConfigs(String reloadingConfigs) { + this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs); + } + public synchronized List getValidators(Class clazz, String context) { return getValidators(clazz, context, null); } @@ -79,7 +86,7 @@ public class DefaultActionValidatorManager implements ActionValidatorManager { final String validatorKey = buildValidatorKey(clazz, context); if (validatorCache.containsKey(validatorKey)) { - if (fileManager.isReloadingConfigs()) { + if (reloadingConfigs) { validatorCache.put(validatorKey, buildValidatorConfigs(clazz, context, true, null)); } } else { diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java index 6c0f63760..7f4776e2d 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/util/DefaultFileManagerTest.java @@ -4,8 +4,11 @@ import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.XWorkTestCase; +import java.io.File; import java.io.InputStream; +import java.net.URISyntaxException; import java.net.URL; +import java.util.Date; /** * FileManager Tester. @@ -17,6 +20,7 @@ import java.net.URL; public class DefaultFileManagerTest extends XWorkTestCase { private FileManager fileManager; + private long lastModified; @Override public void setUp() throws Exception { @@ -47,14 +51,30 @@ public class DefaultFileManagerTest extends XWorkTestCase { // given container.getInstance(FileManagerFactory.class).setReloadingConfigs("false"); FileManager fm = container.getInstance(FileManagerFactory.class).getFileManager(); - assertFalse(fm.isReloadingConfigs()); + String resourceName = "xwork-sample.xml"; + URL url = ClassLoaderUtil.getResource(resourceName, DefaultFileManagerTest.class); + assertFalse(fm.fileNeedsReloading(url)); // when container.getInstance(FileManagerFactory.class).setReloadingConfigs("true"); - fm = container.getInstance(FileManagerFactory.class).getFileManager(); + changeLastModified(resourceName); // then - assertTrue(fm.isReloadingConfigs()); + url = ClassLoaderUtil.getResource(resourceName, DefaultFileManagerTest.class); + fm = container.getInstance(FileManagerFactory.class).getFileManager(); + assertTrue("Url is " + url, fm.fileNeedsReloading(url)); + restoreLastModified(resourceName); + } + + private void changeLastModified(String resourceName) throws URISyntaxException { + URL url = ClassLoaderUtil.getResource(resourceName, DefaultFileManagerTest.class); + lastModified = new File(url.toURI()).lastModified(); + new File(url.toURI()).setLastModified(new Date().getTime() - 1000*10); + } + + private void restoreLastModified(String resourceName) throws URISyntaxException { + URL url = ClassLoaderUtil.getResource(resourceName, DefaultFileManagerTest.class); + new File(url.toURI()).setLastModified(lastModified); } } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/util/fs/DefaultFileManagerFactoryTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/util/fs/DefaultFileManagerFactoryTest.java index ef68e0dfd..0b149c637 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/util/fs/DefaultFileManagerFactoryTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/util/fs/DefaultFileManagerFactoryTest.java @@ -101,10 +101,6 @@ class DummyFileManager implements FileManager { public void setReloadingConfigs(boolean reloadingConfigs) { } - public boolean isReloadingConfigs() { - return false; - } - public boolean fileNeedsReloading(String fileName) { return false; }