cziegeler    02/05/27 02:57:19

  Modified:    src/java/org/apache/cocoon/caching Cache.java
               src/java/org/apache/cocoon/caching/impl CacheImpl.java
               src/java/org/apache/cocoon/components/pipeline
                        AbstractProcessingPipeline.java
               src/java/org/apache/cocoon/components/pipeline/impl
                        CachingProcessingPipeline.java
  Log:
  Minor update of the caching algorithm
  
  Revision  Changes    Path
  1.2       +4 -4      xml-cocoon2/src/java/org/apache/cocoon/caching/Cache.java
  
  Index: Cache.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/caching/Cache.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Cache.java        6 May 2002 13:22:31 -0000       1.1
  +++ Cache.java        27 May 2002 09:57:18 -0000      1.2
  @@ -62,7 +62,7 @@
    *
    * @since @next-version@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  - * @version CVS $Id: Cache.java,v 1.1 2002/05/06 13:22:31 cziegeler Exp $
  + * @version CVS $Id: Cache.java,v 1.2 2002/05/27 09:57:18 cziegeler Exp $
    */
   public interface Cache
   extends Component {
  @@ -78,7 +78,7 @@
        * @param response    the cached response
        */
       void store(Map            objectModel,
  -               String         key,
  +               Object         key,
                  CachedResponse response)
       throws ProcessingException;
   
  @@ -88,7 +88,7 @@
        * @param key         the key used by the caching algorithm to identify the
        *                    request
        */
  -    CachedResponse get(String key);
  +    CachedResponse get(Object key);
   
       /**
        * Remove a cached response.
  @@ -96,5 +96,5 @@
        * @param key         the key used by the caching algorithm to identify the
        *                    request
        */
  -    void remove(String key);
  +    void remove(Object key);
   }
  
  
  
  1.2       +4 -4      
xml-cocoon2/src/java/org/apache/cocoon/caching/impl/CacheImpl.java
  
  Index: CacheImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/caching/impl/CacheImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CacheImpl.java    6 May 2002 13:22:31 -0000       1.1
  +++ CacheImpl.java    27 May 2002 09:57:18 -0000      1.2
  @@ -71,7 +71,7 @@
    *
    * @since @next-version@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  - * @version CVS $Id: CacheImpl.java,v 1.1 2002/05/06 13:22:31 cziegeler Exp $
  + * @version CVS $Id: CacheImpl.java,v 1.2 2002/05/27 09:57:18 cziegeler Exp $
    */
   public class CacheImpl
   extends AbstractLogEnabled
  @@ -109,7 +109,7 @@
        * @param response    the cached response
        */
       public void store(Map            objectModel,
  -                      String         key,
  +                      Object         key,
                         CachedResponse response)
       throws ProcessingException {
           try {
  @@ -125,7 +125,7 @@
        * @param key         the key used by the caching algorithm to identify the
        *                    request
        */
  -    public CachedResponse get(String key) {
  +    public CachedResponse get(Object key) {
           return (CachedResponse)this.store.get(key);
       }
   
  @@ -135,7 +135,7 @@
        * @param key         the key used by the caching algorithm to identify the
        *                    request
        */
  -    public void remove(String key) {
  +    public void remove(Object key) {
           this.store.remove(key);
       }
   
  
  
  
  1.9       +32 -47    
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.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AbstractProcessingPipeline.java   21 May 2002 10:16:20 -0000      1.8
  +++ AbstractProcessingPipeline.java   27 May 2002 09:57:19 -0000      1.9
  @@ -81,7 +81,7 @@
    *
    * @since @next-version@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  - * @version CVS $Id: AbstractProcessingPipeline.java,v 1.8 2002/05/21 10:16:20 
cziegeler Exp $
  + * @version CVS $Id: AbstractProcessingPipeline.java,v 1.9 2002/05/27 09:57:19 
cziegeler Exp $
    */
   public abstract class AbstractProcessingPipeline
     extends AbstractLogEnabled
  @@ -360,60 +360,49 @@
       }
   
       /**
  -     * Connect the XML pipeline.
  +     * Connect the next component
        */
  -    protected void connectPipeline(Environment environment)
  +    protected void connect(Environment environment,
  +                           XMLProducer producer,
  +                           XMLConsumer consumer)
       throws ProcessingException {
  -        XMLProducer prev = (XMLProducer)this.generator;
  -        XMLConsumer next;
  -
           try {
  -            Iterator itt = this.transformers.iterator();
  -            while ( itt.hasNext() ) {
  -                if (this.configuredSAXConnector) {
  -                    // connect SAXConnector
  -                    SAXConnector connect = (SAXConnector) 
this.manager.lookup(SAXConnector.ROLE);
  -                    connect.setup(environment,environment.getObjectModel(), null, 
null);
  -                    this.connectors.add(connect);
  -                    next = connect;
  -                    prev.setConsumer(next);
  -                    prev = connect;
  -                }
  -                // Connect next component.
  -                Transformer trans = (Transformer) itt.next();
  -                next = trans;
  -                prev.setConsumer(next);
  -                prev = trans;
  -            }
  -
  +            XMLProducer next = producer;
               if (this.configuredSAXConnector) {
  -                // insert SAXConnector
  +                // connect SAXConnector
                   SAXConnector connect = (SAXConnector) 
this.manager.lookup(SAXConnector.ROLE);
  -                connect.setup(environment,environment.getObjectModel(), null, null);
                   this.connectors.add(connect);
  +                connect.setup(environment, environment.getObjectModel(), null, 
null);
  +                next.setConsumer( connect );
                   next = connect;
  -                prev.setConsumer(next);
  -                prev = connect;
               }
  -            // insert the serializer
  -            prev.setConsumer(this.lastConsumer);
  +            // Connect next component.
  +            next.setConsumer(consumer);
           } catch ( IOException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  +            throw new ProcessingException("Could not connect pipeline.", e);
           } catch ( SAXException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  +            throw new ProcessingException("Could not connect pipeline.", e);
           } catch ( ComponentException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  +            throw new ProcessingException("Could not connect pipeline.", e);
  +        }
  +    }
  +
  +    /**
  +     * Connect the XML pipeline.
  +     */
  +    protected void connectPipeline(Environment environment)
  +    throws ProcessingException {
  +        XMLProducer prev = (XMLProducer)this.generator;
  +
  +        Iterator itt = this.transformers.iterator();
  +        while ( itt.hasNext() ) {
  +            Transformer trans = (Transformer) itt.next();
  +            this.connect( environment, prev, trans );
  +            prev = trans;
           }
   
  +        // insert the serializer
  +        this.connect( environment, prev, this.lastConsumer);
       }
   
       /**
  @@ -475,11 +464,7 @@
           } catch ( ProcessingException e ) {
               throw e;
           } catch ( Exception e ) {
  -            getLogger().debug("Exception in process", e);
  -            throw new ProcessingException(
  -                "Failed to execute pipeline.",
  -                e
  -            );
  +            throw new ProcessingException("Failed to execute pipeline.", e);
           }
           return true;
       }
  
  
  
  1.10      +160 -316  
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java
  
  Index: CachingProcessingPipeline.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- CachingProcessingPipeline.java    24 May 2002 08:52:33 -0000      1.9
  +++ CachingProcessingPipeline.java    27 May 2002 09:57:19 -0000      1.10
  @@ -75,7 +75,7 @@
   import org.apache.cocoon.xml.XMLProducer;
   import org.apache.excalibur.source.SourceValidity;
   import org.xml.sax.SAXException;
  -
  +import java.io.ByteArrayOutputStream;
   import java.io.IOException;
   import java.io.OutputStream;
   import java.net.SocketException;
  @@ -89,32 +89,42 @@
    *
    * @since @next-version@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  - * @version CVS $Id: CachingProcessingPipeline.java,v 1.9 2002/05/24 08:52:33 
cziegeler Exp $
  + * @version CVS $Id: CachingProcessingPipeline.java,v 1.10 2002/05/27 09:57:19 
cziegeler Exp $
    */
   public class CachingProcessingPipeline
   extends AbstractProcessingPipeline
   implements Disposable {
   
       /** The Cache storing the cached response (or part of the response) */
  -    private Cache  cache;
  +    protected Cache  cache;
   
       /** The role name of the generator */
  -    private String generatorRole;
  +    protected String generatorRole;
   
       /** The role names of the transfomrers */
  -    private ArrayList transformerRoles = new ArrayList();
  +    protected ArrayList transformerRoles = new ArrayList();
   
       /** The role name of the serializer */
  -    private String serializerRole;
  +    protected String serializerRole;
   
       /** The role name of the reader */
  -    private String readerRole;
  +    protected String readerRole;
   
  -    private ArrayList notCacheableTransformers = new ArrayList();
  -    private Map validityObjects;
  -    private StringBuffer pipelineCacheKey;
  +    /** A cached response which is used as input for the pipeline */
  +    protected CachedResponse cachedResponse;
  +    /** The key to store the cached response */
  +    protected StringBuffer   pipelineCacheKey;
  +    /** The index indicating to the first transformer which is not cacheable */
  +    protected int firstNotCacheableTransformerIndex;
  +    /** The deserializer */
  +    protected XMLDeserializer xmlDeserializer;
  +    /** Complete response is cached */
  +    protected boolean completeResponseIsCached;
  +    /** The serializer */
  +    protected XMLSerializer xmlSerializer;
   
  -    private int firstNotCacheableTransformerIndex;
  +    /** The validity objects */
  +    protected SourceValidity[] validityObjects;
   
       /**
        * Composable Interface
  @@ -163,95 +173,78 @@
   
       /**
        * Process the given <code>Environment</code>, producing the output.
  +     */
       protected boolean processXMLPipeline(Environment environment)
       throws ProcessingException {
  -
  -        // we cache if the pipelinecachekey is available
  -        XMLSerializer xmlSerializer = null;
  -
  -        try {
  -            if (this.pipelineCacheKey != null) {
  -                // now we have the key to get the cached object
  -                CachedEventObject cachedObject = 
(CachedEventObject)this.cache.get(this.pipelineCacheKey);
  -
  -                if (cachedObject != null) {
  -                    getLogger().debug("Found cached content for '" + 
environment.getURI() + "'.");
  -                    Iterator validityIterator = validityObjects.keySet().iterator();
  -                    ComponentCacheKey validityKey;
  -                    boolean valid = true;
  -                    while (validityIterator.hasNext() && valid) {
  -                        validityKey = (ComponentCacheKey)validityIterator.next();
  -                        valid = cachedObject.isValid(validityKey, 
(CacheValidity)validityObjects.get(validityKey));
  -                        if (getLogger().isDebugEnabled()) {
  -                            CacheValidity cachedValidity = 
cachedObject.getCacheValidity(validityKey);
  -                            getLogger().debug("Compared cached validity '" + 
cachedValidity +
  -                                "' with new validity '" + 
validityObjects.get(validityKey) +
  -                                "' : " + (valid ? "valid" : "changed"));
  -                        }
  +        if (this.pipelineCacheKey == null) {
  +            return super.processXMLPipeline( environment );
  +        } else if (this.completeResponseIsCached) {
  +            try {
  +                final OutputStream outputStream = environment.getOutputStream();
  +                byte[] response = this.cachedResponse.getResponse();
  +                if (response.length > 0) {
  +                    environment.setContentLength(response.length);
  +                    outputStream.write(response);
  +                }
  +            } catch ( SocketException se ) {
  +                if (se.getMessage().indexOf("reset") > 0
  +                    || se.getMessage().indexOf("aborted") > 0) {
  +                    throw new ConnectionResetException("Connection reset by peer", 
se);
  +                } else {
  +                    throw new ProcessingException("Failed to execute reader 
pipeline.", se);
  +                }
  +            } catch ( Exception e ) {
  +                throw new ProcessingException("Error executing reader pipeline.",e);
  +            }
  +        } else {
  +            try {
  +                if (this.serializer.shouldSetContentLength()) {
  +                    // set the output stream
  +                    ByteArrayOutputStream os = new ByteArrayOutputStream();
  +                    this.serializer.setOutputStream(os);
  +
  +                    // execute the pipeline:
  +                    if ( this.xmlDeserializer != null ) {
  +                        
this.xmlDeserializer.deserialize(this.cachedResponse.getResponse());
  +                    } else {
  +                        this.generator.generate();
                       }
  -                    if (valid) {
  -                        getLogger().debug("Using valid cached content for '" + 
environment.getURI() + "'.");
  -                        // get all transformers which are not cacheable
  -                        int transformerSize = this.transformers.size();
  -                        while (this.firstNotCacheableTransformerIndex < 
transformerSize) {
  -                            
this.notCacheableTransformers.add(this.transformers.get(this.firstNotCacheableTransformerIndex));
  -                            this.firstNotCacheableTransformerIndex++;
  -                        }
  -
  -                        XMLDeserializer deserializer = null;
  -                        try {
  -                            deserializer = 
(XMLDeserializer)this.manager.lookup(XMLDeserializer.ROLE);
  -                            // connect the pipeline:
  -                            this.producer = deserializer;
  -                            this.connectPipeline(environment,
  -                                                 notCacheableTransformers,
  -                                                 null);
  -                            // execute the pipeline:
  -                            deserializer.deserialize(cachedObject.getSAXFragment());
  -                        } catch ( ProcessingException e ) {
  -                            throw e;
  -                        } catch ( Exception e ) {
  -                            throw new ProcessingException(
  -                                 "Failed to execute pipeline.",
  -                                  e
  -                            );
  -                        } finally {
  -                            this.manager.release(deserializer);
  -                        }
  +                    byte[] data = os.toByteArray();
  +                    environment.setContentLength(data.length);
  +                    environment.getOutputStream().write(data);
  +                } else {
  +                    // set the output stream
  +                    this.serializer.setOutputStream(environment.getOutputStream());
  +                    // execute the pipeline:
  +                    if ( this.xmlDeserializer != null ) {
  +                        
this.xmlDeserializer.deserialize(this.cachedResponse.getResponse());
                       } else {
  -                        getLogger().debug("Cached content is invalid for '" + 
environment.getURI() + "'.");
  -                        // remove invalid cached object
  -                        this.eventCache.remove(this.pipelineCacheKey);
  -                        cachedObject = null;
  +                        this.generator.generate();
                       }
                   }
  -                if (cachedObject == null) {
  -                    getLogger().debug("Caching content for further requests of '" + 
environment.getURI() + "'.");
  -                    xmlSerializer = 
(XMLSerializer)this.manager.lookup(XMLSerializer.ROLE);
  -                }
  -            }
  -
  -            if (this.producer == null) {
  -                // the content was not cached/or is invalid
  -                this.producer = this.generator;
  -                this.connectPipeline(environment,
  -                                     this.transformers,
  -                                     xmlSerializer);
  -                // execute the pipeline:
  -                this.generator.generate();
  -                // did we have cacheable components?
  -                if (xmlSerializer != null) {
  -                    this.eventCache.store(this.pipelineCacheKey,
  -                        new CachedEventObject(this.validityObjects,
  -                        xmlSerializer.getSAXFragment()));
  +                if (this.xmlSerializer != null) {
  +                    CachedResponse response = new 
CachedResponse(this.validityObjects,
  +                                 (byte[])this.xmlSerializer.getSAXFragment());
  +                    this.cache.store(environment.getObjectModel(),
  +                                     this.pipelineCacheKey,
  +                                     response);
  +                }
  +            } catch ( SocketException se ) {
  +                if (se.getMessage().indexOf("reset") > 0
  +                    || se.getMessage().indexOf("aborted") > 0) {
  +                    throw new ConnectionResetException("Connection reset by peer", 
se);
  +                } else {
  +                    throw new ProcessingException("Failed to execute reader 
pipeline.", se);
                   }
  +            } catch ( ProcessingException e ) {
  +                throw e;
  +            } catch ( Exception e ) {
  +                throw new ProcessingException("Failed to execute pipeline.", e);
               }
  -        } finally {
  -            this.manager.release(xmlSerializer);
  +            return true;
           }
           return true;
       }
  -     */
   
       /**
        * Setup the evenet pipeline.
  @@ -263,6 +256,7 @@
           super.setupPipeline( environment );
   
           this.firstNotCacheableTransformerIndex = 0;
  +        this.completeResponseIsCached = false;
   
           // first step is to generate the key:
           // All pipeline components starting with the generator
  @@ -329,7 +323,7 @@
                                            .append(this.serializerRole)
                                            .append('-')
                                            .append(key);
  -                    // FIXME - WE ARE CACHEABLE
  +                    this.completeResponseIsCached = true;
                   }
               }
           }
  @@ -387,7 +381,10 @@
                   // FIXME
                   if ( responseIsValid ) {
                       // we are valid, ok that's it
  +                    this.cachedResponse = response;
  +                    this.validityObjects = validities;
                   } else {
  +                    this.cachedResponse = null;
                       // we are not valid!
                       this.cache.remove(this.pipelineCacheKey.toString());
                       if (!responseIsUsable) {
  @@ -477,82 +474,74 @@
           }*/
       }
   
  -    /** Connect the pipeline.
  -    private void connectPipeline(Environment   environment,
  -                                 ArrayList     usedTransformers,
  -                                 XMLSerializer xmlSerializer)
  +    /**
  +     * Connect the pipeline.
  +     */
  +    protected void connectPipeline(Environment   environment)
       throws ProcessingException {
  -        XMLProducer prev = this.producer;
  -        XMLConsumer next;
  -
  -        boolean configuredSAXConnector = 
this.manager.hasComponent(SAXConnector.ROLE);
  -
  -        try {
  -            int cacheableTransformerCount = this.firstNotCacheableTransformerIndex;
  -
  -            Iterator itt = usedTransformers.iterator();
  -            while ( itt.hasNext() ) {
  -                if (configuredSAXConnector) {
  -                    // connect SAXConnector
  -                    SAXConnector connect = (SAXConnector) 
this.manager.lookup(SAXConnector.ROLE);
  -                    
connect.setup(environment,environment.getObjectModel(),null,null);
  -                    this.connectors.add(connect);
  -                    next = connect;
  -                    prev.setConsumer(next);
  -                    prev = connect;
  -                }
  -
  -                // Connect next component.
  -                next = (XMLConsumer) itt.next();
  -                if (xmlSerializer != null) {
  -                    if (cacheableTransformerCount == 0) {
  -                        next = new XMLTeePipe(next, xmlSerializer);
  -                        xmlSerializer = null;
  -                    } else {
  -                        cacheableTransformerCount--;
  +        if ( this.pipelineCacheKey == null ) {
  +            super.connectPipeline( environment );
  +        } else if (this.completeResponseIsCached) {
  +            // do nothing
  +            return;
  +        } else {
  +            try {
  +                this.xmlSerializer = (XMLSerializer)this.manager.lookup( 
XMLSerializer.ROLE );
  +                XMLSerializer localXMLSerializer = this.xmlSerializer;
  +                if ( this.cachedResponse == null ) {
  +                    XMLProducer prev = super.generator;
  +                    XMLConsumer next;
  +
  +                    int cacheableTransformerCount = 
this.firstNotCacheableTransformerIndex;
  +
  +                    Iterator itt = this.transformers.iterator();
  +                    while ( itt.hasNext() ) {
  +                        next = (XMLConsumer) itt.next();
  +                        if (localXMLSerializer != null) {
  +                            if (cacheableTransformerCount == 0) {
  +                                next = new XMLTeePipe(next, localXMLSerializer);
  +                                localXMLSerializer = null;
  +                            } else {
  +                                cacheableTransformerCount--;
  +                            }
  +                        }
  +                        this.connect(environment, prev, next);
  +                        prev = (XMLProducer) next;
                       }
  +                    next = super.lastConsumer;
  +                    if (localXMLSerializer != null) {
  +                        next = new XMLTeePipe(next, localXMLSerializer);
  +                        localXMLSerializer = null;
  +                    }
  +                    this.connect(environment, prev, next);
  +                } else {
  +                    this.xmlDeserializer = 
(XMLDeserializer)this.manager.lookup(XMLDeserializer.ROLE);
  +                    // connect the pipeline:
  +                    XMLProducer prev = xmlDeserializer;
  +                    XMLConsumer next;
  +                    int cacheableTransformerCount = 0;
  +                    Iterator itt = this.transformers.iterator();
  +                    while ( itt.hasNext() ) {
  +                        next = (XMLConsumer) itt.next();
  +                        if (cacheableTransformerCount >= 
this.firstNotCacheableTransformerIndex) {
  +                            this.connect(environment, prev, next);
  +                            prev = (XMLProducer)next;
  +                        }
  +                    }
  +                    next = super.lastConsumer;
  +                    if (localXMLSerializer != null) {
  +                        next = new XMLTeePipe(next, localXMLSerializer);
  +                        localXMLSerializer = null;
  +                    }
  +                    this.connect(environment, prev, next);
                   }
  -                prev.setConsumer(next);
  -                prev = (XMLProducer) next;
  -            }
   
  -            if (configuredSAXConnector) {
  -                // insert SAXConnector
  -                SAXConnector connect = (SAXConnector) 
this.manager.lookup(SAXConnector.ROLE);
  -                connect.setup(environment,environment.getObjectModel(),null,null);
  -                this.connectors.add(connect);
  -                next = connect;
  -                prev.setConsumer(next);
  -                prev = connect;
  -            }
  -
  -            // insert this consumer
  -            next = super.xmlConsumer;
  -            if (xmlSerializer != null) {
  -                next = new XMLTeePipe(next, xmlSerializer);
  -                xmlSerializer = null;
  -            }
  -            prev.setConsumer(next);
  -
  -        } catch ( IOException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  -        } catch ( SAXException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  -        } catch ( ComponentException e ) {
  -            throw new ProcessingException(
  -                "Could not connect pipeline.",
  -                e
  -            );
  +            } catch ( ComponentException e ) {
  +                throw new ProcessingException("Could not connect pipeline.", e);
  +            }
           }
  -
       }
  -     */
  +
   
       /** Process the pipeline using a reader.
        * @throws ProcessingException if an error occurs
  @@ -561,7 +550,7 @@
       throws ProcessingException {
           try {
               boolean usedCache = false;
  -            OutputStream outputStream = environment.getOutputStream();;
  +            OutputStream outputStream = environment.getOutputStream();
               SourceValidity readerValidity = null;
               StringBuffer pcKey = null;
   
  @@ -670,182 +659,37 @@
                   || se.getMessage().indexOf("aborted") > 0) {
                   throw new ConnectionResetException("Connection reset by peer", se);
               } else {
  -                getLogger().debug("SocketException in ProcessReader", se);
  -
  -                throw new ProcessingException(
  -                    "Failed to execute pipeline.",
  -                    se
  -                );
  +                throw new ProcessingException("Failed to execute pipeline.", se);
               }
           } catch ( ProcessingException e ) {
               throw e;
           } catch ( Exception e ) {
  -            getLogger().debug("Exception in ProcessReader", e);
  -
  -            throw new ProcessingException(
  -                "Failed to execute pipeline.",
  -                e
  -            );
  +            throw new ProcessingException("Failed to execute pipeline.", e);
           }
   
           return true;
       }
   
  -    protected boolean processXMLPipeline(Environment environment)
  -    throws ProcessingException {
  -        return super.processXMLPipeline( environment );
  -    }
  -   /**
  -     * Process the request.
  -    public boolean process(Environment environment)
  -    throws ProcessingException {
  -        if ( super.reader != null ) {
  -            return super.process(environment);
  -        } else {
  -            if ( !this.checkPipeline() ) {
  -                throw new ProcessingException("Attempted to process incomplete 
pipeline.");
  -            }
  -
  -            try {
  -
  -                boolean usedCache = false;
  -                OutputStream outputStream;
  -                PipelineCacheKey pcKey = null;
  -                Map validityObjects = null;
  -
  -                outputStream = environment.getOutputStream();
  -
  -                this.setupPipeline(environment);
  -                this.connectPipeline();
  -
  -                // test if serializer and event pipeline are cacheable
  -                long serializerKey = 0;
  -                PipelineCacheKey eventPipelineKey = null;
  -                CacheValidity serializerValidity = null;
  -                Map eventPipelineValidity = null;
  -                if (this.eventPipeline instanceof CacheableEventPipeline) {
  -                    if (this.serializer instanceof Cacheable
  -                        && (serializerKey = 
((Cacheable)this.serializer).generateKey()) != 0
  -                        && (serializerValidity = 
((Cacheable)this.serializer).generateValidity()) != null
  -                        && (eventPipelineKey = 
((CacheableEventPipeline)this.eventPipeline).generateKey(environment)) != null
  -                        && (eventPipelineValidity = 
((CacheableEventPipeline)this.eventPipeline).generateValidity(environment)) != null) {
  -
  -                        // tell the event pipeline that it must not cache
  -                        
((CacheableEventPipeline)this.eventPipeline).setStreamPipelineCaches(true);
  -
  -                        // response is cacheable, build the key
  -                        validityObjects = eventPipelineValidity;
  -                        ComponentCacheKey ccKey;
  -                        pcKey = new PipelineCacheKey();
  -                        ccKey = new 
ComponentCacheKey(ComponentCacheKey.ComponentType_Serializer,
  -                                                    this.serializerRole,
  -                                                    serializerKey);
  -                        validityObjects.put(ccKey, serializerValidity);
  -                        pcKey.addKey(ccKey);
  -                        pcKey.addKey(eventPipelineKey);
  -
  -                        // now we have the key to get the cached object
  -                        CachedStreamObject cachedObject = 
(CachedStreamObject)this.streamCache.get(pcKey);
  -
  -                        if (cachedObject != null) {
  -                            getLogger().debug("Found cached response for '" + 
environment.getURI() + "'.");
  -
  -                            Iterator validityIterator = 
validityObjects.keySet().iterator();
  -                            ComponentCacheKey validityKey;
  -                            boolean valid = true;
  -                            while (validityIterator.hasNext() && valid) {
  -                                validityKey = 
(ComponentCacheKey)validityIterator.next();
  -                                valid = cachedObject.isValid(validityKey, 
(CacheValidity)validityObjects.get(validityKey));
  -                                if (getLogger().isDebugEnabled()) {
  -                                    CacheValidity cachedValidity = 
cachedObject.getCacheValidity(validityKey);
  -                                    getLogger().debug("Compared cached validity '" 
+ cachedValidity +
  -                                        "' with new validity '" + 
validityObjects.get(validityKey) +
  -                                        "' : " + (valid ? "valid" : "changed"));
  -                                }
  -                            }
  -                            if (valid) {
  -                                getLogger().debug("Using valid cached content for 
'" + environment.getURI() + "'.");
  -                                byte[] bytes = cachedObject.getResponse();
  -                                if(bytes.length > 0) {
  -                                    usedCache = true;
  -                                    environment.setContentLength(bytes.length);
  -                                    outputStream.write(bytes);
  -                                }
  -                            }
  -
  -                            if (!usedCache) {
  -                                getLogger().debug("Cached content is invalid for '" 
+ environment.getURI() + "'.");
  -
  -                                // remove invalid cached object
  -                                this.streamCache.remove(pcKey);
  -                                cachedObject = null;
  -                            }
  -                        }
  -                        if (cachedObject == null) {
  -                            getLogger().debug("Caching content for further requests 
of '" + environment.getURI() + "'.");
  -                            outputStream = new CachingOutputStream(outputStream);
  -                        }
  -                    } else {
  -                        
((CacheableEventPipeline)this.eventPipeline).setStreamPipelineCaches(false);
  -                    }
  -                }
  -
  -                if (!usedCache) {
  -                    if (this.serializer.shouldSetContentLength()) {
  -                        // set the output stream
  -                        ByteArrayOutputStream os = new ByteArrayOutputStream();
  -                        this.serializer.setOutputStream(os);
  -
  -                        // execute the pipeline:
  -                        this.eventPipeline.process(environment);
  -                        byte[] data = os.toByteArray();
  -                        environment.setContentLength(data.length);
  -                        outputStream.write(data);
  -                   } else {
  -                        // set the output stream
  -                        this.serializer.setOutputStream(outputStream);
  -
  -                        // execute the pipeline:
  -                        this.eventPipeline.process(environment);
  -                    }
  -
  -                    // store the response
  -                    if (pcKey != null) {
  -                        byte[] bytes = 
((CachingOutputStream)outputStream).getContent();
  -                        this.streamCache.store(pcKey,
  -                            new CachedStreamObject(validityObjects, bytes));
  -                    }
  -                }
  -
  -            } catch ( ProcessingException e ) {
  -                throw e;
  -            } catch ( Exception e ) {
  -                getLogger().debug("Exception in process", e);
  -                throw new ProcessingException(
  -                    "Failed to execute pipeline.",
  -                    e
  -                );
  -            }
  -
  -            return true;
  -        }
  -    }
  -     */
  -
       /**
        * Recyclable Interface
        */
       public void recycle() {
           super.recycle();
   
  +        this.manager.release( this.xmlDeserializer );
  +        this.xmlDeserializer = null;
  +
  +        this.manager.release( this.xmlSerializer );
  +        this.xmlSerializer = null;
  +
           this.generatorRole = null;
           this.transformerRoles.clear();
           this.serializerRole = null;
           this.readerRole = null;
   
  -        this.notCacheableTransformers.clear();
  -        this.validityObjects = null;
           this.pipelineCacheKey = null;
  +        this.cachedResponse = null;
  +        this.validityObjects = null;
       }
   
       /**
  
  
  

----------------------------------------------------------------------
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