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 2001/11/21 11:45:16 UTC

cvs commit: xml-cocoon2/src/org/apache/cocoon/components/store FilesystemQueue.java FilesystemQueueImpl.java MRUMemoryStore.java StoreJanitorImpl.java

cziegeler    01/11/21 02:45:16

  Modified:    src/org/apache/cocoon/components/store Tag: cocoon_20_branch
                        FilesystemQueue.java FilesystemQueueImpl.java
                        MRUMemoryStore.java StoreJanitorImpl.java
  Log:
  Applied patch from Gerhard Froehlich [g-froehlich@gmx.de]
  and corrected component handling
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.2   +1 -1      xml-cocoon2/src/org/apache/cocoon/components/store/FilesystemQueue.java
  
  Index: FilesystemQueue.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/store/FilesystemQueue.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- FilesystemQueue.java	2001/11/06 09:55:35	1.1.2.1
  +++ FilesystemQueue.java	2001/11/21 10:45:16	1.1.2.2
  @@ -18,4 +18,4 @@
    */
   public interface FilesystemQueue extends Component, PriorityQueue {
     String ROLE = "org.apache.cocoon.components.store.FilesystemQueue";
  -}
  \ No newline at end of file
  +}
  
  
  
  1.1.2.2   +64 -68    xml-cocoon2/src/org/apache/cocoon/components/store/FilesystemQueueImpl.java
  
  Index: FilesystemQueueImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/store/FilesystemQueueImpl.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- FilesystemQueueImpl.java	2001/11/06 09:55:35	1.1.2.1
  +++ FilesystemQueueImpl.java	2001/11/21 10:45:16	1.1.2.2
  @@ -7,44 +7,28 @@
    *****************************************************************************/
   package org.apache.cocoon.components.store;
   
  +import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.framework.activity.Startable;
   import org.apache.avalon.framework.component.ComponentException;
  -
   import org.apache.avalon.framework.component.ComponentManager;
  -
   import org.apache.avalon.framework.component.Composable;
  -
   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;
  -
   import org.apache.cocoon.Constants;
  -
   import org.apache.cocoon.util.IOUtils;
   
   import java.io.File;
  -
   import java.io.IOException;
  -
   import java.net.URLEncoder;
  -
   import java.util.LinkedList;
  -
   import java.util.ListIterator;
  -
   import java.util.NoSuchElementException;
   
   /**
  @@ -54,58 +38,64 @@
    *
    * @author <a href="mailto:g-froehlich@gmx.de">Gerhard Froehlich</a>
    */
  -public class FilesystemQueueImpl extends AbstractLoggable implements FilesystemQueue,
  -                                                                     Configurable,
  -                                                                     Contextualizable,
  -                                                                     Runnable,
  -                                                                     ThreadSafe,
  -                                                                     Composable {
  -
  -  private int handlerinterval;
  -  private int threadpriority;
  -  private int maxobjects;
  -  private LinkedList linkedList;
  -  private File cachedir;
  -  private File workdir;
  -  private String cachedirstr;
  -  private Store fsstore;
  -  private Thread fsQueueHandler;
  -
  - /**
  -   * Get the context
  -   *
  -   * @param the Context of the application
  -   */
  -  public void contextualize(Context context) throws ContextException {
  -    this.cachedirstr = new String();
  -
  -    try {
  -      this.cachedir = (File)context.get(Constants.CONTEXT_CACHE_DIR);
  -      this.workdir = (File)context.get(Constants.CONTEXT_WORK_DIR);
  -      this.cachedirstr = IOUtils.getContextFilePath(this.workdir.getPath(),
  -                                                    this.cachedir.getPath());
  +public final class FilesystemQueueImpl
  +extends AbstractLoggable
  +implements FilesystemQueue,
  +           Configurable,
  +           Contextualizable,
  +           Runnable,
  +           ThreadSafe,
  +           Composable,
  +           Disposable,
  +           Startable {
  +
  +    private int handlerinterval;
  +    private int threadpriority;
  +    private int maxobjects;
  +    private LinkedList linkedList;
  +    private File cachedir;
  +    private File workdir;
  +    private String cachedirstr;
  +    private Store fsstore;
  +    private Thread fsQueueHandler;
  +    private static boolean doRun = true;
  +    private ComponentManager manager;
  +
  +    /**
  +     * Get the context
  +     *
  +     * @param the Context of the application
  +     */
  +    public void contextualize(Context context) throws ContextException {
  +        this.cachedir = (File)context.get(Constants.CONTEXT_CACHE_DIR);
  +        this.workdir = (File)context.get(Constants.CONTEXT_WORK_DIR);
  +        this.cachedirstr = IOUtils.getContextFilePath(this.workdir.getPath(),
  +                                                      this.cachedir.getPath());
   
  -      this.getLogger().debug("Context path="
  +        this.getLogger().debug("Context path="
                 + IOUtils.getContextFilePath(this.workdir.getPath(),this.cachedir.getPath()));
  +    }
   
  -    } catch (Exception e) {
  -      this.getLogger().error("Error in contextualize()",e);
  +    /**
  +     * Get components of the ComponentManager
  +     *
  +     * @param the ComponentManager
  +     */
  +    public void compose(ComponentManager manager) throws ComponentException {
  +        this.manager = manager;
  +        getLogger().debug("Looking up " + Store.ROLE + "/Filesystem");
  +        this.fsstore = (Store)manager.lookup(Store.ROLE + "/Filesystem");
       }
  -  }
   
  -  /**
  -   * Get components of the ComponentManager
  -   *
  -   * @param the ComponentManager
  -   */
  -  public void compose(ComponentManager manager) throws ComponentException {
  -    try {
  -      getLogger().debug("Looking up " + Store.ROLE + "/Filesystem");
  -      this.fsstore = (Store)manager.lookup(Store.ROLE + "/Filesystem");
  -    } catch(ComponentException e) {
  -      getLogger().error("Error in compose()!", e);
  +    /**
  +     * Dispose the component
  +     */
  +    public void dispose() {
  +        if (this.manager != null) {
  +            this.manager.release(this.fsstore);
  +            this.fsstore = null;
  +        }
       }
  -  }
   
     /**
      * Configure the Filesystem Queue:
  @@ -126,7 +116,9 @@
       this.getLogger().debug("threadpriority=" + threadpriority);
   
       this.linkedList = new LinkedList();
  +  }
   
  +  public void start() {
       this.fsQueueHandler = new Thread(this);
       this.fsQueueHandler.setDaemon(true);
       this.fsQueueHandler.setPriority(this.threadpriority);
  @@ -134,12 +126,16 @@
       this.fsQueueHandler.start();
     }
   
  +  public void stop() {
  +    this.doRun = false;
  +  }
  +
     public void run() {
  -    while(true) {
  +    while(doRun) {
         while(!this.isEmpty()) {
           FilesystemQueueObject filesystemQueueObject = (FilesystemQueueObject)this.pop();
           try {
  -          this.fsstore.store(this.getFileName(filesystemQueueObject.getKey().toString()), 
  +          this.fsstore.store(this.getFileName(filesystemQueueObject.getKey().toString()),
                                                 filesystemQueueObject.getObject());
           } catch(IOException e) {
             this.getLogger().error("Error in fsQueueHandler",e);
  @@ -148,9 +144,9 @@
         try {
           Thread.currentThread().sleep(this.handlerinterval * 1000);
         } catch (InterruptedException ignore) {}
  +    }
       }
  -	}
  -  
  +
     /**
      * Clear all elements from queue.
      */
  
  
  
  1.2.2.21  +270 -263  xml-cocoon2/src/org/apache/cocoon/components/store/MRUMemoryStore.java
  
  Index: MRUMemoryStore.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/store/MRUMemoryStore.java,v
  retrieving revision 1.2.2.20
  retrieving revision 1.2.2.21
  diff -u -r1.2.2.20 -r1.2.2.21
  --- MRUMemoryStore.java	2001/11/06 09:55:35	1.2.2.20
  +++ MRUMemoryStore.java	2001/11/21 10:45:16	1.2.2.21
  @@ -8,6 +8,8 @@
   package org.apache.cocoon.components.store;
   
   import org.apache.avalon.excalibur.collections.SynchronizedPriorityQueue;
  +import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.excalibur.collections.SynchronizedPriorityQueue;
   import org.apache.avalon.framework.component.ComponentException;
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.component.Composable;
  @@ -28,7 +30,7 @@
   import java.io.IOException;
   import java.net.URLEncoder;
   import java.util.Enumeration;
  -import java.util.HashMap;
  +import java.util.Hashtable;
   import java.util.LinkedList;
   
   /**
  @@ -42,281 +44,286 @@
    * @author <a href="mailto:g-froehlich@gmx.de">Gerhard Froehlich</a>
    * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
    */
  -
  -public class MRUMemoryStore extends AbstractLoggable implements Store, 
  -                                                                Configurable,
  -                                                                ThreadSafe,
  -                                                                Composable,
  -                                                                Contextualizable {
  -  private int maxobjects;
  -  private boolean filesystem;
  -  private HashMap cache;
  -  private LinkedList mrulist;
  -  private File cachefile;
  -  private Store fsstore;
  -  private StoreJanitor storejanitor;
  -  private File cachedir;
  -  private File workdir;
  -  private String cachedirstr;
  -  private FilesystemQueue filesystemQueue;
  -  protected ComponentManager manager;
  -
  -  /**
  -   * Get components of the ComponentManager
  -   *
  -   * @param the ComponentManager
  -   */
  -  public void compose(ComponentManager manager) throws ComponentException {
  -    try {
  -      this.manager = manager;
  -      getLogger().debug("Looking up " + Store.ROLE + "/Filesystem");
  -      this.fsstore = (Store)manager.lookup(Store.ROLE + "/Filesystem");
  -      getLogger().debug("Looking up " + StoreJanitor.ROLE);
  -      this.storejanitor = (StoreJanitor)manager.lookup(StoreJanitor.ROLE);
  -      getLogger().debug("Looking up " + FilesystemQueue.ROLE);
  -      this.filesystemQueue = (FilesystemQueue)manager.lookup(FilesystemQueue.ROLE);
  -    } catch(ComponentException e) {
  -      getLogger().error("Error in compose()!", e);
  -    }
  -  }
  -
  -  /**
  -   * Get the context
  -   *
  -   * @param the Context of the application
  -   */
  -  public void contextualize(Context context) throws ContextException {
  -    this.cachedirstr = new String();
  -
  -    try {
  +public final class MRUMemoryStore
  +extends AbstractLoggable
  +implements Store,
  +           Configurable,
  +           ThreadSafe,
  +           Composable,
  +           Disposable,
  +           Contextualizable {
  +
  +    private int maxobjects;
  +    private boolean filesystem;
  +    private Hashtable cache;
  +    private LinkedList mrulist;
  +    private File cachefile;
  +    private Store fsstore;
  +    private StoreJanitor storejanitor;
  +    private File cachedir;
  +    private File workdir;
  +    private String cachedirstr;
  +    private FilesystemQueue filesystemQueue;
  +    private ComponentManager manager;
  +
  +    /**
  +     * Get components of the ComponentManager
  +     *
  +     * @param the ComponentManager
  +     */
  +    public void compose(ComponentManager manager) throws ComponentException {
  +        this.manager = manager;
  +        getLogger().debug("Looking up " + Store.ROLE + "/Filesystem");
  +        this.fsstore = (Store)manager.lookup(Store.ROLE + "/Filesystem");
  +        getLogger().debug("Looking up " + StoreJanitor.ROLE);
  +        this.storejanitor = (StoreJanitor)manager.lookup(StoreJanitor.ROLE);
  +        getLogger().debug("Looking up " + FilesystemQueue.ROLE);
  +        this.filesystemQueue = (FilesystemQueue)manager.lookup(FilesystemQueue.ROLE);
  +    }
  +
  +    /**
  +     * Get the context
  +     *
  +     * @param the Context of the application
  +     */
  +    public void contextualize(Context context) throws ContextException {
           this.cachedir = (File)context.get(Constants.CONTEXT_CACHE_DIR);
           this.workdir = (File)context.get(Constants.CONTEXT_WORK_DIR);
           this.cachedirstr = IOUtils.getContextFilePath(this.workdir.getPath(),
  -                                                      this.cachedir.getPath());
  +                                                          this.cachedir.getPath());
  +        if (this.getLogger().isDebugEnabled() == true) {
  +            this.getLogger().debug("cachedir=" + this.cachedir);
  +            this.getLogger().debug("workdir=" + this.workdir);
  +            this.getLogger().debug("cachedirstr=" + this.cachedirstr);
  +            this.getLogger().debug("Context path="
  +                + IOUtils.getContextFilePath(this.workdir.getPath(),this.cachedir.getPath()));
  +        }
  +    }
   
  -        
  +    /**
  +     * Initialize the MRUMemoryStore.
  +     * A few options can be used :
  +     * <UL>
  +     *  <LI>maxobjects = how many objects will be stored in memory (Default: 10 objects)</LI>
  +     *  <LI>filesystem = use filesystem storage to keep object persistent (Default: false)</LI>
  +     * </UL>
  +     *
  +     * @param the Configuration of the application
  +     * @exception ConfigurationException
  +     */
  +    public void configure(Configuration conf) throws ConfigurationException {
  +        Parameters params = Parameters.fromConfiguration(conf);
  +        this.maxobjects            = params.getParameterAsInteger("maxobjects",100);
  +        this.filesystem            = params.getParameterAsBoolean("filesystem",false);
  +        if ((this.maxobjects < 1)) {
  +            throw new ConfigurationException("MRUMemoryStore maxobjects must be at least 1 milli second!");
  +        }
   
  -        this.getLogger().debug("cachedir=" + this.cachedir);
  -        this.getLogger().debug("workdir=" + this.workdir);
  -        this.getLogger().debug("cachedirstr=" + this.cachedirstr);
  -        this.getLogger().debug("Context path="
  -                + IOUtils.getContextFilePath(this.workdir.getPath(),this.cachedir.getPath()));
  +        this.cache = new Hashtable((int)(this.maxobjects * 1.2));
  +        this.mrulist     = new LinkedList();
  +        this.storejanitor.register(this);
  +    }
  +
  +    /**
  +     * Dispose the component
  +     */
  +    public void dispose() {
  +        if (this.manager != null) {
  +            this.manager.release(this.storejanitor);
  +            this.storejanitor = null;
  +            this.manager.release(this.filesystemQueue);
  +            this.filesystemQueue = null;
  +            this.manager.release(this.fsstore);
  +            this.fsstore = null;
  +        }
  +    }
   
  -    } catch (Exception e) {
  -        getLogger().error("Error in contextualize()",e);
  +    /**
  +     * Store the given object in a persistent state. It is up to the
  +     * caller to ensure that the key has a persistent state across
  +     * different JVM executions.
  +     *
  +     * @param the key for the object to store
  +     * @param the object to store
  +     */
  +    public void store(Object key, Object value) {
  +        this.hold(key,value);
  +    }
  +
  +    /**
  +     * This method holds the requested object in a HashMap combined
  +     * with a LinkedList to create the MRU.
  +     * It also stores objects onto the filesystem if configured.
  +     *
  +     * @param the key of the object to be stored
  +     * @param the object to be stored
  +     */
  +    public void hold(Object key, Object value) {
  +        getLogger().debug("Holding object in memory. key: " + key);
  +        getLogger().debug("Holding object in memory. value: " + value);
  +
  +        /** ...first test if the max. objects in cache is reached... */
  +        while (this.mrulist.size() >= this.maxobjects) {
  +            /** ...ok, heapsize is reached, remove the last element... */
  +            this.free();
  +        }
  +
  +        /** put the object on the filesystem */
  +        if(this.filesystem) {
  +            if(this.checkSerializable(value) &&
  +               !this.fsstore.containsKey(getFileName(key.toString()))) {
  +                this.getLogger().debug("Storing object on fs");
  +                try {
  +                    this.filesystemQueue.insert(new FilesystemQueueObject(key,value));
  +                } catch(Exception e) {
  +                    this.getLogger().error("Error storing Object on fs",e);
  +                }
  +            }
  +        }
  +        /** ..put the new object in the cache, on the top of course ... */
  +        this.cache.put(key, value);
  +        this.mrulist.remove(key);
  +        this.mrulist.addFirst(key);
  +        this.getLogger().debug("Cache size=" + cache.size());
       }
  -  }
   
  -  /**
  -   * Initialize the MRUMemoryStore.
  -   * A few options can be used :
  -   * <UL>
  -   *  <LI>maxobjects = how many objects will be stored in memory (Default: 10 objects)</LI>
  -   *  <LI>filesystem = use filesystem storage to keep object persistent (Default: false)</LI>
  -   * </UL>
  -   *
  -   * @param the Configuration of the application
  -   * @exception ConfigurationException
  -   */
  -  public void configure(Configuration conf) throws ConfigurationException {
  -    Parameters params = Parameters.fromConfiguration(conf);
  -    this.maxobjects            = params.getParameterAsInteger("maxobjects",100);
  -    this.filesystem            = params.getParameterAsBoolean("filesystem",false);
  -    if ((this.maxobjects < 1)) {
  -      throw new ConfigurationException("MRUMemoryStore maxobjects must be at least 1 milli second!");
  -    }
  -
  -    this.cache = new HashMap((int)(this.maxobjects * 1.2));
  -    this.mrulist     = new LinkedList();
  -
  -    this.storejanitor.register(this);
  -  }
  -
  -  /**
  -   * Store the given object in a persistent state. It is up to the
  -   * caller to ensure that the key has a persistent state across
  -   * different JVM executions.
  -   *
  -   * @param the key for the object to store
  -   * @param the object to store
  -   */
  -  public void store(Object key, Object value) {
  -    this.hold(key,value);
  -  }
  -
  -  /**
  -   * This method holds the requested object in a HashMap combined
  -   * with a LinkedList to create the MRU.
  -   * It also stores objects onto the filesystem if configured.
  -   *
  -   * @param the key of the object to be stored
  -   * @param the object to be stored
  -   */
  -  public void hold(Object key, Object value) {
  -    getLogger().debug("Holding object in memory. key: " + key);
  -    getLogger().debug("Holding object in memory. value: " + value);
  -
  -    /** ...first test if the max. objects in cache is reached... */
  -    while (this.mrulist.size() >= this.maxobjects) {
  -      /** ...ok, heapsize is reached, remove the last element... */
  -      this.free();
  -    }
  -
  -    /** put the object on the filesystem */
  -    if(this.filesystem) {
  -      if(this.checkSerializable(value) && 
  -         !this.fsstore.containsKey(getFileName(key.toString()))) {
  -        this.getLogger().debug("Storing object on fs");
  -        try {
  -          this.filesystemQueue.insert(new FilesystemQueueObject(key,value));
  -        } catch(Exception e) {
  -          this.getLogger().error("Error storing Object on fs",e);
  -        }
  -      }
  -    }
  -    /** ..put the new object in the cache, on the top of course ... */
  -    this.cache.put(key, value);
  -    this.mrulist.remove(key);
  -    this.mrulist.addFirst(key);
  -    this.getLogger().debug("Cache size=" + cache.size());
  -  }
  -
  -  /**
  -   * Get the object associated to the given unique key.
  -   *
  -   * @param the key of the requested object
  -   * @return the requested object
  -   */
  -  public Object get(Object key) {
  -    this.getLogger().debug("Getting object from memory. Key: " + key);
  -
  -    Object tmpobject = this.cache.get(key);
  -    if ( tmpobject != null ) {
  -      /** put the accessed key on top of the linked list */
  -      this.mrulist.remove(key);
  -      this.mrulist.addFirst(key);
  -      return tmpobject;
  -    }
  -
  -    this.getLogger().debug("Object not found in memory");
  -    /** try to fetch from filesystem */
  -    if(this.filesystem) {
  -      tmpobject = this.fsstore.get(getFileName(key.toString()));
  -      if (tmpobject == null) {
  -        this.getLogger().debug( "Object was NOT found on fs.  Looked for: " 
  +    /**
  +     * Get the object associated to the given unique key.
  +     *
  +     * @param the key of the requested object
  +     * @return the requested object
  +     */
  +    public Object get(Object key) {
  +        this.getLogger().debug("Getting object from memory. Key: " + key);
  +
  +        Object tmpobject = this.cache.get(key);
  +        if ( tmpobject != null ) {
  +            /** put the accessed key on top of the linked list */
  +            this.mrulist.remove(key);
  +            this.mrulist.addFirst(key);
  +            return tmpobject;
  +        }
  +
  +        this.getLogger().debug("Object not found in memory");
  +        /** try to fetch from filesystem */
  +        if(this.filesystem) {
  +            tmpobject = this.fsstore.get(getFileName(key.toString()));
  +            if (tmpobject == null) {
  +                this.getLogger().debug( "Object was NOT found on fs.  Looked for: "
                                   + getFileName(key.toString()));
  +                return null;
  +            } else {
  +                this.getLogger().debug("Object was found on fs");
  +                try {
  +                    tmpobject = IOUtils.deserializeObject((File)tmpobject);
  +                    if(!this.cache.containsKey(key)) {
  +                        this.hold(key,tmpobject);
  +                    }
  +                    return tmpobject;
  +                } catch (ClassNotFoundException ce) {
  +                    this.getLogger().error("Error in get()!", ce);
  +                    return null;
  +                } catch (IOException ioe) {
  +                    this.getLogger().error("Error in get()!", ioe);
  +                    return null;
  +                }
  +            }
  +        }
           return null;
  -      } else {
  -        this.getLogger().debug("Object was found on fs");
  +    }
  +
  +    /**
  +     * Remove the object associated to the given key.
  +     *
  +     * @param the key of to be removed object
  +     */
  +    public void remove(Object key) {
  +        this.getLogger().debug("Removing object from store");
  +        this.cache.remove(key);
  +        this.mrulist.remove(key);
  +        if(this.filesystem && key != null) {
  +            this.fsstore.remove(getFileName(key.toString()));
  +        }
  +    }
  +
  +    /**
  +     * Indicates if the given key is associated to a contained object.
  +     *
  +     * @param the key of the object
  +     * @return true if the key exists
  +     */
  +    public boolean containsKey(Object key) {
  +        if(filesystem) {
  +            return (this.cache.containsKey(key) || this.fsstore.containsKey(key));
  +        } else {
  +            return this.cache.containsKey(key);
  +        }
  +    }
  +
  +    /**
  +     * Returns the list of used keys as an Enumeration.
  +     *
  +     * @return the enumeration of the cache
  +     */
  +    public Enumeration keys() {
  +        /* Not yet implemented */
  +        return null;
  +    }
  +
  +    /**
  +     * Frees some of the fast memory used by this store.
  +     * It removes the last element in the store.
  +     */
  +    public void free() {
           try {
  -          tmpobject = IOUtils.deserializeObject((File)tmpobject);
  -          if(!this.cache.containsKey(key)) {
  -          this.hold(key,tmpobject);
  -          }
  -          return tmpobject;
  -        } catch (ClassNotFoundException ce) {
  -          this.getLogger().error("Error in get()!", ce);
  -          return null;
  -        } catch (IOException ioe) {
  -          this.getLogger().error("Error in get()!", ioe);
  -          return null;
  -        }
  -      }
  -    }
  -    return null;
  -  }
  -
  -  /**
  -   * Remove the object associated to the given key.
  -   *
  -   * @param the key of to be removed object
  -   */
  -  public void remove(Object key) {
  -    this.getLogger().debug("Removing object from store");
  -    this.cache.remove(key);
  -    this.mrulist.remove(key);
  -    if(this.filesystem && key != null) {
  -      this.fsstore.remove(getFileName(key.toString()));
  -    }
  -  }
  -
  -  /**
  -   * Indicates if the given key is associated to a contained object.
  -   *
  -   * @param the key of the object
  -   * @return true if the key exists
  -   */
  -  public boolean containsKey(Object key) {
  -    synchronized(this.cache) {
  -        return this.cache.containsKey(key);
  -    }
  -  }
  -
  -  /**
  -   * Returns the list of used keys as an Enumeration.
  -   *
  -   * @return the enumeration of the cache
  -   */
  -  public Enumeration keys() {
  -    /* Not yet implemented */
  -    return null;
  -  }
  -
  -  /**
  -   * Frees some of the fast memory used by this store.
  -   * It removes the last element in the store.
  -   */
  -  public void free() {
  -    try {
  -      if(this.cache.size() > 0) {
  -        this.getLogger().debug("Freeing cache");
  -        this.cache.remove(this.mrulist.getLast());
  -        this.mrulist.removeLast();
  -        this.getLogger().debug("Cache size=" + cache.size());
  -      }
  -    } catch (Exception e) {
  -      this.getLogger().error("Error in free()", e);
  -    }
  -  }
  -
  -  /**
  -   * This method checks if an object is seriazable.
  -   * FIXME: In the moment only CachedEventObject or
  -   * CachedStreamObject are stored.
  -   *
  -   * @param the object to be checked
  -   * @return true if the object is storeable
  -   */
  -  private boolean checkSerializable(Object object) {
  -    try {
  -      this.getLogger().debug("Object=" + object);
  -      if((object.getClass().getName().equals("org.apache.cocoon.caching.CachedEventObject"))
  -          || (object.getClass().getName().equals("org.apache.cocoon.caching.CachedStreamObject"))
  -          || (ClassUtils.implementsInterface(object.getClass().getName(),"org.apache.cocoon.caching.CacheValidity"))) {
  -        return true;
  -      } else {
  -        return false;
  -      }
  -    } catch (Exception e) {
  -      this.getLogger().error("Error in checkSerializable()!", e);
  -      return false;
  -    }
  -  }
  -
  -  /**
  -   * This method puts together a filename for
  -   * the object, which shall be stored on the
  -   * filesystem.
  -   *
  -   * @param the key of the object
  -   * @return the filename of the key
  -   */
  -  private String getFileName(String key)
  -  {
  -      return new StringBuffer()
  +            if(this.cache.size() > 0) {
  +                this.getLogger().debug("Freeing cache");
  +                this.cache.remove(this.mrulist.getLast());
  +                this.mrulist.removeLast();
  +                this.getLogger().debug("Cache size=" + cache.size());
  +            }
  +        } catch (Exception e) {
  +            this.getLogger().error("Error in free()", e);
  +        }
  +    }
  +
  +    /**
  +     * This method checks if an object is seriazable.
  +     * FIXME: In the moment only CachedEventObject or
  +     * CachedStreamObject are stored.
  +     *
  +     * @param the object to be checked
  +     * @return true if the object is storeable
  +     */
  +    private boolean checkSerializable(Object object) {
  +        try {
  +            this.getLogger().debug("Object=" + object);
  +            if((object.getClass().getName().equals("org.apache.cocoon.caching.CachedEventObject"))
  +              || (object.getClass().getName().equals("org.apache.cocoon.caching.CachedStreamObject"))
  +              || (ClassUtils.implementsInterface(object.getClass().getName(),"org.apache.cocoon.caching.CacheValidity"))) {
  +                return true;
  +            } else {
  +                return false;
  +            }
  +        } catch (Exception e) {
  +            this.getLogger().error("Error in checkSerializable()!", e);
  +            return false;
  +        }
  +    }
  +
  +    /**
  +     * This method puts together a filename for
  +     * the object, which shall be stored on the
  +     * filesystem.
  +     *
  +     * @param the key of the object
  +     * @return the filename of the key
  +     */
  +    private String getFileName(String key) {
  +        return new StringBuffer()
             .append(this.cachedirstr)
             .append(File.separator)
             .append(URLEncoder.encode(key.toString()))
             .toString();
  -  }
  +    }
   }
  
  
  
  1.1.2.6   +11 -3     xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitorImpl.java
  
  Index: StoreJanitorImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/store/StoreJanitorImpl.java,v
  retrieving revision 1.1.2.5
  retrieving revision 1.1.2.6
  diff -u -r1.1.2.5 -r1.1.2.6
  --- StoreJanitorImpl.java	2001/10/11 08:56:09	1.1.2.5
  +++ StoreJanitorImpl.java	2001/11/21 10:45:16	1.1.2.6
  @@ -7,6 +7,7 @@
    *****************************************************************************/
   package org.apache.cocoon.components.store;
   
  +import org.apache.avalon.framework.activity.Startable;
   import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.framework.configuration.ConfigurationException;
  @@ -28,7 +29,8 @@
   public class StoreJanitorImpl extends AbstractLoggable implements StoreJanitor,
                                                                     Configurable, 
                                                                     ThreadSafe, 
  -                                                                  Runnable {
  +                                                                  Runnable,
  +                                                                  Startable {
   
     private int freememory = -1;
     private int heapsize = -1;
  @@ -37,8 +39,8 @@
     private Runtime jvm;
     private ArrayList storelist;
     private int index = -1;
  +  private static boolean doRun = true;
   
  -
     /** 
      * Initialize the StoreJanitorImpl.
      * A few options can be used :
  @@ -76,7 +78,9 @@
       }
   
       this.setStoreList(new ArrayList());
  +  }
   
  +  public void start() {
       Thread checker = new Thread(this);
       this.getLogger().debug("Intializing checker thread");
       checker.setPriority(this.getPriority());
  @@ -85,11 +89,15 @@
       checker.start();
     }
   
  +  public void stop() {
  +    doRun = false;
  +  }
  +
     /**
      * The "checker" thread checks if memory is running low in the jvm.
      */
     public void run() {
  -    while (true) {
  +    while (doRun) {
         // amount of memory used is greater then heapsize
         if (this.memoryLow()) {
           this.getLogger().debug("Invoking garbage collection, total memory = "
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org