cziegeler 2002/09/12 23:46:30
Modified: src/java/org/apache/cocoon/components/pipeline
AbstractProcessingPipeline.java
src/java/org/apache/cocoon/environment/http
HttpEnvironment.java
src/java/org/apache/cocoon/components/treeprocessor/sitemap
PipelineNode.java
src/java/org/apache/cocoon/environment
AbstractEnvironment.java Environment.java
. changes.xml
src/java/org/apache/cocoon/components/pipeline/impl
AbstractCachingProcessingPipeline.java
src/java/org/apache/cocoon Cocoon.java
Log:
Updated buffering of output - it's now configurable
Revision Changes Path
1.22 +15 -5
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java
Index: AbstractProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- AbstractProcessingPipeline.java 9 Sep 2002 12:00:41 -0000 1.21
+++ AbstractProcessingPipeline.java 13 Sep 2002 06:46:29 -0000 1.22
@@ -62,7 +62,6 @@
import org.apache.cocoon.ConnectionResetException;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.CocoonComponentManager;
-import org.apache.cocoon.components.pipeline.OutputComponentSelector;
import org.apache.cocoon.components.treeprocessor.ProcessingNode;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ObjectModelHelper;
@@ -74,6 +73,8 @@
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.XMLProducer;
import org.xml.sax.SAXException;
+import sun.tools.tree.ThisExpression;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -142,6 +143,12 @@
/** Configured Expires value */
protected long configuredExpires;
+ /** Configured Output Buffer Size */
+ protected int configuredOutputBufferSize;
+
+ /** Output Buffer Size */
+ protected int outputBufferSize;
+
/**
* Composable Interface
*/
@@ -168,6 +175,7 @@
if (expiresValue != null) {
this.configuredExpires = this.parseExpires(expiresValue);
}
+ this.configuredOutputBufferSize =
params.getParameterAsInteger("outputBufferSize", -1);
}
/**
@@ -180,6 +188,8 @@
} else {
this.expires = this.configuredExpires;
}
+ this.outputBufferSize = params.getParameterAsInteger("outputBufferSize",
+
this.configuredOutputBufferSize);
}
/**
@@ -467,7 +477,7 @@
return true;
}
try {
- return this.processReader(environment,
environment.getOutputStream());
+ return this.processReader(environment,
environment.getOutputStream(this.outputBufferSize));
} catch (IOException ioe) {
throw new ProcessingException("Processing of reader pipeline
failed.", ioe);
}
@@ -498,10 +508,10 @@
this.generator.generate();
byte[] data = os.toByteArray();
environment.setContentLength(data.length);
- environment.getOutputStream().write(data);
+ environment.getOutputStream(0).write(data);
} else {
// set the output stream
- this.serializer.setOutputStream(environment.getOutputStream());
+
this.serializer.setOutputStream(environment.getOutputStream(this.outputBufferSize));
// execute the pipeline:
this.generator.generate();
}
1.15 +19 -16
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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- HttpEnvironment.java 12 Sep 2002 14:14:36 -0000 1.14
+++ HttpEnvironment.java 13 Sep 2002 06:46:29 -0000 1.15
@@ -256,20 +256,23 @@
* the error has already output some data.
*
* @return true if the response was successfully reset
- */
-/* public boolean tryResetResponse() {
- try {
- if ( !this.response.isCommitted() ) {
- this.response.reset();
- getLogger().debug("Response successfully reset");
- return true;
+ */
+ public boolean tryResetResponse() {
+ if (!super.tryResetResponse()) {
+ try {
+ if (!this.response.isCommitted()) {
+ this.response.reset();
+ getLogger().debug("Response successfully reset");
+ return true;
+ }
+ } catch (Exception e) {
+ // Log the error, but don't transmit it
+ getLogger().warn("Problem resetting response", e);
}
- } catch(Exception e) {
- // Log the error, but don't transmit it
- getLogger().warn("Problem resetting response", e);
+ getLogger().debug("Response wasn't reset");
+ return false;
}
- getLogger().debug("Response wasn't reset");
- return false;
- }*/
-
+ return true;
+ }
+
}
1.16 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java
Index: PipelineNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- PipelineNode.java 12 Sep 2002 14:14:36 -0000 1.15
+++ PipelineNode.java 13 Sep 2002 06:46:29 -0000 1.16
@@ -187,7 +187,7 @@
try {
// Try to reset the response to avoid mixing already produced output
// and error page.
- env.resetResponse();
+ env.tryResetResponse();
// Build a new context
errorContext = new InvokeContext();
1.29 +29 -18
xml-cocoon2/src/java/org/apache/cocoon/environment/AbstractEnvironment.java
Index: AbstractEnvironment.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/AbstractEnvironment.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- AbstractEnvironment.java 12 Sep 2002 14:27:50 -0000 1.28
+++ AbstractEnvironment.java 13 Sep 2002 06:46:29 -0000 1.29
@@ -434,13 +434,34 @@
}
/**
- * Get the OutputStream
+ * Get the output stream where to write the generated resource.
+ * @deprecated Use {@link #getOutputStream(int)} instead.
*/
public OutputStream getOutputStream() throws IOException {
- if (this.secureOutputStream == null) {
- this.secureOutputStream = new BufferedOutputStream(this.outputStream);
- }
- return this.secureOutputStream;
+ // by default we use the complete buffering output stream
+ return this.getOutputStream(-1);
+ }
+
+ /**
+ * Get the output stream where to write the generated resource.
+ * The returned stream is buffered by the environment. If the
+ * buffer size is -1 then the complete output is buffered.
+ * If the buffer size is 0, no buffering takes place.
+ * This method replaces {@link #getOutputStream()}.
+ */
+ public OutputStream getOutputStream(int bufferSize)
+ throws IOException {
+ if (bufferSize == -1) {
+ if (this.secureOutputStream == null) {
+ this.secureOutputStream = new
BufferedOutputStream(this.outputStream);
+ }
+ return this.secureOutputStream;
+ } else if (bufferSize == 0) {
+ return this.outputStream;
+ } else {
+ this.outputStream = new java.io.BufferedOutputStream(this.outputStream,
bufferSize);
+ return this.outputStream;
+ }
}
/**
@@ -448,24 +469,14 @@
* a higher chance to produce clean output if the pipeline that raised
* the error has already output some data.
*
- * @deprecated This is obsoleted by {@link #resetResponse}
* @return true if the response was successfully reset
*/
public boolean tryResetResponse() {
- this.resetResponse();
- return true;
- }
-
- /**
- * Reset the response. This allows error handlers to have
- * a higher chance to produce clean output if the pipeline that raised
- * the error has already output some data.
- *
- */
- public void resetResponse() {
if (this.secureOutputStream != null) {
this.secureOutputStream.clearBuffer();
+ return true;
}
+ return false;
}
/**
1.14 +13 -10
xml-cocoon2/src/java/org/apache/cocoon/environment/Environment.java
Index: Environment.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/Environment.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Environment.java 12 Sep 2002 14:14:36 -0000 1.13
+++ Environment.java 13 Sep 2002 06:46:29 -0000 1.14
@@ -166,10 +166,20 @@
/**
* Get the output stream where to write the generated resource.
+ * @deprecated Use {@link #getOutputStream(int)} instead.
*/
OutputStream getOutputStream() throws IOException;
/**
+ * Get the output stream where to write the generated resource.
+ * The returned stream is buffered by the environment. If the
+ * buffer size is -1 then the complete output is buffered.
+ * If the buffer size is 0, no buffering takes place.
+ * This method replaces {@link #getOutputStream()}.
+ */
+ OutputStream getOutputStream(int bufferSize) throws IOException;
+
+ /**
* Get the underlying object model
*/
Map getObjectModel();
@@ -213,7 +223,7 @@
* if no object is bound under the name.
*
* @param name a string specifying the name of the object
- * @return the object with the specified name
+ * @return the object with the specified name
*/
Object getAttribute(String name);
@@ -238,19 +248,12 @@
* Reset the response if possible. This allows error handlers to have
* a higher chance to produce clean output if the pipeline that raised
* the error has already output some data.
+ * If a buffered output stream is used, resetting is always successful.
*
- * @deprecated This is obsoleted by {@link #resetResponse}
* @return true if the response was successfully reset
*/
boolean tryResetResponse();
- /**
- * Reset the response. This allows error handlers to have
- * a higher chance to produce clean output if the pipeline that raised
- * the error has already output some data.
- *
- */
- void resetResponse();
/**
* Commit the response
1.246 +6 -1 xml-cocoon2/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/changes.xml,v
retrieving revision 1.245
retrieving revision 1.246
diff -u -r1.245 -r1.246
--- changes.xml 11 Sep 2002 12:44:09 -0000 1.245
+++ changes.xml 13 Sep 2002 06:46:29 -0000 1.246
@@ -40,6 +40,11 @@
</devs>
<release version="@version@" date="@date@">
+ <action dev="CZ" type="add">
+ Added configurable buffering of the output. This removes all the problems
+ with error handler and already committed responses etc. A new pipeline
+ parameter "outputBufferSize" controlls the behaviour.
+ </action>
<action dev="SW" type="fix">
AbstractServerPages used static fields for dependency tracking, which caused
either non-modified XSPs to be recompiled, or modified XSPs not to be
recompiled.
1.7 +20 -5
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java
Index: AbstractCachingProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- AbstractCachingProcessingPipeline.java 9 Sep 2002 12:00:41 -0000 1.6
+++ AbstractCachingProcessingPipeline.java 13 Sep 2002 06:46:29 -0000 1.7
@@ -204,7 +204,7 @@
return super.processXMLPipeline( environment );
} else if (this.cachedResponse != null && this.completeResponseIsCached) {
try {
- final OutputStream outputStream = environment.getOutputStream();
+ final OutputStream outputStream = environment.getOutputStream(0);
if (this.cachedResponse.length > 0) {
environment.setContentLength(this.cachedResponse.length);
outputStream.write(this.cachedResponse);
@@ -227,11 +227,15 @@
this.getLogger().debug("Caching content for further requests of '"
+ environment.getURI() + "'.");
}
try {
- OutputStream os = environment.getOutputStream();
+ OutputStream os = null;
+
if ( this.cacheCompleteResponse ) {
- os = new CachingOutputStream( os );
+ os = new CachingOutputStream(
environment.getOutputStream(this.outputBufferSize) );
}
if ( super.serializer != super.lastConsumer ) {
+ if (os == null) {
+ os = environment.getOutputStream(this.outputBufferSize);
+ }
// internal processing
if ( this.xmlDeserializer != null ) {
this.xmlDeserializer.deserialize(this.cachedResponse);
@@ -240,6 +244,9 @@
}
} else {
if (this.serializer.shouldSetContentLength()) {
+ if (os == null) {
+ os = environment.getOutputStream(0);
+ }
// set the output stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
this.serializer.setOutputStream(baos);
@@ -254,6 +261,9 @@
environment.setContentLength(data.length);
os.write(data);
} else {
+ if (os == null) {
+ os = environment.getOutputStream(this.outputBufferSize);
+ }
// set the output stream
this.serializer.setOutputStream( os );
// execute the pipeline:
@@ -598,7 +608,7 @@
throws ProcessingException {
try {
boolean usedCache = false;
- OutputStream outputStream = environment.getOutputStream();
+ OutputStream outputStream = null;
SourceValidity readerValidity = null;
PipelineCacheKey pcKey = null;
@@ -658,6 +668,7 @@
byte[] response = cachedObject.getResponse();
if (response.length > 0) {
usedCache = true;
+ outputStream = environment.getOutputStream(0);
environment.setContentLength(response.length);
outputStream.write(response);
}
@@ -688,12 +699,16 @@
}
}
if (readerValidity != null) {
+ outputStream =
environment.getOutputStream(this.outputBufferSize);
outputStream = new CachingOutputStream(outputStream);
} else {
pcKey = null;
}
}
+ if (outputStream == null) {
+ outputStream =
environment.getOutputStream(this.outputBufferSize);
+ }
super.processReader( environment, outputStream );
// store the response
1.37 +2 -2 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.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- Cocoon.java 12 Sep 2002 14:14:36 -0000 1.36
+++ Cocoon.java 13 Sep 2002 06:46:29 -0000 1.37
@@ -591,7 +591,7 @@
return result;
} catch (Exception any) {
// reset response on error
- environment.resetResponse();
+ environment.tryResetResponse();
throw any;
} finally {
if (this.getLogger().isDebugEnabled()) {
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]