cziegeler 02/05/03 07:47:33 Modified: src/java/org/apache/cocoon/components/pipeline AbstractProcessingPipeline.java src/java/org/apache/cocoon/components/pipeline/impl CachingProcessingPipeline.java Log: Some minor updates on the xml processing pipeline Revision Changes Path 1.6 +53 -17 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- AbstractProcessingPipeline.java 3 May 2002 11:55:05 -0000 1.5 +++ AbstractProcessingPipeline.java 3 May 2002 14:47:33 -0000 1.6 @@ -57,6 +57,7 @@ import org.apache.avalon.framework.component.ComponentSelector; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.parameters.Parameters; +import org.apache.cocoon.ConnectionResetException; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.components.pipeline.OutputComponentSelector; import org.apache.cocoon.components.saxconnector.SAXConnector; @@ -70,6 +71,8 @@ import org.xml.sax.SAXException; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; +import java.net.SocketException; import java.util.ArrayList; import java.util.Iterator; @@ -77,7 +80,7 @@ * This is the base for all implementations of a <code>ProcessingPipeline</code>. * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: AbstractProcessingPipeline.java,v 1.5 2002/05/03 11:55:05 cziegeler Exp $ + * @version CVS $Id: AbstractProcessingPipeline.java,v 1.6 2002/05/03 14:47:33 cziegeler Exp $ */ public abstract class AbstractProcessingPipeline extends AbstractLogEnabled @@ -430,7 +433,15 @@ throw new ProcessingException("Attempted to process incomplete pipeline."); } if ( this.reader != null ) { - return this.processReader(environment); + this.setupReader( environment ); + if (this.checkLastModified( environment )) { + return true; + } + try { + return this.processReader(environment, environment.getOutputStream()); + } catch (IOException ioe) { + throw new ProcessingException("Processing of reader pipeline failed.", ioe); + } } else { this.setupPipeline(environment); this.connectPipeline(environment); @@ -474,13 +485,12 @@ } /** - * Process the pipeline using a reader. - * @throws ProcessingException if + * Setup the reader */ - protected boolean processReader(Environment environment) + protected void setupReader(Environment environment) throws ProcessingException { - String mimeType; try { + String mimeType; this.reader.setup(environment,environment.getObjectModel(),readerSource,readerParam); mimeType = this.reader.getMimeType(); if ( mimeType != null ) { @@ -490,31 +500,57 @@ } else { environment.setContentType(this.sitemapReaderMimeType); } - // has the read resource been modified? - long lastModified = this.reader.getLastModified(); - if (lastModified != 0 - && !environment.isResponseModified(lastModified)) { + } catch (SAXException e){ + throw new ProcessingException("Failed to execute reader pipeline.", e); + } catch (IOException e){ + throw new ProcessingException("Failed to execute reader pipeline.", e); + } + } - // environment supports this, so we are finished - environment.setResponseIsNotModified(); - return true; - } + protected boolean checkLastModified(Environment environment) + throws ProcessingException { + // has the read resource been modified? + long lastModified = this.reader.getLastModified(); + if (lastModified != 0 + && !environment.isResponseModified(lastModified)) { + + // environment supports this, so we are finished + environment.setResponseIsNotModified(); + return true; + } + return false; + } + /** + * Process the pipeline using a reader. + * @throws ProcessingException if + */ + protected boolean processReader(Environment environment, + OutputStream outputStream) + throws ProcessingException { + try { if (this.reader.shouldSetContentLength()) { ByteArrayOutputStream os = new ByteArrayOutputStream(); this.reader.setOutputStream(os); this.reader.generate(); byte[] data = os.toByteArray(); environment.setContentLength(data.length); - environment.getOutputStream().write(data); + outputStream.write(data); } else { - this.reader.setOutputStream(environment.getOutputStream()); + this.reader.setOutputStream(outputStream); this.reader.generate(); } + } 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("Error reading resource",e); + throw new ProcessingException("Error executing reader pipeline.",e); } return true; } 1.2 +96 -122 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.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- CachingProcessingPipeline.java 2 May 2002 14:48:53 -0000 1.1 +++ CachingProcessingPipeline.java 3 May 2002 14:47:33 -0000 1.2 @@ -55,6 +55,7 @@ import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.parameters.Parameters; +import org.apache.cocoon.ConnectionResetException; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.caching.*; import org.apache.cocoon.components.pipeline.AbstractProcessingPipeline; @@ -70,6 +71,8 @@ import org.xml.sax.SAXException; import java.io.IOException; +import java.io.OutputStream; +import java.net.SocketException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -80,7 +83,7 @@ * * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: CachingProcessingPipeline.java,v 1.1 2002/05/02 14:48:53 cziegeler Exp $ + * @version CVS $Id: CachingProcessingPipeline.java,v 1.2 2002/05/03 14:47:33 cziegeler Exp $ */ public class CachingProcessingPipeline extends AbstractProcessingPipeline @@ -103,7 +106,7 @@ private ArrayList notCacheableTransformers = new ArrayList(); private Map validityObjects; - private PipelineCacheKey pipelineCacheKey; + private StringBuffer pipelineCacheKey; private int firstNotCacheableTransformerIndex; @@ -255,55 +258,69 @@ this.firstNotCacheableTransformerIndex = 0; + // first step is to generate the key: + // All pipeline components starting with the generator + // are tested if they are either a CacheableProcessingComponent + // or Cacheable (obsolete). The returned keys are chained together + // to build a unique key of the request + // is the generator cacheable? - if (this.generator instanceof Cacheable) { - long key = ((Cacheable)this.generator).generateKey(); - CacheValidity validity = ((Cacheable)this.generator).generateValidity(); - - // final check, the current generator might not be cacheable - if (key != 0 && validity != null) { - ComponentCacheKey cck = new ComponentCacheKey( + long key = 0; + if (this.generator instanceof CacheableProcessingComponent) { + key = ((CacheableProcessingComponent)this.generator).generateKey(); + } else if (this.generator instanceof Cacheable) { + key = ((Cacheable)this.generator).generateKey(); + } + + if (key != 0) { + // CacheValidity validity = ((Cacheable)this.generator).generateValidity(); + ComponentCacheKey cck = new ComponentCacheKey( ComponentCacheKey.ComponentType_Generator, this.generatorRole, key); - this.validityObjects = new HashMap(); - this.validityObjects.put(cck, validity); - this.pipelineCacheKey = new PipelineCacheKey(); - this.pipelineCacheKey.addKey(cck); - - // now testing transformers - Transformer trans; - ComponentCacheKey transCacheKey; - int transformerSize = this.transformers.size(); - long transKey; - CacheValidity transValidity; - boolean testTrans = true; - - while (this.firstNotCacheableTransformerIndex < transformerSize - && testTrans) { - trans = (Transformer)this.transformers.get(this.firstNotCacheableTransformerIndex); - if (trans instanceof Cacheable) { - transKey = ((Cacheable)trans).generateKey(); - transValidity = ((Cacheable)trans).generateValidity(); - if (transKey != 0 && transValidity != null) { - transCacheKey = new ComponentCacheKey( - ComponentCacheKey.ComponentType_Transformer, - (String)this.transformerRoles.get(this.firstNotCacheableTransformerIndex), - transKey); - this.pipelineCacheKey.addKey(transCacheKey); - this.validityObjects.put(transCacheKey, transValidity); - } else { - testTrans = false; - } - } else { - testTrans = false; - } - if (testTrans) { - this.firstNotCacheableTransformerIndex++; - } + this.pipelineCacheKey = new StringBuffer(); + this.pipelineCacheKey.append("PCK:CCK:1-") + .append(this.generatorRole).append('-') + .append(key); + + // now testing transformers + Transformer trans; + final int transformerSize = this.transformers.size(); + boolean testTrans = true; + + while (this.firstNotCacheableTransformerIndex < transformerSize + && testTrans) { + trans = (Transformer)this.transformers.get(this.firstNotCacheableTransformerIndex); + key = 0; + if (trans instanceof CacheableProcessingComponent) { + key = ((CacheableProcessingComponent)trans).generateKey(); + } else if (trans instanceof Cacheable) { + key = ((Cacheable)trans).generateKey(); + } + if (key != 0) { + this.pipelineCacheKey.append("CCK:2-") + .append((String)this.transformerRoles.get(this.firstNotCacheableTransformerIndex)) + .append('-') + .append(key); + this.firstNotCacheableTransformerIndex++; + } else { + testTrans = false; } - // all transformers are cacheable => pipeline is cacheable - if (this.firstNotCacheableTransformerIndex == transformerSize) { + } + // all transformers are cacheable => pipeline is cacheable + if (this.firstNotCacheableTransformerIndex == transformerSize + && this.serializer == this.lastConsumer) { + + if (this.serializer instanceof CacheableProcessingComponent) { + key = ((CacheableProcessingComponent)this.serializer).generateKey(); + } else if (this.serializer instanceof Cacheable) { + key = ((Cacheable)this.serializer).generateKey(); + } + if (key != 0) { + this.pipelineCacheKey.append("CCK:3-") + .append(this.serializerRole) + .append('-') + .append(key); // FIXME - WE ARE CACHEABLE } } @@ -388,80 +405,43 @@ */ /** Process the pipeline using a reader. - * @throws ProcessingException if + * @throws ProcessingException if an error occurs + */ protected boolean processReader(Environment environment) throws ProcessingException { - - try - { - this.reader.setup(environment,environment.getObjectModel(),readerSource,readerParam); - String mimeType = this.reader.getMimeType(); - - mimeType = this.reader.getMimeType(); - if ( mimeType != null ) { - environment.setContentType(mimeType); - } else if ( readerMimeType != null ) { - environment.setContentType(this.readerMimeType); - } else { - environment.setContentType(this.sitemapReaderMimeType); - } - - // has the read resource been modified? - long lastModified = this.reader.getLastModified(); - if (lastModified != 0 - && !environment.isResponseModified(lastModified)) { - - // environment supports this, so we are finished - environment.setResponseIsNotModified(); - return true; - } - } catch (SAXException e){ - getLogger().debug("SAXException in ProcessReader", e); - - throw new ProcessingException( - "Failed to execute pipeline.", - e - ); - } catch (IOException e){ - getLogger().debug("IOException in ProcessReader", e); - - throw new ProcessingException( - "Failed to execute pipeline.", - e - ); - } - try { boolean usedCache = false; - OutputStream outputStream; - PipelineCacheKey pcKey = null; + OutputStream outputStream = environment.getOutputStream();; Map validityObjects = new HashMap(); - outputStream = environment.getOutputStream(); - - // test if serializer and event pipeline are cacheable + // test if reader is cacheable long readerKey = 0; - CacheValidity readerValidity = null; - if (this.reader instanceof Cacheable - && (readerKey = ((Cacheable)this.reader).generateKey()) != 0 - && (readerValidity = ((Cacheable)this.reader).generateValidity()) != null ){ + boolean isCacheable = false; + boolean isCacheableProcessingComponent = false; + if (this.reader instanceof CacheableProcessingComponent) { + readerKey = ((CacheableProcessingComponent)this.reader).generateKey(); + } else if (this.reader instanceof Cacheable) { + readerKey = ((Cacheable)this.reader).generateKey(); + } + if ( readerKey != 0) { // response is cacheable, build the key ComponentCacheKey ccKey; - pcKey = new PipelineCacheKey(); - ccKey = new ComponentCacheKey(ComponentCacheKey.ComponentType_Reader, - this.readerRole, - readerKey); - validityObjects.put(ccKey, readerValidity); - pcKey.addKey(ccKey); + StringBuffer pcKey = new StringBuffer(); + pcKey.append("PCK:CCK:4-").append(this.readerRole) + .append('-') + .append(readerKey); // now we have the key to get the cached object - CachedStreamObject cachedObject = (CachedStreamObject)this.streamCache.get(pcKey); + CachedStreamObject cachedObject = (CachedStreamObject)this.cache.get(pcKey); if (cachedObject != null) { - getLogger().debug("Found cached response for '" + environment.getURI() + "'."); - - Iterator validityIterator = validityObjects.keySet().iterator(); + if (this.getLogger().isDebugEnabled()) { + this.getLogger().debug("Found cached response for '" + environment.getURI() + "'."); + } + } + } + /* Iterator validityIterator = validityObjects.keySet().iterator(); ComponentCacheKey validityKey; boolean valid = true; while (validityIterator.hasNext() && valid) { @@ -497,28 +477,20 @@ getLogger().debug("Caching content for further requests of '" + environment.getURI() + "'."); outputStream = new CachingOutputStream(outputStream); } - } + validityObjects.put(ccKey, readerValidity); + } +*/ if (!usedCache) { - if (this.reader.shouldSetContentLength()) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - this.reader.setOutputStream(os); - this.reader.generate(); - byte[] data = os.toByteArray(); - environment.setContentLength(data.length); - outputStream.write(data); - } else { - this.reader.setOutputStream(outputStream); - this.reader.generate(); - } + super.processReader( environment, outputStream ); // store the response - if (pcKey != null) { - this.streamCache.store(pcKey, + /* if (pcKey != null) { + this.cache.store(pcKey, new CachedStreamObject(validityObjects, ((CachingOutputStream)outputStream).getContent())); - } + }*/ } } catch ( SocketException se ) { if (se.getMessage().indexOf("reset") > 0 @@ -545,7 +517,7 @@ return true; } - */ + /** * Process the request. @@ -705,5 +677,7 @@ */ public void dispose() { this.manager.release(this.cache); + this.cache = null; + this.manager = null; } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]