cziegeler 2002/12/18 00:09:24 Modified: src/java/org/apache/cocoon/environment/http HttpEnvironment.java src/java/org/apache/cocoon/reading ResourceReader.java . changes.xml Log: Fixing bug 12915 <action dev="CZ" type="fix" fixes-bug="12915"> The resource reader now checks if for the same URI the same source is read in order to test the if-last-modified header. This behaviour can be turned of (for more performance) by the quick-modified-test. </action> Revision Changes Path 1.20 +1 -6 xml-cocoon2/src/java/org/apache/cocoon/environment/http/HttpEnvironment.java Index: HttpEnvironment.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/http/HttpEnvironment.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- HttpEnvironment.java 5 Dec 2002 10:25:52 -0000 1.19 +++ HttpEnvironment.java 18 Dec 2002 08:09:24 -0000 1.20 @@ -239,15 +239,10 @@ * environment is not able to test it */ public boolean isResponseModified(long lastModified) { - // workaround for bug #12915 - // FIXME - return true; - /* long if_modified_since = this.request.getDateHeader("If-Modified-Since"); this.response.setDateHeader("Last-Modified", lastModified); return (if_modified_since < lastModified); - */ } /** 1.21 +34 -4 xml-cocoon2/src/java/org/apache/cocoon/reading/ResourceReader.java Index: ResourceReader.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/reading/ResourceReader.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- ResourceReader.java 5 Dec 2002 10:32:58 -0000 1.20 +++ ResourceReader.java 18 Dec 2002 08:09:24 -0000 1.21 @@ -56,6 +56,7 @@ import org.apache.cocoon.components.source.SourceUtil; import org.apache.cocoon.environment.Context; import org.apache.cocoon.environment.ObjectModelHelper; +import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Response; import org.apache.cocoon.environment.SourceResolver; import org.apache.excalibur.source.Source; @@ -65,6 +66,7 @@ import java.io.IOException; import java.io.InputStream; +import java.util.HashMap; import java.util.Map; /** @@ -82,19 +84,30 @@ * in miliseconds the resources can be cached by any proxy or browser * between Cocoon2 and the requesting visitor. * </dd> + * <dt><quick-modified-test></dt> + * <dd>This parameter is optional. This boolean parameter controlls the + * last modified test. If set to true (default is false), only the + * last modified of the current source is tested, but not if the + * same source is used as last time. + * </dd> * </dl> * * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * @version CVS $Id$ */ -public class ResourceReader +public final class ResourceReader extends AbstractReader implements CacheableProcessingComponent { /** The source */ private Source inputSource; - + /** The list of generated documents */ + private static final Map documents = new HashMap(); + + /** quick test */ + private boolean quickTest; + /** * Setup the reader. * The resource is opened to get an <code>InputStream</code>, @@ -103,6 +116,7 @@ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException { super.setup(resolver, objectModel, src, par); + this.quickTest = par.getParameterAsBoolean("quick-modified-test", false); try { this.inputSource = resolver.resolveURI(src); } catch (SourceException se) { @@ -146,7 +160,17 @@ * possible to detect */ public long getLastModified() { - return this.inputSource.getLastModified(); + if (this.quickTest) { + return this.inputSource.getLastModified(); + } + final Request request = ObjectModelHelper.getRequest(this.objectModel); + final String systemId = (String)documents.get(request.getRequestURI()); + if (this.inputSource.getSystemId().equals(systemId)) { + return this.inputSource.getLastModified(); + } else { + documents.remove(request.getRequestURI()); + return 0; + } } /** @@ -183,6 +207,12 @@ inputStream.close(); inputStream = null; out.flush(); + + if (!this.quickTest) { + // if everything is ok, add this to the list of generated documents + final Request request = ObjectModelHelper.getRequest(this.objectModel); + documents.put(request.getRequestURI(), this.inputSource.getSystemId()); + } } catch (SourceException se) { throw SourceUtil.handle("Exception during resolving of read source.", se); } 1.310 +6 -1 xml-cocoon2/changes.xml Index: changes.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/changes.xml,v retrieving revision 1.309 retrieving revision 1.310 diff -u -r1.309 -r1.310 --- changes.xml 17 Dec 2002 12:03:06 -0000 1.309 +++ changes.xml 18 Dec 2002 08:09:24 -0000 1.310 @@ -608,6 +608,11 @@ properties which were not addressed in the http request (like unchecked checkboxes). This applies to session scope forms only. </action> + <action dev="CZ" type="fix" fixes-bug="12915"> + The resource reader now checks if for the same URI the same source is read + in order to test the if-last-modified header. This behaviour can be turned + of (for more performance) by the quick-modified-test. + </action> </release> <release version="2.0.4" date="December 06 2002"> <action dev="SW" type="update">
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]