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]

Reply via email to