From 6539d0dd80bdf65a301db76a69ebc0bfbc5ce0a1 Mon Sep 17 00:00:00 2001
From: Musachy Barroso
+ *
* <context-param>
* <param-name>contextClass</param-name>
* <param-value>org.apache.struts2.spring.ClassReloadingXMLWebApplicationContext</param-value>
@@ -67,18 +72,34 @@ import java.util.ArrayList;
public class ClassReloadingXMLWebApplicationContext extends XmlWebApplicationContext implements FilesystemAlterationListener {
private static final Logger LOG = LoggerFactory.getLogger(ClassReloadingXMLWebApplicationContext.class);
- private ReloadingClassLoader classLoader;
- private FilesystemAlterationMonitor fam;
+ protected ReloadingClassLoader classLoader;
+ protected FilesystemAlterationMonitor fam;
- private ClassReloadingBeanFactory beanFactory;
+ protected ClassReloadingBeanFactory beanFactory;
- public void setupReloading(String[] watchList) {
+ public void setupReloading(String[] watchList, String acceptClasses, ServletContext servletContext) {
classLoader = new ReloadingClassLoader(ClassReloadingXMLWebApplicationContext.class.getClassLoader());
+
+ //make a list of accepted classes
+ if (StringUtils.isNotBlank(acceptClasses)) {
+ String[] splitted = acceptClasses.split(",");
+ Set patterns = new HashSet(splitted.length);
+ for (String pattern : splitted)
+ patterns.add(Pattern.compile(pattern));
+
+ classLoader.setAccepClasses(patterns);
+ }
+
fam = new FilesystemAlterationMonitor();
//setup stores
for (String watch : watchList) {
File file = new File(watch);
+
+ //make it absolute, if it is a relative path
+ if (!file.isAbsolute())
+ file = new File(servletContext.getRealPath(watch));
+
if (watch.endsWith(".jar")) {
classLoader.addResourceStore(new JarResourceStore(file));
//register with the fam
@@ -157,6 +178,8 @@ public class ClassReloadingXMLWebApplicationContext extends XmlWebApplicationCon
}
public void onDirectoryCreate(File file) {
+ if (classLoader != null)
+ classLoader.reload();
}
public void onDirectoryDelete(File file) {
@@ -168,6 +191,8 @@ public class ClassReloadingXMLWebApplicationContext extends XmlWebApplicationCon
}
public void onFileCreate(File file) {
+ if (classLoader != null)
+ classLoader.reload();
}
public void onFileDelete(File file) {
diff --git a/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java b/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java
index 5805338d9..c5f53db66 100644
--- a/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java
+++ b/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java
@@ -68,7 +68,8 @@ public class StrutsSpringObjectFactory extends SpringObjectFactory {
@Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE,required=false) String useClassCacheStr,
@Inject ServletContext servletContext,
@Inject(StrutsConstants.STRUTS_DEVMODE) String devMode,
- @Inject(value = "struts.class.reloading.watchList", required = false) String watchList) {
+ @Inject(value = "struts.class.reloading.watchList", required = false) String watchList,
+ @Inject(value = "struts.class.reloading.acceptClasses", required = false) String acceptClasses) {
super();
boolean useClassCache = "true".equals(useClassCacheStr);
@@ -94,7 +95,7 @@ public class StrutsSpringObjectFactory extends SpringObjectFactory {
&& StringUtils.isNotBlank(watchList)
&& appContext instanceof ClassReloadingXMLWebApplicationContext) {
ClassReloadingXMLWebApplicationContext reloadingContext = (ClassReloadingXMLWebApplicationContext) appContext;
- reloadingContext.setupReloading(watchList.split(","));
+ reloadingContext.setupReloading(watchList.split(","), acceptClasses, servletContext);
LOG.info("Class reloading is enabled. Make sure this is not used on a production environment!", watchList);
//we need to reload the context, so our isntance of the factory is picked up