You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by gv...@apache.org on 2005/09/17 08:31:09 UTC
svn commit: r289709 - in
/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans:
ComponentConfigBean.java ConfigBean.java ConfigBeanFactory.java
ConfigDefinitionsWatchdogFilter.java TemplateConfigBean.java
Author: gvanmatre
Date: Fri Sep 16 23:30:58 2005
New Revision: 289709
URL: http://svn.apache.org/viewcvs?rev=289709&view=rev
Log:
Fix for Bug#: 36661 - Clay template reloading problem
Modified:
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBeanFactory.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigDefinitionsWatchdogFilter.java
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java?rev=289709&r1=289708&r2=289709&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ComponentConfigBean.java Fri Sep 16 23:30:58 2005
@@ -165,7 +165,7 @@
watchDogs.put(watchDog.getName(), watchDog);
// loads the config files
- watchDog.refresh();
+ watchDog.refresh(true);
param = null;
configFiles = null;
@@ -230,7 +230,7 @@
/**
* <p>Collection holding all the top-level components defined in the XML config files</p>
*/
- private Map displayElements = null;
+ protected Map displayElements = null;
/**
* <p>Constructor initializes the <code>displayElements</code> collection</p>
@@ -805,7 +805,7 @@
}
- protected void clear() {
+ protected void clear(String watchDogName) {
Iterator di = displayElements.entrySet().iterator();
while (di.hasNext()) {
Map.Entry e = (Map.Entry) di.next();
@@ -830,7 +830,7 @@
* </p>
*/
public void destroy() {
- clear();
+ clear(Globals.DEFAULT_COMPONENT_CONFIG_WATCHDOG);
context = null;
if (parser != null)
@@ -1039,19 +1039,24 @@
/**
* <p>This method is the watch dog timmer. It's invoked to determine
- * if any of the files have changed since the last time they were loaded.
- * If a change has occured on any of the <code>configDefs</code>, all the
+ * if any of the files have changed since the last time they were loaded.
+ * If a change has occured on any of the <code>configDefs</code> or
+ * the <code>forceReload</code> param is <code>true</code>, all the
* files are reloaded and the last modified date is reset in the
- * {@link ConfigBean.ConfigDefinition}.
+ * {@link ConfigBean.ConfigDefinition}. A <code>true</code> value is
+ * returned if the files were refreshed.
* </p>
*/
- public void refresh() {
+ public boolean refresh(boolean forceReload) {
+
+ boolean wasDirty = false;
int i = 0;
try {
open();
- if (isDirty()) {
- clear();
+ if (forceReload || isDirty()) {
+ wasDirty = true;
+ clear(getName());
for (i = 0; i < configDefs.length; i++) {
if (log.isInfoEnabled())
@@ -1090,30 +1095,36 @@
} finally {
close();
}
+
+ return wasDirty;
}
-
+
}
/**
* <p>This method should be called from key points in the application to invoke
* automatic reloading of the configuration files if they have been modified since
- * last reloaded. The parameter <code>watchDogName</code> corresponds to a
- * HTML template name or the default defined by the static String constant
- * <code>Global.DEFAULT_COMPONENT_CONFIG_WATCHDOG</code></p>
+ * last reloaded. If the <code>forceReload</code> flag is <code>true</code> the files are
+ * reloaded. A <code>true</code> return value indicates the config files
+ * where reloaded.</p>
*/
- public void refresh(String watchDogName) {
+ public boolean refresh(boolean forceReload) {
+
+ boolean wasDirty = false;
- WatchDog watchDog = (WatchDog) watchDogs.get(watchDogName);
+ WatchDog watchDog = (WatchDog) watchDogs.get(Globals.DEFAULT_COMPONENT_CONFIG_WATCHDOG);
// is auto watch turned off
if (!ComponentConfigBean.this.isWatchDogOn || watchDog == null)
- return;
+ return wasDirty;
synchronized (displayElements) {
- watchDog.refresh();
+ wasDirty = watchDog.refresh(forceReload);
}
watchDog = null;
+
+ return wasDirty;
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java?rev=289709&r1=289708&r2=289709&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBean.java Fri Sep 16 23:30:58 2005
@@ -102,10 +102,10 @@
/**
* <p>This method should be called from key points in the application to invoke
* automatic reloading of the configuration files if they have been modified since
- * last reloaded. The <code>watchDogName</code> parameter corresponds to the
- * instance of the {@link org.apache.shale.clay.config.beans.ComponentConfigBean$WatchDog}
- * monitoring a configuration file for change.</p>
+ * last reloaded. If the parameter <code>forceReload</code> is <code>true</code>,
+ * all files will be reloaded. The return value is <code>true</code>, if the
+ * files were reloaded.</p>
*/
- public void refresh(String watchDogName);
+ public boolean refresh(boolean forceReload);
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBeanFactory.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBeanFactory.java?rev=289709&r1=289708&r2=289709&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBeanFactory.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigBeanFactory.java Fri Sep 16 23:30:58 2005
@@ -84,20 +84,19 @@
/**
* <p>This method should be called from key points in the application to invoke
* automatic reloading of the configuration files if they have been modified since
- * last reloaded. The <code>watchDogName</code> parameter corresponds to the instance of the
- * {@link org.apache.shale.clay.config.beans.ComponentConfigBean.WatchDog} monitoring
- * a configuration file for change. The same {@link ConfigBean} interfaces is used for
- * {@link ComponentConfigBean} and {@link TemplateConfigBean} but the
- * {@link org.apache.shale.clay.config.beans.ComponentConfigBean$WatchDog} for the XML
- * configuration files is assumed to be known by <code>Globals.DEFAULT_COMPONENT_CONFIG_WATCHDOG</code>.
+ * last reloaded. If the XML files have changed, all files have to be reloaded.
+ * This includes HTML template files.
* </p>
*/
- public static void refresh(String watchDogName) {
+ public static void refresh() {
Iterator ci = configBeans.iterator();
- ConfigBean config = null;
+ //the logic assumes the ComponentConfigBean will be first
+ //in the ordered list. If the XML files are dirty, the
+ //template cache must be reestablished.
+ boolean wasDirty = false;
while (ci.hasNext()) {
- config = (ConfigBean) ci.next();
- config.refresh(watchDogName);
+ ConfigBean config = (ConfigBean) ci.next();
+ wasDirty = config.refresh(wasDirty);
}
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigDefinitionsWatchdogFilter.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigDefinitionsWatchdogFilter.java?rev=289709&r1=289708&r2=289709&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigDefinitionsWatchdogFilter.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/ConfigDefinitionsWatchdogFilter.java Fri Sep 16 23:30:58 2005
@@ -65,7 +65,7 @@
*/
protected void accept(ShaleWebContext context) throws Exception {
- ConfigBeanFactory.refresh(Globals.DEFAULT_COMPONENT_CONFIG_WATCHDOG);
+ ConfigBeanFactory.refresh();
}
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java?rev=289709&r1=289708&r2=289709&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/config/beans/TemplateConfigBean.java Fri Sep 16 23:30:58 2005
@@ -18,6 +18,8 @@
package org.apache.shale.clay.config.beans;
+import java.util.Iterator;
+import java.util.Map;
import java.util.TreeMap;
import javax.servlet.ServletContext;
@@ -25,6 +27,8 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shale.clay.config.ClayTemplateParser;
+import org.apache.shale.clay.config.Globals;
+import org.apache.shale.clay.config.beans.ComponentConfigBean.WatchDog;
/**
* <p>The second type of top-level object pool. This implementation
@@ -60,8 +64,7 @@
WatchDog watchDog = (WatchDog) watchDogs.get(jsfid.toString());
if (watchDog == null || super.getElement(jsfid.toString()) == null) {
//The first time the page is created, create a watcher
-
-
+
watchDog = new WatchDog(getConfigDefinitions(jsfid.toString()), jsfid.toString());
// register by name
@@ -70,7 +73,7 @@
//loads the HTML template the first time and when file
//has been modified
- watchDog.refresh();
+ watchDog.refresh(false);
// returns the cached element
return super.getElement(jsfid.toString());
@@ -123,5 +126,58 @@
isWatchDogOn = true;
}
+
+ /**
+ * <p>If the <code>watchDogName</code> equals
+ * the {@link ComponentBean} that defines the selected
+ * template, remove it.</p>
+ */
+ protected void clear(String watchDogName) {
+ if (!watchDogName.equals(Globals.DEFAULT_COMPONENT_CONFIG_WATCHDOG)) {
+ //unassign a single template component
+ ComponentBean b = (ComponentBean) displayElements.get(watchDogName);
+ displayElements.remove(watchDogName);
+ if (b != null) {
+ try {
+ unassignParent(b);
+ } catch (RuntimeException e1) {
+ }
+ }
+ b = null;
+ } else {
+ super.clear(watchDogName);
+ }
+ }
+
+
+ /**
+ * <p>If the <code>forceReload</code> is <code>true</code>,
+ * the <code>displayElements</code> cache is invalidated.
+ * A <code>true</code> value is returned if cache has
+ * been cleared.</p>
+ */
+ public boolean refresh(boolean forceReload) {
+ if (forceReload) {
+ synchronized (displayElements) {
+
+ //remove all old templates
+ Iterator wi = watchDogs.entrySet().iterator();
+ while (wi.hasNext()) {
+ Map.Entry e = (Map.Entry) wi.next();
+ WatchDog watchDog = (WatchDog) e.getValue();
+ clear(watchDog.getName());
+ if (watchDog != null)
+ watchDog.destroy();
+
+ }
+ watchDogs.clear();
+ }
+ }
+
+ return forceReload;
+ }
+
+
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org