sylvain 02/02/04 10:18:26
Modified: src/java/org/apache/cocoon Cocoon.java
src/java/org/apache/cocoon/components/source
DelayedRefreshSourceWrapper.java
Log:
Patch for concurrency issue causing a NPE in URLSource under high load
Revision Changes Path
1.11 +8 -5 xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java
Index: Cocoon.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Cocoon.java 4 Feb 2002 12:08:39 -0000 1.10
+++ Cocoon.java 4 Feb 2002 18:18:26 -0000 1.11
@@ -77,6 +77,7 @@
import org.apache.cocoon.components.parser.Parser;
import org.apache.cocoon.components.pipeline.EventPipeline;
import org.apache.cocoon.components.pipeline.StreamPipeline;
+import org.apache.cocoon.components.source.DelayedRefreshSourceWrapper;
import org.apache.cocoon.components.source.SourceHandler;
import org.apache.cocoon.components.source.URLSource;
import org.apache.cocoon.components.store.FilesystemStore;
@@ -103,7 +104,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Pierpaolo Fumagalli</a> (Apache
Software Foundation, Exoffice Technologies)
* @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Leo Sutic</a>
- * @version CVS $Id: Cocoon.java,v 1.10 2002/02/04 12:08:39 cziegeler Exp $
+ * @version CVS $Id: Cocoon.java,v 1.11 2002/02/04 18:18:26 sylvain Exp $
*/
public class Cocoon
extends AbstractLoggable
@@ -182,9 +183,12 @@
this.classpath = (String)context.get(Constants.CONTEXT_CLASSPATH);
this.workDir = (File)context.get(Constants.CONTEXT_WORK_DIR);
try {
- this.configurationFile = new
URLSource((URL)context.get(Constants.CONTEXT_CONFIG_URL),
- this.componentManager);
-
+ // FIXME : add a configuration option for the refresh delay.
+ // for now, hard-coded to 1 second.
+ this.configurationFile = new DelayedRefreshSourceWrapper(
+ new URLSource((URL)context.get(Constants.CONTEXT_CONFIG_URL),
this.componentManager),
+ 1000L
+ );
} catch (IOException ioe) {
getLogger().error("Could not open configuration file.", ioe);
@@ -402,7 +406,6 @@
* @return a <code>boolean</code> value
*/
public boolean modifiedSince(long date) {
- this.configurationFile.refresh();
return date < this.configurationFile.getLastModified();
}
1.3 +6 -2
xml-cocoon2/src/java/org/apache/cocoon/components/source/DelayedRefreshSourceWrapper.java
Index: DelayedRefreshSourceWrapper.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/DelayedRefreshSourceWrapper.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DelayedRefreshSourceWrapper.java 4 Feb 2002 09:40:16 -0000 1.2
+++ DelayedRefreshSourceWrapper.java 4 Feb 2002 18:18:26 -0000 1.3
@@ -70,7 +70,7 @@
* <code>Source.getLastModified()</code> which can be a costly operation.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
- * @version $Id: DelayedRefreshSourceWrapper.java,v 1.2 2002/02/04 09:40:16
cziegeler Exp $
+ * @version $Id: DelayedRefreshSourceWrapper.java,v 1.3 2002/02/04 18:18:26 sylvain
Exp $
*/
public final class DelayedRefreshSourceWrapper implements Source, ModifiableSource,
XMLizable {
@@ -102,6 +102,8 @@
* Get the last modification time for the wrapped <code>Source</code>. The
* age of the returned information is guaranteed to be lower than or equal to
* the delay specified in the constructor.
+ * <p>
+ * This method is also thread-safe, even if the underlying Source is not.
*
* @return the last modification time.
*/
@@ -119,8 +121,10 @@
/**
* Force the refresh of the wrapped <code>Source</code>, even if the refresh
period
* isn't over, and starts a new period.
+ * <p>
+ * This method is thread-safe, even if the underlying Source is not.
*/
- public final void refresh() {
+ public synchronized final void refresh() {
this.nextCheckTime = System.currentTimeMillis() + this.delay;
// Refresh modifiable sources
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]