You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by bl...@apache.org on 2005/09/08 19:52:49 UTC

svn commit: r279595 - /cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java

Author: bloritsch
Date: Thu Sep  8 10:52:48 2005
New Revision: 279595

URL: http://svn.apache.org/viewcvs?rev=279595&view=rev
Log:
update the javadocs

Modified:
    cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java

Modified: cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java?rev=279595&r1=279594&r2=279595&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/caching/CacheableProcessingComponent.java Thu Sep  8 10:52:48 2005
@@ -19,20 +19,64 @@
 import java.io.Serializable;
 
 /**
- * This marker interface declares a (sitemap) component as cacheable.
- *
+ * This interface declares a (sitemap) component as cacheable.
  * This interface deprecates the org.apache.cocoon.caching.Cacheable interface!
+ * <p>
+ * Just about everything can be cached, so it makes sense to provide some
+ * controls to make sure that the user always gets valid results. There are
+ * two aspects to a cacheable component: the key and the validition. The key
+ * is used to determine within the component's scheme of things whether a
+ * result is unique. For example, if your generator provides dynamic
+ * information based on an ID and a user, you want to combine the two elements
+ * into one key. That way Cocoon can determine whether to use the cached
+ * information for the given ID/User combination or create it from scratch.
+ * </p>
+ * <p>
+ * The CachingPipeline will check the component's key to see if it even has
+ * the information cached to begin with. Next, it will check the validity of
+ * the cached value if there is one. If the cache has the resource and it is
+ * valid, the CachingPipeline will return the cached results. If either
+ * condition is false, then the CachingPipeline will generate the results and
+ * cache it for later use. It is important to realize that only the
+ * <code>CachingPipeline</code> will respect the contracts defined in this
+ * interface.
+ * </p>
  *
  * @since 2.1
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id: CacheableProcessingComponent.java,v 1.3 2004/03/05 13:02:45 bdelacretaz Exp $
+ * @version CVS $Id$
  */
 public interface CacheableProcessingComponent {
 
     /**
-     * Generate the unique key.
-     * This key must be unique inside the space of this component.
-     * This method must be invoked before the getValidity() method.
+     * Generate the unique key for the resource being rendered.
+     * <p>
+     * The cache key is the single most important part of the caching
+     * implementation. If you don't get it right, you can introduce more load
+     * on the caching engine than is necessary. It is important that the cache
+     * key has the following attributes:
+     * </p>
+     * <ul>
+     * <li>It must be Serializable (part of the contract of this method).</li>
+     * <li>It must be Immutable--the key is used as a lookup value.</li>
+     * <li>It must be Unique within the space of the component (i.e. the key
+     *     "1" for MyCacheableComponent must be for the same resource every
+     *     time, but we don't have to worry about the key "1" for
+     *     YourCacheableComponent).</li>
+     * <li>The equals() and hashCode() methods must be consistent (i.e. if two
+     *     keys are equal, the hashCode must also be equal).</li>
+     * </ul>
+     * <p>
+     * Thankfully there is a perfectly suitable object that satisfies these
+     * obligations from Java's core: <code>java.lang.String</code>. You can
+     * also use your own specific key objects provided they respect the above
+     * contracts.
+     * </p>
+     * <p>
+     * <strong>Important:</strong>If the cache key is <code>null</code> then
+     * your component will not be cached at all. You can use this to your
+     * advantage to cache some things but not others.
+     * </p>
      *
      * @return The generated key or <code>null</code> if the component
      *              is currently not cacheable.
@@ -40,9 +84,20 @@
     Serializable getKey();
 
     /**
-     * Generate the validity object.
-     * Before this method can be invoked the getKey() method
-     * must be invoked.
+     * Generate the validity object.  This method is invoked after the
+     * <code>getKey()</code> method.
+     * <p>
+     * The caching contracts use the Excalibur <code>SourceValidity</code>
+     * interface to determine whether a resource is valid or not. The validity
+     * can be a compound check that incorporates time since creation, parameter
+     * values, etc. As long as the sitemap can determine whether the cached
+     * resource is valid or not. More information is available on the 
+     * <a href="http://excalibur.apache.org/sourceresolve/index.html">Apache
+     * Excalibur site</a>. Alternatively you can use the built in 
+     * <code>CacheValidity</code> objects in the
+     * <code>org.apache.cocoon.caching</code> package and then use the
+     * {@link CacheValidityToSourceValidity} adaptor object.
+     * </p>
      *
      * @return The generated validity object or <code>null</code> if the
      *         component is currently not cacheable.