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
This commit is contained in:
Lukasz Lenart
2012-11-06 14:23:51 +00:00
parent 2f465f8daf
commit f619eaefbf
11 changed files with 77 additions and 36 deletions
@@ -154,8 +154,9 @@ public class JBossFileManager extends DefaultFileManager {
}
private void readFile(List<URL> 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()) {
@@ -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<String, PackageConfig>());
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);
@@ -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<Configurer> configurers = buildXMLConfigurers(clazz, context, true, null);
//add an annotation configurer
@@ -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
*/
@@ -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.");
}
@@ -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<String, Object> conditionalReload(Class clazz, Map<String, Object> oldValues) throws Exception {
Map<String, Object> mapping = oldValues;
if (fileManager.isReloadingConfigs()) {
if (reloadingConfigs) {
URL fileUrl = ClassLoaderUtil.getResource(buildConverterFilename(clazz), clazz);
if (fileManager.fileNeedsReloading(fileUrl.toString())) {
mapping = buildConverterMapping(clazz);
@@ -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());
}
@@ -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<Validator> getValidators(Class clazz, String context) {
return getValidators(clazz, context, null);
}
@@ -88,7 +95,7 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager
final List<ValidatorConfig> cfgs;
if (validatorCache.containsKey(validatorKey)) {
if (fileManager.isReloadingConfigs()) {
if (reloadingConfigs) {
validatorCache.put(validatorKey, buildValidatorConfigs(clazz, context, true, null));
}
} else {
@@ -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<Validator> 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 {
@@ -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);
}
}
@@ -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;
}