sylvain 01/12/11 13:49:33 Modified: src/org/apache/cocoon/sitemap Handler.java SitemapManager.java Added: src/org/apache/cocoon/components/source DelayedLastModified.java Log: Showcase for reduction of calls to getLastModified() using a passive approach. Revision Changes Path 1.1 xml-cocoon2/src/org/apache/cocoon/components/source/DelayedLastModified.java Index: DelayedLastModified.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.components.source; import org.apache.cocoon.environment.Source; import org.apache.cocoon.environment.ModifiableSource; /** * A front-end to a <code>Source</code> that reduces the number of calls to * <code>Source.getLastModified()</code>, which can be a costly operation. * * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a> * @version $Id: DelayedLastModified.java,v 1.1 2001/12/11 21:49:33 sylvain Exp $ */ public final class DelayedLastModified { private Source source; private long delay; private long nextCheckTime = 0; private long lastModified = 0; private boolean isModifiableSource; /** * Creates a new delay for a <code>Source</code> which ensures that * <code>Source.getLastModified()</code> won't be called more than once per * <code>delay</code> milliseconds period. * * @param source the wrapped <code>Source</code> * @param delay the last-modified refresh delay, in milliseconds */ public DelayedLastModified(Source source, long delay) { this.source = source; this.delay = delay; this.isModifiableSource = source instanceof ModifiableSource; } /** * Get the last modification time for the resource. The age of the returned * information is guaranteed to be lower or equal to the delay specified in * {@link #DelayedLastModified(Source, long)}. * * @return the last modification time. */ public long get() { long now = System.currentTimeMillis(); // Do we have to refresh lastModified ? if (now >= nextCheckTime) { // Get a new lastModified value this.nextCheckTime = now + this.delay; // Refresh modifiable sources if (this.isModifiableSource) { ((ModifiableSource)this.source).refresh(); } this.lastModified = source.getLastModified(); } return this.lastModified; } } 1.24 +14 -4 xml-cocoon2/src/org/apache/cocoon/sitemap/Handler.java Index: Handler.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/Handler.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- Handler.java 2001/10/25 20:36:40 1.23 +++ Handler.java 2001/12/11 21:49:33 1.24 @@ -25,6 +25,7 @@ import org.apache.cocoon.components.pipeline.StreamPipeline; import org.apache.cocoon.components.source.CocoonSourceFactory; import org.apache.cocoon.components.source.SourceHandler; +import org.apache.cocoon.components.source.DelayedLastModified; import org.apache.cocoon.environment.Environment; import org.apache.cocoon.environment.ModifiableSource; import org.apache.cocoon.environment.Source; @@ -41,7 +42,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> - * @version CVS $Revision: 1.23 $ $Date: 2001/10/25 20:36:40 $ + * @version CVS $Revision: 1.24 $ $Date: 2001/12/11 21:49:33 $ */ public class Handler extends AbstractLoggable implements Runnable, Contextualizable, Composable, Processor, Disposable, SourceResolver { @@ -52,6 +53,7 @@ /** the source of this sitemap */ private String sourceFileName; private ModifiableSource source; + private DelayedLastModified sourceLastModified; /** the last error */ private Exception exception; @@ -71,11 +73,19 @@ /** The source handler for the sitemap components */ private SourceHandler sourceHandler; + // FIXME : ugly hack to pass delay information from the main sitemap configuration + // (the way to pass it cleanly from SitemapManager isn't obvious). + private static long sitemapCheckDelay = 10000L; // default is 10 secs. + + static void setSitemapCheckDelay(long delay) { + sitemapCheckDelay = delay; + } + protected Handler(String sourceFileName, boolean check_reload) throws FileNotFoundException { this.check_reload = check_reload; this.sourceFileName = sourceFileName; } - + /** * Contextualizable */ @@ -99,8 +109,7 @@ protected boolean hasChanged() { if (available()) { if (check_reload) { - this.source.refresh(); - return sitemap.modifiedSince(this.source.getLastModified()); + return sitemap.modifiedSince(this.sourceLastModified.get()); } return false; } @@ -119,6 +128,7 @@ try { environment.setSourceHandler(this.sourceHandler); this.source = (ModifiableSource)environment.resolve(this.sourceFileName); + this.sourceLastModified = new DelayedLastModified(this.source, this.sitemapCheckDelay); this.contextSource = environment.resolve(""); } finally { environment.setSourceHandler(oldSourceHandler); 1.2 +5 -1 xml-cocoon2/src/org/apache/cocoon/sitemap/SitemapManager.java Index: SitemapManager.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/SitemapManager.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SitemapManager.java 2001/10/25 10:34:00 1.1 +++ SitemapManager.java 2001/12/11 21:49:33 1.2 @@ -38,7 +38,7 @@ * to Java code. * * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a> - * @version CVS $Revision: 1.1 $ $Date: 2001/10/25 10:34:00 $ + * @version CVS $Revision: 1.2 $ $Date: 2001/12/11 21:49:33 $ */ public class SitemapManager extends Manager implements Processor, Configurable { @@ -63,9 +63,13 @@ value = sconf.getAttribute("reload-method", "asynchron"); this.reloadSitemapAsynchron = !(value != null && value.equalsIgnoreCase("synchron") == true); + long checkDelay = sconf.getAttributeAsLong("check-delay", 10L); + Handler.setSitemapCheckDelay(checkDelay * 1000L); + getLogger().debug("Sitemap location = " + this.sitemapFileName); getLogger().debug("Checking sitemap reload = " + this.checkSitemapReload); getLogger().debug("Reloading sitemap asynchron = " + this.reloadSitemapAsynchron); + getLogger().debug("Sitemap check delay = " + checkDelay + " seconds"); System.err.println("Sitemap location = " + this.sitemapFileName); System.err.println("Checking sitemap reload = " + this.checkSitemapReload);
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]