You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2004/09/27 10:01:15 UTC

svn commit: rev 47280 - in cocoon/branches/BRANCH_2_1_X: . src/java/org/apache/cocoon/caching src/java/org/apache/cocoon/components/pipeline src/java/org/apache/cocoon/components/pipeline/impl

Author: cziegeler
Date: Mon Sep 27 01:01:15 2004
New Revision: 47280

Modified:
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/caching/CachedResponse.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingPointProcessingPipeline.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java
   cocoon/branches/BRANCH_2_1_X/status.xml
Log:
Cache the mime-type of readers and serializers.

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/caching/CachedResponse.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/caching/CachedResponse.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/caching/CachedResponse.java	Mon Sep 27 01:01:15 2004
@@ -28,7 +28,7 @@
  *
  * @since 2.1
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id: CachedResponse.java,v 1.6 2004/03/05 13:02:45 bdelacretaz Exp $
+ * @version CVS $Id$
  */
 public class CachedResponse
         implements Serializable {
@@ -37,7 +37,8 @@
     protected final byte[]           response;
     protected Long                   expires;
     protected final long             lastModified;
-
+    protected String                 contentType;
+    
     /**
      * Create a new entry for the cache.
      *
@@ -128,4 +129,16 @@
         return lastModified;
     }
 
+    /**
+     * @return Returns the cached content type (or null).
+     */
+    public String getContentType() {
+        return this.contentType;
+    }
+    /**
+     * @param value The content type to cache.
+     */
+    public void setContentType(String value) {
+        this.contentType = value;
+    }
 }

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java	Mon Sep 27 01:01:15 2004
@@ -188,7 +188,9 @@
      * Informs pipeline we have come across a branch point
      * Default Behaviour is do nothing
      */
-    public void informBranchPoint() {}
+    public void informBranchPoint() {
+        // this can be overwritten in subclasses
+    }
 
     /**
      * Set the generator that will be used as the initial step in the pipeline.
@@ -387,28 +389,6 @@
                     this.serializerParam
                 );
             }
-
-            if (this.lastConsumer == null) {
-                // internal processing: text/xml
-                environment.setContentType("text/xml");
-            } else {
-                String mimeType = this.serializer.getMimeType();
-                if (mimeType != null) {
-                    // we have a mimeType from the component itself
-                    environment.setContentType (mimeType);
-                } else if (serializerMimeType != null) {
-                    // there was a mimeType specified in the sitemap pipeline
-                    environment.setContentType (serializerMimeType);
-                } else if (this.sitemapSerializerMimeType != null) {
-                    // use the mimeType specified in the sitemap component declaration
-                    environment.setContentType (this.sitemapSerializerMimeType);
-                } else {
-                    // No mimeType available
-                    String message = "Unable to determine MIME type for " +
-                        environment.getURIPrefix() + "/" + environment.getURI();
-                    throw new ProcessingException(message);
-                }
-            }
         } catch (SAXException e) {
             throw new ProcessingException(
                 "Could not setup pipeline.",
@@ -485,10 +465,9 @@
             }
 
             return this.processReader(environment);
-        } else {
-            this.connectPipeline(environment);
-            return this.processXMLPipeline(environment);
         }
+        this.connectPipeline(environment);
+        return this.processXMLPipeline(environment);
     }
 
     /**
@@ -524,6 +503,8 @@
     protected boolean processXMLPipeline(Environment environment)
     throws ProcessingException {
 
+        this.setMimeTypeForSerializer(environment);
+        
         try {
             if (this.serializer != this.lastConsumer) {
                 // internal processing
@@ -560,16 +541,7 @@
     protected void setupReader(Environment environment)
     throws ProcessingException {
         try {
-            String mimeType;
             this.reader.setup(environment,environment.getObjectModel(),readerSource,readerParam);
-            mimeType = this.reader.getMimeType();
-            if ( mimeType != null ) {
-                environment.setContentType(mimeType);
-            } else if ( readerMimeType != null ) {
-                environment.setContentType(this.readerMimeType);
-            } else {
-                environment.setContentType(this.sitemapReaderMimeType);
-            }
             // set the expires parameter on the pipeline if the reader is configured with one
             if (readerParam.isParameter("expires")) {
 	            // should this checking be done somewhere else??
@@ -584,12 +556,55 @@
         }
     }
 
+    /**
+     * Set the mime-type for a reader
+     * @param environment The current environment
+     */
+    protected void setMimeTypeForReader(Environment environment) {
+        String mimeType = this.reader.getMimeType();
+        if ( mimeType != null ) {
+            environment.setContentType(mimeType);
+        } else if ( readerMimeType != null ) {
+            environment.setContentType(this.readerMimeType);
+        } else {
+            environment.setContentType(this.sitemapReaderMimeType);
+        }
+    }
+    
+    /**
+     * Set the mime-type for a serializer
+     * @param environment The current environment
+     */
+    protected void setMimeTypeForSerializer(Environment environment) 
+    throws ProcessingException {
+        if (this.lastConsumer == null) {
+            // internal processing: text/xml
+            environment.setContentType("text/xml");
+        } else {
+            String mimeType = this.serializer.getMimeType();
+            if (mimeType != null) {
+                // we have a mimeType from the component itself
+                environment.setContentType (mimeType);
+            } else if (serializerMimeType != null) {
+                // there was a mimeType specified in the sitemap pipeline
+                environment.setContentType (serializerMimeType);
+            } else if (this.sitemapSerializerMimeType != null) {
+                // use the mimeType specified in the sitemap component declaration
+                environment.setContentType (this.sitemapSerializerMimeType);
+            } else {
+                // No mimeType available
+                String message = "Unable to determine MIME type for " +
+                    environment.getURIPrefix() + "/" + environment.getURI();
+                throw new ProcessingException(message);
+            }
+        }
+    }
+
     protected boolean checkIfModified(Environment environment,
                                         long lastModified)
     throws ProcessingException {
         // has the read resource been modified?
         if(!environment.isResponseModified(lastModified)) {
-
             // environment supports this, so we are finished
             environment.setResponseIsNotModified();
             return true;
@@ -604,6 +619,7 @@
     protected boolean processReader(Environment environment)
     throws ProcessingException {
         try {
+            this.setMimeTypeForReader(environment);
             if (this.reader.shouldSetContentLength()) {
                 ByteArrayOutputStream os = new ByteArrayOutputStream();
                 this.reader.setOutputStream(os);
@@ -674,10 +690,9 @@
         this.lastConsumer = consumer;
         if ( this.reader != null ) {
             throw new ProcessingException("Streaming of an internal pipeline is not possible with a reader.");
-        } else {
-            this.connectPipeline(environment);
-            return this.processXMLPipeline(environment);
         }
+        this.connectPipeline(environment);
+        return this.processXMLPipeline(environment);
     }
 
     /**

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java	Mon Sep 27 01:01:15 2004
@@ -65,8 +65,8 @@
     /** The role name of the reader */
     protected String readerRole;
 
-    /** The cached byte stream */
-    protected byte[]           cachedResponse;
+    /** The cached response */
+    protected CachedResponse   cachedResponse;
     /** The timestamp of the cached byte stream */
     protected long             cachedLastModified;
 
@@ -180,17 +180,24 @@
                 return true;
             }
 
+            // set mime-type
+            if ( this.cachedResponse.getContentType() != null ) {
+                environment.setContentType(this.cachedResponse.getContentType());
+            } else {
+                this.setMimeTypeForSerializer(environment);
+            }
             try {
-                final OutputStream outputStream =
-                            environment.getOutputStream(0);
-                if (this.cachedResponse.length > 0) {
-                    environment.setContentLength(this.cachedResponse.length);
-                    outputStream.write(this.cachedResponse);
+                final OutputStream outputStream = environment.getOutputStream(0);
+                final byte[] content = this.cachedResponse.getResponse();
+                if (content.length > 0) {
+                    environment.setContentLength(content.length);
+                    outputStream.write(content);
                 }
             } catch (Exception e) {
                 handleException(e);
             }
         } else {
+            this.setMimeTypeForSerializer(environment);
             if (getLogger().isDebugEnabled() && this.toCacheKey != null) {
                 getLogger().debug("processXMLPipeline: caching content for further" +
                                   " requests of '" + environment.getURI() +
@@ -463,7 +470,7 @@
                                 ", ignoring all other cache settings. This entry expires on "+
                                 new Date(responseExpires.longValue()));
                         }
-                        this.cachedResponse = response.getResponse();
+                        this.cachedResponse = response;
                         this.cachedLastModified = response.getLastModified();
                         return;
                     } else {
@@ -542,7 +549,7 @@
                         this.getLogger().debug("validatePipeline: using valid cached content for '" + environment.getURI() + "'.");
                     }
                     // we are valid, ok that's it
-                    this.cachedResponse = response.getResponse();
+                    this.cachedResponse = response;
                     this.cachedLastModified = response.getLastModified();
                     this.toCacheSourceValidities = fromCacheValidityObjects;
                 } else {
@@ -732,6 +739,11 @@
                             byte[] response = cachedObject.getResponse();
                             if (response.length > 0) {
                                 usedCache = true;
+                                if ( cachedObject.getContentType() != null ) {
+                                    environment.setContentType(cachedObject.getContentType());
+                                } else {
+                                    this.setMimeTypeForReader(environment);
+                                }
                                 outputStream = environment.getOutputStream(0);
                                 environment.setContentLength(response.length);
                                 outputStream.write(response);
@@ -771,6 +783,7 @@
                     }
                 }
 
+                this.setMimeTypeForReader(environment);
                 if (this.reader.shouldSetContentLength()) {
                     ByteArrayOutputStream os = new ByteArrayOutputStream();
                     this.reader.setOutputStream(os);
@@ -790,10 +803,12 @@
 
                 // store the response
                 if (pcKey != null) {
+                    final CachedResponse res = new CachedResponse( new SourceValidity[] {readerValidity},
+                            ((CachingOutputStream)outputStream).getContent());
+                    res.setContentType(environment.getContentType());
                     this.cache.store(
                         pcKey,
-                        new CachedResponse( new SourceValidity[] {readerValidity},
-                                            ((CachingOutputStream)outputStream).getContent())
+                        res
                     );
                 }
             }

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingPointProcessingPipeline.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingPointProcessingPipeline.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingPointProcessingPipeline.java	Mon Sep 27 01:01:15 2004
@@ -41,7 +41,7 @@
  *
  * @since 2.1
  * @author <a href="mailto:Michael.Melhem@managesoft.com">Michael Melhem</a>
- * @version CVS $Id: CachingPointProcessingPipeline.java,v 1.6 2004/03/05 13:02:50 bdelacretaz Exp $
+ * @version CVS $Id$
  */
 public class CachingPointProcessingPipeline
     extends AbstractCachingProcessingPipeline {
@@ -50,7 +50,7 @@
     protected ArrayList xmlSerializerArray = new ArrayList();
     protected boolean nextIsCachePoint = false;
     protected String autoCachingPointSwitch;
-    protected  boolean autoCachingPoint = true;
+    protected boolean autoCachingPoint = true;
 
 
    /**
@@ -79,9 +79,9 @@
         }
     }
 
-   /**
-    * Set the generator.
-    */
+    /**
+     * Set the generator.
+     */
     public void setGenerator (String role, String source, Parameters param, Parameters hintParam) 
     throws ProcessingException {
         super.setGenerator(role, source, param, hintParam);
@@ -94,9 +94,7 @@
             if (this.getLogger().isDebugEnabled()) {
                 getLogger().debug("generator caching-point pipeline-hint is set to: " + pipelinehint);
             }
-        }
-        catch (Exception ex)
-        {
+        } catch (Exception ex) {
             if (this.getLogger().isWarnEnabled()) {
                 getLogger().warn("caching-point hint Exception, pipeline-hint ignored: " + ex);
             }
@@ -125,9 +123,7 @@
             if (this.getLogger().isDebugEnabled()) {
                 getLogger().debug("transformer caching-point pipeline-hint is set to: " + pipelinehint);
             }
-        }
-        catch (Exception ex)
-        {
+        } catch (Exception ex) {
             if (this.getLogger().isWarnEnabled()) {
                 getLogger().warn("caching-point hint Exception, pipeline-hint ignored: " + ex);
             }
@@ -155,16 +151,17 @@
      */
     public void informBranchPoint() {
 
-        if (this.generator == null)
-        return;
-
-    if (!this.autoCachingPoint)
-        return;
+        if (this.generator == null) {
+            return;
+        }
+        if (!this.autoCachingPoint) {
+            return;
+        }   
 
         this.nextIsCachePoint = true;
-         if (this.getLogger().isDebugEnabled()) {
-           this.getLogger().debug("Informed Pipeline of branch point");
-         }
+        if (this.getLogger().isDebugEnabled()) {
+            this.getLogger().debug("Informed Pipeline of branch point");
+        }
     }
 
     /**
@@ -180,6 +177,7 @@
                 }
                 CachedResponse response = new CachedResponse(this.toCacheSourceValidities,
                                           ((CachingOutputStream)os).getContent());
+                response.setContentType(environment.getContentType());
                 this.cache.store(this.toCacheKey.copy(),
                                  response);
                 //

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java	Mon Sep 27 01:01:15 2004
@@ -37,7 +37,7 @@
  *
  * @since 2.1
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id: CachingProcessingPipeline.java,v 1.6 2004/05/06 19:34:13 upayavira Exp $
+ * @version CVS $Id$
  */
 public class CachingProcessingPipeline
     extends AbstractCachingProcessingPipeline {
@@ -53,6 +53,7 @@
                 CachedResponse response = new CachedResponse(this.toCacheSourceValidities,
                                           ((CachingOutputStream)os).getContent(),
                                           expiresObj);
+                response.setContentType(environment.getContentType());
                 this.cache.store(this.toCacheKey,
                                  response);
             } else {

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml	(original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml	Mon Sep 27 01:01:15 2004
@@ -204,6 +204,9 @@
 
   <changes>
  <release version="@version@" date="@date@">
+   <action dev="CZ" type="update">
+     Cache the mime-type of readers and serializers.
+   </action>
    <action dev="AG" type="fix" fixes-bug="30372" due-to="Johnson Hsu" due-to-email="johnson@soho.club.tw">
       The daylight time cause error when timezone is CST. Updated icu4j to 3.0.
    </action>