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]