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]