Index: src/org/apache/cocoon/Constants.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/Constants.java,v
retrieving revision 1.9
diff -u -r1.9 Constants.java
--- src/org/apache/cocoon/Constants.java	2001/07/12 12:28:06	1.9
+++ src/org/apache/cocoon/Constants.java	2001/07/17 23:42:08
@@ -67,6 +67,7 @@
     String CONTEXT_CLASS_LOADER    = "class-loader";
     String CONTEXT_WORK_DIR        = "work-directory";
     String CONTEXT_UPLOAD_DIR      = "upload-directory";
+    String CONTEXT_CACHE_DIR       = "cache-directory";
     String CONTEXT_CLASSPATH       = "classpath";
     String CONTEXT_CONFIG_URL      = "config-url";
     String CONTEXT_LOG_DIR         = "log-directory";
Index: src/org/apache/cocoon/Main.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/Main.java,v
retrieving revision 1.9
diff -u -r1.9 Main.java
--- src/org/apache/cocoon/Main.java	2001/07/13 14:09:17	1.9
+++ src/org/apache/cocoon/Main.java	2001/07/17 23:42:11
@@ -247,6 +247,7 @@
             appContext.put(Constants.CONTEXT_CLASSPATH, getClassPath(contextDir));
             appContext.put(Constants.CONTEXT_WORK_DIR, work);
             appContext.put(Constants.CONTEXT_UPLOAD_DIR, contextDir + "image-dir");
+            appContext.put(Constants.CONTEXT_CACHE_DIR, contextDir + "cache-dir");
             appContext.put(Constants.CONTEXT_CONFIG_URL, conf.toURL());
             appContext.put(Constants.CONTEXT_LOG_DIR, logDir);
             appContext.put(Constants.CONTEXT_LOG_FILE, logFile);
Index: src/org/apache/cocoon/components/store/MRUMemoryStore.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/store/MRUMemoryStore.java,v
retrieving revision 1.5
diff -u -r1.5 MRUMemoryStore.java
--- src/org/apache/cocoon/components/store/MRUMemoryStore.java	2001/07/17 10:41:56	1.5
+++ src/org/apache/cocoon/components/store/MRUMemoryStore.java	2001/07/17 23:42:15
@@ -14,10 +14,14 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Stack;
+import java.util.StringTokenizer;
+import java.util.Vector;
 
+import org.apache.cocoon.Constants;
 import org.apache.cocoon.util.ClassUtils;
 import org.apache.cocoon.util.IOUtils;
 
+
 import org.apache.avalon.framework.component.Component;
 import org.apache.avalon.framework.component.ComponentException;
 import org.apache.avalon.framework.component.ComponentManager;
@@ -25,6 +29,9 @@
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.logger.AbstractLoggable;
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.thread.ThreadSafe;
@@ -43,7 +50,9 @@
  * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
  */
 
-public class MRUMemoryStore extends AbstractLoggable implements Store, Configurable, ThreadSafe, Runnable, Composable {
+public class MRUMemoryStore extends AbstractLoggable implements Store, Configurable, 
+                                                                ThreadSafe, Runnable, 
+                                                                Composable, Contextualizable {
   /**
    * Indicates how much memory should be left free in the JVM for
    * normal operation.
@@ -93,10 +102,15 @@
   private Store fsstore;
   private Stack writerstack;
   private Thread writer;
-
-   /** the component manager */
+  private File cachedir;
+  private String cachedirstr;
+ 
+  /** the component manager */
   protected ComponentManager manager;
 
+  /**
+   * Get the filesystem store from the component manager
+   */
   public void compose(ComponentManager manager) throws ComponentException {
     try {
       this.manager = manager;
@@ -106,6 +120,25 @@
       getLogger().error("Error in MRUMemoryStore!",e);
     }
   }
+  
+  /**
+   * Get the caching directory from the servlet context
+   */
+  public void contextualize(Context context) throws ContextException {
+    this.cachedirstr = new String();
+    try {
+        this.cachedir = (File)context.get(Constants.CONTEXT_CACHE_DIR);
+        StringTokenizer stizer = new StringTokenizer(this.cachedir.getPath(),this.cachedir.separator);
+        Vector v = new Vector();
+        while (stizer.hasMoreTokens()) {
+          v.add(stizer.nextToken());
+        }
+        cachedirstr = (String)v.lastElement();
+        getLogger().debug("MRUMemoryStore contextualize strcachedir=" + this.cachedirstr);
+    } catch (Exception e) {
+        getLogger().error("Error in MRUMemoryStore()",e);
+    }
+  }
 
   /**
    * Initialize the MRUMemoryStore.
@@ -144,7 +177,7 @@
     }
 
     this.usecleanupthread = params.getParameter("usecleanupthread","true").equals("true");
-  
+    
     if (this.usecleanupthread) {
       getLogger().debug("MRUMemoryStore intializing checker thread");
       Thread checker = new Thread(this);
@@ -195,7 +228,7 @@
             tmpstackobject = (TmpStackObject)this.writerstack.pop();
             key = tmpstackobject.getKey();
             object = tmpstackobject.getObject();
-            this.fsstore.store(URLEncoder.encode(key.toString()),object);
+            this.fsstore.store(this.cachedirstr + "/" + URLEncoder.encode(key.toString()),object);
             key = null;
             object = null;
             tmpstackobject = null;
Index: src/org/apache/cocoon/servlet/CocoonServlet.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/servlet/CocoonServlet.java,v
retrieving revision 1.18
diff -u -r1.18 CocoonServlet.java
--- src/org/apache/cocoon/servlet/CocoonServlet.java	2001/07/13 19:07:46	1.18
+++ src/org/apache/cocoon/servlet/CocoonServlet.java	2001/07/17 23:42:20
@@ -89,6 +89,7 @@
     private static final int MAX_UPLOAD_SIZE = 10000000; // 10Mb
     private File uploadDir;
     private File workDir;
+    private File cacheDir;
 
     protected ServletContext servletContext;
     protected RepositoryClassLoader classLoader;
@@ -140,7 +141,17 @@
 
         this.appContext.put(Constants.CONTEXT_UPLOAD_DIR, this.uploadDir);
         this.uploadDir.mkdirs();
-
+      
+        String cacheDirParam = conf.getInitParameter("cache-directory");
+        if ((cacheDirParam != null) && (cacheDirParam.trim().equals("") == false)) {
+            this.cacheDir = IOUtils.createFile( new File(this.servletContext.getRealPath("/")) , cacheDirParam);
+        } else        {
+            this.cacheDir = IOUtils.createFile(workDir, "cache-dir" + File.separator);
+        }
+ 
+        this.appContext.put(Constants.CONTEXT_CACHE_DIR, this.cacheDir);
+        this.cacheDir.mkdirs();
+      
         this.appContext.put(Constants.CONTEXT_CONFIG_URL,
         this.getConfigFile(conf.getInitParameter("configurations")));
Index: webapp/WEB-INF/web.xml
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/webapp/WEB-INF/web.xml,v
retrieving revision 1.4
diff -u -r1.4 web.xml
--- webapp/WEB-INF/web.xml	2001/07/12 11:08:28	1.4
+++ webapp/WEB-INF/web.xml	2001/07/17 23:42:21
@@ -113,6 +113,18 @@
       <param-value>/WEB-INF/work/image-dir</param-value>
     </init-param>
     -->
+
+    <!-- 
+      This parameter allows to specify where Cocoon should put files 
+      which are cached by the storing class. The path specified 
+      is always relative to the context path of the servlet. 
+      The default directory is "cache-dir" in the work-directory
+
+    <init-param>
+      <param-name>cache-directory</param-name>
+      <param-value>/WEB-INF/work/cache-dir</param-value>
+    </init-param>
+    -->
   
     <!-- 
       This parameter allows to specify where Cocoon should put it's
