froehlich 02/01/06 06:28:10 Modified: src/scratchpad/src/org/apache/cocoon/jispstore MRUMemoryStore.java JispStringKey.java JispFilesystemStore.java FilesystemQueueImpl.java Log: removed odd "new line" format and changed store method towards orginal design proposal Revision Changes Path 1.2 +1 -317 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/MRUMemoryStore.java Index: MRUMemoryStore.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/MRUMemoryStore.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MRUMemoryStore.java 3 Jan 2002 12:31:36 -0000 1.1 +++ MRUMemoryStore.java 6 Jan 2002 14:28:10 -0000 1.2 @@ -1,317 +1 @@ -/***************************************************************************** - * Copyright (C) The Apache Software Foundation. All rights reserved. * - * ------------------------------------------------------------------------- * - * This software is published under the terms of the Apache Software License * - * version 1.1, a copy of which has been included with this distribution in * - * the LICENSE file. * - *****************************************************************************/ -package org.apache.cocoon.jispstore; - -import org.apache.avalon.framework.activity.Disposable; -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.logger.AbstractLoggable; -import org.apache.avalon.framework.parameters.ParameterException; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.framework.thread.ThreadSafe; -import org.apache.cocoon.Constants; -import org.apache.cocoon.components.store.FilesystemQueue; -import org.apache.cocoon.components.store.FilesystemQueueObject; -import org.apache.cocoon.components.store.Store; -import org.apache.cocoon.components.store.StoreJanitor; -import org.apache.cocoon.util.ClassUtils; - -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.LinkedList; - -/** - * This class provides a cache algorithm for the requested documents. It - * combines a HashMap and a LinkedList to create a so called MRU (Most Recently - * Used) cache. - * - * @author <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Davanum Srinivas</a> - */ -public final class MRUMemoryStore -extends AbstractLoggable -implements Store, - Parameterizable, - ThreadSafe, - Composable, - Disposable { - - private int mMaxobjects; - private boolean mFilesystem; - private Hashtable mCache; - private LinkedList mMRUList; - private Store mFsstore; - private StoreJanitor mStorejanitor; - private FilesystemQueue mFilesystemQueue; - private ComponentManager mComponetManager; - - - /** - * Get the object associated to the given unique key. - * - * @param the Key Object - * @return the Object associated with Key Object - */ - public Object get(Object key) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Getting object from memory. Key: " + key); - } - Object tmpobject = this.mCache.get(key); - if (tmpobject != null) { - - this.mMRUList.remove(key); - this.mMRUList.addFirst(key); - return tmpobject; - } - - this.getLogger().debug("Object not found in memory"); - - if (this.mFilesystem) { - tmpobject = this.mFsstore.get(key); - if (tmpobject == null) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Object was NOT found on fs. " - + "Looked for: " + key); - } - return null; - } else { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Object was found on fs"); - } - if (!this.mCache.containsKey(key)) { - this.hold(key, tmpobject); - } - return tmpobject; - } - } - return null; - } - - - /** - * Get components of the ComponentManager - * - * @param the Component Manager - * @exception ComponentException - */ - public void compose(ComponentManager manager) - throws ComponentException { - this.mComponetManager = manager; - if (getLogger().isDebugEnabled()) { - getLogger().debug("Looking up " - + Store.ROLE + "/JispFilesystemStore"); - } - this.mFsstore = (Store) manager.lookup(Store.ROLE - + "/JispFilesystemStore"); - if (getLogger().isDebugEnabled()) { - getLogger().debug("Looking up " + StoreJanitor.ROLE); - } - this.mStorejanitor = (StoreJanitor) manager.lookup(StoreJanitor.ROLE); - if (getLogger().isDebugEnabled()) { - getLogger().debug("Looking up " + FilesystemQueue.ROLE); - } - this.mFilesystemQueue = (FilesystemQueue) manager.lookup(FilesystemQueue.ROLE); - } - - - /** - * Configure the MRUMemoryStore. A few options can be used : - * <UL> - * <LI> mMaxobjects = how many objects will be stored in memory (Default: - * 10 objects)</LI> - * <LI> mFilesystem = use filesystem storage to keep object persistent - * (Default: false)</LI> - * </UL> - * - * - * @param the Configuration Parameters - * @exception ParameterException - */ - public void parameterize(Parameters params) - throws ParameterException { - this.mMaxobjects = params.getParameterAsInteger("maxobjects", 100); - this.mFilesystem = params.getParameterAsBoolean("filesystem", false); - if ((this.mMaxobjects < 1)) { - throw new ParameterException("MRUMemoryStore maxobjects must be " - + "at least 1 milli second!"); - } - - this.mCache = new Hashtable((int) (this.mMaxobjects * 1.2)); - this.mMRUList = new LinkedList(); - this.mStorejanitor.register(this); - } - - - /** - * Dispose the component - */ - public void dispose() { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("dispose()"); - } - - if (this.mComponetManager != null) { - this.mComponetManager.release(this.mStorejanitor); - this.mStorejanitor = null; - this.mComponetManager.release(this.mFilesystemQueue); - this.mFilesystemQueue = null; - this.mComponetManager.release(this.mFsstore); - this.mFsstore = null; - } - } - - - /** - * 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 Object - * @param the Value Object - */ - public void store(Object key, Object value) { - this.mFilesystemQueue.insert(new FilesystemQueueObject(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 Object - * @param the Value Object - */ - public void hold(Object key, Object value) { - if (getLogger().isDebugEnabled()) { - getLogger().debug("Holding object in memory. key: " + key); - getLogger().debug("Holding object in memory. value: " + value); - } - - while (this.mMRUList.size() >= this.mMaxobjects) { - - this.free(); - } - - if (this.mFilesystem) { - if (this.checkSerializable(value) && - !this.mFsstore.containsKey(key)) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Storing object on fs"); - } - try { - this.store(key, value); - } catch (Exception e) { - this.getLogger().error("Error storing Object on fs", e); - } - } - } - - this.mCache.put(key, value); - this.mMRUList.remove(key); - this.mMRUList.addFirst(key); - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Cache size=" + mCache.size()); - } - } - - - /** - * Remove the object associated to the given key. - * - * @param the Key object - */ - public void remove(Object key) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Removing object from store"); - } - this.mCache.remove(key); - this.mMRUList.remove(key); - if (this.mFilesystem && key != null) { - this.mFsstore.remove(key); - } - } - - - /** - * Indicates if the given key is associated to a contained object. - * - * @param the Key Object - * @return true if Key exists and false if not - */ - public boolean containsKey(Object key) { - if (mFilesystem) { - return (this.mCache.containsKey(key) - || this.mFsstore.containsKey(key)); - } else { - return this.mCache.containsKey(key); - } - } - - - /** - * Returns the list of used keys as an Enumeration. - * - * @return the enumeration of the cache - */ - public Enumeration keys() { - return this.mCache.keys(); - } - - - /** - * Frees some of the fast memory used by this store. It removes the last - * element in the store. - */ - public void free() { - try { - if (this.mCache.size() > 0) { - this.getLogger().debug("Freeing cache"); - this.mCache.remove(this.mMRUList.getLast()); - this.mMRUList.removeLast(); - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("Cache size=" + mCache.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 tested - * @return true if the object is storeable - */ - private boolean checkSerializable(Object object) { - try { - if (getLogger().isDebugEnabled()) { - 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; - } - } -} - +/***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.jispstore; import org.apache.avalon.framework.activity.Disposable; 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.logger.AbstractLoggable; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.Constants; import org.apache.cocoon.components.store.FilesystemQueue; import org.apache.cocoon.components.store.FilesystemQueueObject; import org.apache.cocoon.components.store.Store; import org.apache.cocoon.components.store.StoreJanitor; import org.apache.cocoon.util.ClassUtils; import java.util.Enumeration; import java.util.Hashtable; import java.util.LinkedList; /** * This class provides a cache algorithm for the requested documents. It * combines a HashMap and a LinkedList to create a so called MRU (Most Recently * Used) cache. * * @author <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> * @author <a href="mailto:[EMAIL PROTECTED]">Davanum Srinivas</a> */ public final class MRUMemoryStore extends AbstractLoggable implements Store, Parameterizable, ThreadSafe, Composable, Disposable { private int mMaxobjects; private boolean mFilesystem; private Hashtable mCache; private LinkedList mMRUList; private Store mFsstore; private StoreJanitor mStorejanitor; private FilesystemQueue mFilesystemQueue; private ComponentManager mComponetManager; /** * Get the object associated to the given unique key. * * @param the Key Object * @return the Object associated with Key Object */ public Object get(Object key) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("Getting object from memory. Key: " + key); } Object tmpobject = this.mCache.get(key); if (tmpobject != null) { this.mMRUList.remove(key); this.mMRUList.addFirst(key); return tmpobject; } this.getLogger().debug("Object not found in memory"); if (this.mFilesystem) { tmpobject = this.mFsstore.get(key); if (tmpobject == null) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("Object was NOT found on fs. " + "Looked for: " + key); } return null; } else { if (getLogger().isDebugEnabled()) { this.getLogger().debug("Object was found on fs"); } if (!this.mCache.containsKey(key)) { this.hold(key, tmpobject); } return tmpobject; } } return null; } /** * Get components of the ComponentManager * * @param the Component Manager * @exception ComponentException */ public void compose(ComponentManager manager) throws ComponentException { this.mComponetManager = manager; if (getLogger().isDebugEnabled()) { getLogger().debug("Looking up " + Store.ROLE + "/JispFilesystemStore"); } this.mFsstore = (Store) manager.lookup(Store.ROLE + "/JispFilesystemStore"); if (getLogger().isDebugEnabled()) { getLogger().debug("Looking up " + StoreJanitor.ROLE); } this.mStorejanitor = (StoreJanitor) manager.lookup(StoreJanitor.ROLE); if (getLogger().isDebugEnabled()) { getLogger().debug("Looking up " + FilesystemQueue.ROLE); } this.mFilesystemQueue = (FilesystemQueue) manager.lookup(FilesystemQueue.ROLE); } /** * Configure the MRUMemoryStore. A few options can be used : * <UL> * <LI> mMaxobjects = how many objects will be stored in memory (Default: * 10 objects)</LI> * <LI> mFilesystem = use filesystem storage to keep object persistent * (Default: false)</LI> * </UL> * * * @param the Configuration Parameters * @exception ParameterException */ public void parameterize(Parameters params) throws ParameterException { this.mMaxobjects = params.getParameterAsInteger("maxobjects", 100); this.mFilesystem = params.getParameterAsBoolean("filesystem", false); if ((this.mMaxobjects < 1)) { throw new ParameterException("MRUMemoryStore maxobjects must be " + "at least 1 milli second!"); } this.mCache = new Hashtable((int) (this.mMaxobjects * 1.2)); this.mMRUList = new LinkedList(); this.mStorejanitor.register(this); } /** * Dispose the component */ public void dispose() { if (getLogger().isDebugEnabled()) { this.getLogger().debug("dispose()"); } if (this.mComponetManager != null) { this.mComponetManager.release(this.mStorejanitor); this.mStorejanitor = null; this.mComponetManager.release(this.mFilesystemQueue); this.mFilesystemQueue = null; this.mComponetManager.release(this.mFsstore); this.mFsstore = null; } } /** * 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 Object * @param the Value Object */ public void store(Object key, Object value) { if (this.mFilesystem) { if (this.checkSerializable(value) && !this.mFsstore.containsKey(key)) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("Storing object on fs"); } try { this.mFilesystemQueue.insert(new FilesystemQueueObject(key, value)); } catch (Exception e) { this.getLogger().error("Error storing Object on fs", e); } } } } /** * 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 Object * @param the Value Object */ public void hold(Object key, Object value) { if (getLogger().isDebugEnabled()) { getLogger().debug("Holding object in memory. key: " + key); getLogger().debug("Holding object in memory. value: " + value); } while (this.mMRUList.size() >= this.mMaxobjects) { this.free(); } this.mCache.put(key, value); this.mMRUList.remove(key); this.mMRUList.addFirst(key); if (getLogger().isDebugEnabled()) { this.getLogger().debug("Cache size=" + mCache.size()); } } /** * Remove the object associated to the given key. * * @param the Key object */ public void remove(Object key) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("Removing object from store"); } this.mCache.remove(key); this.mMRUList.remove(key); if (this.mFilesystem && key != null) { this.mFsstore.remove(key); } } /** * Indicates if the given key is associated to a contained object. * * @param the Key Object * @return true if Key exists and false if not */ public boolean containsKey(Object key) { if (mFilesystem) { return (this.mCache.containsKey(key) || this.mFsstore.containsKey(key)); } else { return this.mCache.containsKey(key); } } /** * Returns the list of used keys as an Enumeration. * * @return the enumeration of the cache */ public Enumeration keys() { return this.mCache.keys(); } /** * Frees some of the fast memory used by this store. It removes the last * element in the store. */ public void free() { try { if (this.mCache.size() > 0) { this.getLogger().debug("Freeing cache"); this.mCache.remove(this.mMRUList.getLast()); this.mMRUList.removeLast(); if (getLogger().isDebugEnabled()) { this.getLogger().debug("Cache size=" + mCache.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 tested * @return true if the object is storeable */ private boolean checkSerializable(Object object) { try { if (getLogger().isDebugEnabled()) { 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; } } } \ No newline at end of file 1.2 +1 -117 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/JispStringKey.java Index: JispStringKey.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/JispStringKey.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JispStringKey.java 3 Jan 2002 12:31:36 -0000 1.1 +++ JispStringKey.java 6 Jan 2002 14:28:10 -0000 1.2 @@ -1,117 +1 @@ -/***************************************************************************** - * Copyright (C) The Apache Software Foundation. All rights reserved. * - * ------------------------------------------------------------------------- * - * This software is published under the terms of the Apache Software License * - * version 1.1, a copy of which has been included with this distribution in * - * the LICENSE file. * - *****************************************************************************/ -package org.apache.cocoon.jispstore; - -import com.coyotegulch.jisp.KeyObject; - -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; - -/** - * Wrapper class to make our cache Key compatible with the Jisp KeyObject NOTE: - * This Wrapper is only for String Keys. - * - * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]"> - * [EMAIL PROTECTED]</a> - */ -final class JispStringKey extends KeyObject { - final static long serialVersionUID = -6894793231339165076L; - private String mKey; - - - /** - * Constructor for the JispStringKey object - */ - public JispStringKey() { - mKey = new String(""); - } - - - /** - * Constructor for the JispStringKey object - * - * @param the Value of the Key as String - */ - public JispStringKey(String keyValue) { - mKey = keyValue; - } - - - /** - * Compares two Keys - * - * @param the KeyObject to be compared - * @return 0 if equal, 1 if greater, -1 if less - */ - public int compareTo(KeyObject key) { - if (key instanceof JispStringKey) { - int comp = mKey.trim().compareTo(((JispStringKey) key).mKey.trim()); - - if (comp == 0) { - return KEY_EQUAL; - } else { - if (comp < 0) { - return KEY_LESS; - } else { - return KEY_MORE; - } - } - } else { - return KEY_ERROR; - } - } - - - /** - * Composes a null Kewy - * - * @return a null Key - */ - public KeyObject makeNullKey() { - return new JispStringKey(); - } - - - /** - * - * - * @param out Description of Parameter - * @exception IOException Description of Exception - */ - public void writeExternal(ObjectOutput out) - throws IOException { - String outKey; - outKey = new String(mKey); - out.writeUTF(outKey); - } - - - /** - * Description of the Method - * - * @param in Description of Parameter - * @exception IOException Description of Exception - * @exception ClassNotFoundException Description of Exception - */ - public void readExternal(ObjectInput in) - throws IOException, ClassNotFoundException { - mKey = in.readUTF(); - } - - - /** - * Overrides the toString() method - * - * @return the Key as String - */ - public String toString() { - return mKey; - } -} - +/***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.jispstore; import com.coyotegulch.jisp.KeyObject; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; /** * Wrapper class to make our cache Key compatible with the Jisp KeyObject NOTE: * This Wrapper is only for String Keys. * * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]"> * [EMAIL PROTECTED]</a> */ final class JispStringKey extends KeyObject { final static long serialVersionUID = -6894793231339165076L; private String mKey; /** * Constructor for the JispStringKey object */ public JispStringKey() { mKey = new String(""); } /** * Constructor for the JispStringKey object * * @param the Value of the Key as String */ public JispStringKey(String keyValue) { mKey = keyValue; } /** * Compares two Keys * * @param the KeyObject to be compared * @return 0 if equal, 1 if greater, -1 if less */ public int compareTo(KeyObject key) { if (key instanceof JispStringKey) { int comp = mKey.trim().compareTo(((JispStringKey) key).mKey.trim()); if (comp == 0) { return KEY_EQUAL; } else { if (comp < 0) { return KEY_LESS; } else { return KEY_MORE; } } } else { return KEY_ERROR; } } /** * Composes a null Kewy * * @return a null Key */ public KeyObject makeNullKey() { return new JispStringKey(); } /** * * * @param out Description of Parameter * @exception IOException Description of Exception */ public void writeExternal(ObjectOutput out) throws IOException { String outKey; outKey = new String(mKey); out.writeUTF(outKey); } /** * Description of the Method * * @param in Description of Parameter * @exception IOException Description of Exception * @exception ClassNotFoundException Description of Exception */ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { mKey = in.readUTF(); } /** * Overrides the toString() method * * @return the Key as String */ public String toString() { return mKey; } } \ No newline at end of file 1.2 +1 -369 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/JispFilesystemStore.java Index: JispFilesystemStore.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/JispFilesystemStore.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JispFilesystemStore.java 3 Jan 2002 12:31:36 -0000 1.1 +++ JispFilesystemStore.java 6 Jan 2002 14:28:10 -0000 1.2 @@ -1,369 +1 @@ -/** - * Copyright (C) The Apache Software Foundation. All rights reserved. * - * ------------------------------------------------------------------------- * - * This software is published under the terms of the Apache Software License * - * version 1.1, a copy of which has been included with this distribution in * - * the LICENSE file. * - */ -package org.apache.cocoon.jispstore; - -import org.apache.avalon.framework.activity.Initializable; -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.ParameterException; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.framework.thread.ThreadSafe; -import org.apache.cocoon.Constants; -import org.apache.cocoon.components.store.Store; -import org.apache.cocoon.util.IOUtils; - -import com.coyotegulch.jisp.BTreeIndex; -import com.coyotegulch.jisp.IndexedObjectDatabase; -import com.coyotegulch.jisp.KeyNotFound; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.util.Enumeration; - -/** - * This store is based on the Jisp library - * (http://www.coyotegulch.com/jisp/index.html) This store uses B-Tree indexes - * to access variable-length serialized data stored in files. - * - * @author Gerhard Froehlich - * <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> - */ -public final class JispFilesystemStore -extends AbstractLoggable -implements Store, - Contextualizable, - ThreadSafe, - Initializable, - Parameterizable { - - /** - * The directory repository - */ - protected File mDirectoryFile; - /** - * Description of the Field - */ - protected volatile String mDirectoryPath; - - /** - * The database - */ - private String mDatabaseName; - private String mIndexName; - private int mOrder; - private IndexedObjectDatabase mDatabase; - private BTreeIndex mIndex; - - - /** - * Sets the repository's location - * - * @param the new directory value - * @exception IOException - */ - public void setDirectory(final String directory) - throws IOException { - this.setDirectory(new File(directory)); - } - - - /** - * Sets the repository's location - * - * @param the new directory value - * @exception IOException - */ - public void setDirectory(final File directory) - throws IOException { - this.mDirectoryFile = directory; - - /* - * Save directory path prefix - */ - this.mDirectoryPath = IOUtils.getFullFilename(this.mDirectoryFile); - this.mDirectoryPath += File.separator; - - /* - * Does directory exist? - */ - if (!this.mDirectoryFile.exists()) { - /* - * Create it anew - */ - if (!this.mDirectoryFile.mkdir()) { - throw new IOException( - "Error creating store directory '" - + this.mDirectoryPath + "': "); - } - } - - /* - * Is given file actually a directory? - */ - if (!this.mDirectoryFile.isDirectory()) { - throw new IOException("'" + this.mDirectoryPath - + "' is not a directory"); - } - - /* - * Is directory readable and writable? - */ - if (!(this.mDirectoryFile.canRead() - && this.mDirectoryFile.canWrite())) { - throw new IOException( - "Directory '" + this.mDirectoryPath - + "' is not readable/writable" - ); - } - } - - - /** - * Returns the repository's full pathname - * - * @return the directory as String - */ - public String getDirectoryPath() { - return this.mDirectoryPath; - } - - - /** - * Returns a Object from the store associated with the Key Object - * - * @param the Key object - * @return the Object associated with Key Object - */ - public Object get(Object key) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("get(): Get file with key: " + key.toString()); - } - Object readObj = null; - - try { - readObj = mDatabase.read(new JispStringKey(key.toString()), mIndex); - if (getLogger().isDebugEnabled()) { - if (readObj != null) { - this.getLogger().debug("get(): FOUND!!= " + readObj); - } else { - this.getLogger().debug("get(): NOT_FOUND!!"); - } - } - } catch (Exception e) { - getLogger().error("get(..): Exception", e); - } - return readObj; - } - - - /** - * Contextualize the Component - * - * @param the Context of the Application - * @exception ContextException - */ - public void contextualize(final Context context) - throws ContextException { - try { - setDirectory((File) context.get(Constants.CONTEXT_WORK_DIR)); - } catch (Exception e) { - // ignore - } - } - - - /** - * Initialize the Component - */ - public void initialize() { - - if (getLogger().isDebugEnabled()) { - getLogger().debug("initialize() JispFilesystemStore"); - } - - try { - if (getLogger().isDebugEnabled()) { - getLogger().debug("initialize(): Path to Datafile=" - + this.getDirectoryPath() + mDatabaseName); - } - File myFile = new File(this.getDirectoryPath() + mDatabaseName); - - if (myFile.exists()) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("initialize(): Datafile exists"); - } - mDatabase = new IndexedObjectDatabase(getDirectoryPath() - + mDatabaseName, false); - mIndex = new BTreeIndex(this.getDirectoryPath() + mIndexName); - mDatabase.attachIndex(mIndex); - mIndex.dumpTree(); - } else { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("initialize(): Datafile not exists"); - } - mDatabase = new IndexedObjectDatabase(getDirectoryPath() - + mDatabaseName, false); - mIndex = new BTreeIndex(this.getDirectoryPath() + mIndexName, - mOrder, new JispStringKey(), false); - mDatabase.attachIndex(mIndex); - mIndex.dumpTree(); - } - } catch (KeyNotFound ignore) { - - } catch (Exception e) { - getLogger().error("initialize(..) Exception", e); - } - } - - - /** - * Configure the Component. A few options can be used : - * <UL> - * <LI> mDatabaseName = the name of the data file (Default: cocoon.dat) - * </LI> - * <LI> mIndexName = the name of the index file (Default: cocoon.idx) - * </LI> - * <LI> mOrder = The page size of the B-Tree</LI> - * </UL> - * - * - * @param The Configuration Paramter - * @exception ParameterException - */ - public void parameterize(Parameters params) - throws ParameterException { - mDatabaseName = params.getParameter("datafile", "cocoon.dat"); - mIndexName = params.getParameter("indexfile", "cocoon.idx"); - mOrder = params.getParameterAsInteger("order", 1001); - - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("parameterize(..): mDatabaseName=" - + mDatabaseName); - this.getLogger().debug("parameterize(..): mIndexName=" - + mIndexName); - this.getLogger().debug("parameterize(..): mOrder=" + mOrder); - } - } - - - /** - * Store the given Object in the indexed data file. - * - * @param the Key Object - * @param the Value Object - * @exception IOException - */ - public void store(Object key, Object value) - throws IOException { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("store(): Store file with key: " - + key.toString()); - } - - if (value instanceof Serializable) { - try { - JispStringKey[] keyArray = new JispStringKey[1]; - keyArray[0] = new JispStringKey(key.toString()); - - mDatabase.write(keyArray, (Serializable) value); - } catch (Exception e) { - this.getLogger().error("store(..): Exception", e); - } - } else { - throw new IOException("Object not Serializable"); - } - } - - - /** - * Holds the given Object in the indexed data file. - * - * @param the Key Object - * @param the Value Object - * @exception IOException - */ - public void hold(Object key, Object value) - throws IOException { - this.store(key, value); - } - - - /** - * Frees some values of the data file - */ - public void free() { - //TODO: implementation - } - - - /** - * Removes a value from the data file with the given key. - * - * @param the Key Object - */ - public void remove(Object key) { - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("remove(..) Remove item"); - } - - try { - JispStringKey[] keyArray = new JispStringKey[1]; - keyArray[0] = new JispStringKey(key.toString()); - - mDatabase.remove(keyArray); - } catch (KeyNotFound ignore) { - - } catch (Exception e) { - this.getLogger().error("remove(..): Exception", e); - } - } - - - /** - * Test if the the index file contains the given key - * - * @param the Key Object - * @return true if Key exists and false if not - */ - public boolean containsKey(Object key) { - long res = -1; - - try { - res = mIndex.findKey(new JispStringKey(key.toString())); - if (getLogger().isDebugEnabled()) { - this.getLogger().debug("containsKey(..): res=" + res); - } - } catch (KeyNotFound ignore) { - - } catch (Exception e) { - this.getLogger().error("containsKey(..): Exception", e); - } - - if (res > 0) { - return true; - } else { - return false; - } - } - - - /** - * Returns a Enumeration of all Keys in the indexed file - * - * @return Enumeration Object with all existing keys - */ - public Enumeration keys() { - //TODO: Implementation - return null; - } -} - +/** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * */ package org.apache.cocoon.jispstore; import org.apache.avalon.framework.activity.Initializable; 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.ParameterException; import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.Constants; import org.apache.cocoon.components.store.Store; import org.apache.cocoon.util.IOUtils; import com.coyotegulch.jisp.BTreeIndex; import com.coyotegulch.jisp.IndexedObjectDatabase; import com.coyotegulch.jisp.KeyNotFound; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; /** * This store is based on the Jisp library * (http://www.coyotegulch.com/jisp/index.html). This store uses B-Tree indexes * to access variable-length serialized data stored in files. * * @author Gerhard Froehlich * <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> */ public final class JispFilesystemStore extends AbstractLoggable implements Store, Contextualizable, ThreadSafe, Initializable, Parameterizable { /** * The directory repository */ protected File mDirectoryFile; /** * Description of the Field */ protected volatile String mDirectoryPath; /** * The database */ private String mDatabaseName; private String mIndexName; private int mOrder; private IndexedObjectDatabase mDatabase; private BTreeIndex mIndex; /** * Sets the repository's location * * @param the new directory value * @exception IOException */ public void setDirectory(final String directory) throws IOException { this.setDirectory(new File(directory)); } /** * Sets the repository's location * * @param the new directory value * @exception IOException */ public void setDirectory(final File directory) throws IOException { this.mDirectoryFile = directory; /* * Save directory path prefix */ this.mDirectoryPath = IOUtils.getFullFilename(this.mDirectoryFile); this.mDirectoryPath += File.separator; /* * Does directory exist? */ if (!this.mDirectoryFile.exists()) { /* * Create it anew */ if (!this.mDirectoryFile.mkdir()) { throw new IOException( "Error creating store directory '" + this.mDirectoryPath + "': "); } } /* * Is given file actually a directory? */ if (!this.mDirectoryFile.isDirectory()) { throw new IOException("'" + this.mDirectoryPath + "' is not a directory"); } /* * Is directory readable and writable? */ if (!(this.mDirectoryFile.canRead() && this.mDirectoryFile.canWrite())) { throw new IOException( "Directory '" + this.mDirectoryPath + "' is not readable/writable" ); } } /** * Returns the repository's full pathname * * @return the directory as String */ public String getDirectoryPath() { return this.mDirectoryPath; } /** * Returns a Object from the store associated with the Key Object * * @param the Key object * @return the Object associated with Key Object */ public Object get(Object key) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("get(): Get file with key: " + key.toString()); } Object readObj = null; try { readObj = mDatabase.read(new JispStringKey(key.toString()), mIndex); if (getLogger().isDebugEnabled()) { if (readObj != null) { this.getLogger().debug("get(): FOUND!!= " + readObj); } else { this.getLogger().debug("get(): NOT_FOUND!!"); } } } catch (Exception e) { getLogger().error("get(..): Exception", e); } return readObj; } /** * Contextualize the Component * * @param the Context of the Application * @exception ContextException */ public void contextualize(final Context context) throws ContextException { try { setDirectory((File) context.get(Constants.CONTEXT_WORK_DIR)); } catch (Exception e) { // ignore } } /** * Initialize the Component */ public void initialize() { if (getLogger().isDebugEnabled()) { getLogger().debug("initialize() JispFilesystemStore"); } try { if (getLogger().isDebugEnabled()) { getLogger().debug("initialize(): Path to Datafile=" + this.getDirectoryPath() + mDatabaseName); } File myFile = new File(this.getDirectoryPath() + mDatabaseName); if (myFile.exists()) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("initialize(): Datafile exists"); } mDatabase = new IndexedObjectDatabase(getDirectoryPath() + mDatabaseName, false); mIndex = new BTreeIndex(this.getDirectoryPath() + mIndexName); mDatabase.attachIndex(mIndex); mIndex.dumpTree(); } else { if (getLogger().isDebugEnabled()) { this.getLogger().debug("initialize(): Datafile not exists"); } mDatabase = new IndexedObjectDatabase(getDirectoryPath() + mDatabaseName, false); mIndex = new BTreeIndex(this.getDirectoryPath() + mIndexName, mOrder, new JispStringKey(), false); mDatabase.attachIndex(mIndex); mIndex.dumpTree(); } } catch (KeyNotFound ignore) { } catch (Exception e) { getLogger().error("initialize(..) Exception", e); } } /** * Configure the Component. A few options can be used : * <UL> * <LI> mDatabaseName = the name of the data file (Default: cocoon.dat) * </LI> * <LI> mIndexName = the name of the index file (Default: cocoon.idx) * </LI> * <LI> mOrder = The page size of the B-Tree</LI> * </UL> * * * @param The Configuration Paramter * @exception ParameterException */ public void parameterize(Parameters params) throws ParameterException { mDatabaseName = params.getParameter("datafile", "cocoon.dat"); mIndexName = params.getParameter("indexfile", "cocoon.idx"); mOrder = params.getParameterAsInteger("order", 1001); if (getLogger().isDebugEnabled()) { this.getLogger().debug("parameterize(..): mDatabaseName=" + mDatabaseName); this.getLogger().debug("parameterize(..): mIndexName=" + mIndexName); this.getLogger().debug("parameterize(..): mOrder=" + mOrder); } } /** * Store the given Object in the indexed data file. * * @param the Key Object * @param the Value Object * @exception IOException */ public void store(Object key, Object value) throws IOException { if (getLogger().isDebugEnabled()) { this.getLogger().debug("store(): Store file with key: " + key.toString()); } if (value instanceof Serializable) { try { JispStringKey[] keyArray = new JispStringKey[1]; keyArray[0] = new JispStringKey(key.toString()); mDatabase.write(keyArray, (Serializable) value); } catch (Exception e) { this.getLogger().error("store(..): Exception", e); } } else { throw new IOException("Object not Serializable"); } } /** * Holds the given Object in the indexed data file. * * @param the Key Object * @param the Value Object * @exception IOException */ public void hold(Object key, Object value) throws IOException { this.store(key, value); } /** * Frees some values of the data file */ public void free() { //TODO: implementation } /** * Removes a value from the data file with the given key. * * @param the Key Object */ public void remove(Object key) { if (getLogger().isDebugEnabled()) { this.getLogger().debug("remove(..) Remove item"); } try { JispStringKey[] keyArray = new JispStringKey[1]; keyArray[0] = new JispStringKey(key.toString()); mDatabase.remove(keyArray); } catch (KeyNotFound ignore) { } catch (Exception e) { this.getLogger().error("remove(..): Exception", e); } } /** * Test if the the index file contains the given key * * @param the Key Object * @return true if Key exists and false if not */ public boolean containsKey(Object key) { long res = -1; try { res = mIndex.findKey(new JispStringKey(key.toString())); if (getLogger().isDebugEnabled()) { this.getLogger().debug("containsKey(..): res=" + res); } } catch (KeyNotFound ignore) { } catch (Exception e) { this.getLogger().error("containsKey(..): Exception", e); } if (res > 0) { return true; } else { return false; } } /** * Returns a Enumeration of all Keys in the indexed file * * @return Enumeration Object with all existing keys */ public Enumeration keys() { //TODO: Implementation return null; } } \ No newline at end of file 1.2 +1 -240 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/FilesystemQueueImpl.java Index: FilesystemQueueImpl.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/jispstore/FilesystemQueueImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FilesystemQueueImpl.java 3 Jan 2002 12:31:36 -0000 1.1 +++ FilesystemQueueImpl.java 6 Jan 2002 14:28:10 -0000 1.2 @@ -1,240 +1 @@ -/***************************************************************************** - * Copyright (C) The Apache Software Foundation. All rights reserved. * - * ------------------------------------------------------------------------- * - * This software is published under the terms of the Apache Software License * - * version 1.1, a copy of which has been included with this distribution in * - * the LICENSE file. * - *****************************************************************************/ -package org.apache.cocoon.jispstore; - -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.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.components.store.FilesystemQueue; -import org.apache.cocoon.components.store.FilesystemQueueObject; -import org.apache.cocoon.components.store.Store; -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; - -/** - * This class provides a asynchron queue for storing objects on the filesystem. - * Every store component can uses this component to store object in the - * configured cache directory. - * - * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> - */ -public final class FilesystemQueueImpl -extends AbstractLoggable -implements FilesystemQueue, - Configurable, - Runnable, - ThreadSafe, - Composable, - Disposable, - Startable { - - private static boolean doRun = false; - - private int handlerinterval; - private int threadpriority; - private int maxobjects; - private LinkedList linkedList; - private Store fsstore; - private Thread fsQueueHandler; - private ComponentManager manager; - - - /** - * Test if queue is empty. - * - * @return true if queue is empty else false. - */ - public boolean isEmpty() { - return (this.linkedList.size() == 0); - } - - - /** - * Get components of the ComponentManager - * - * @param manager Description of Parameter - * @exception ComponentException Description of Exception - */ - public void compose(ComponentManager manager) - throws ComponentException { - this.manager = manager; - if (this.getLogger().isDebugEnabled() == true) { - getLogger().debug("Looking up " + Store.ROLE + "/JispFilesystemStore"); - } - this.fsstore = (Store) manager.lookup(Store.ROLE + "/JispFilesystemStore"); - } - - - /** - * Dispose the component - */ - public void dispose() { - if (this.manager != null) { - this.manager.release(this.fsstore); - this.fsstore = null; - } - } - - - /** - * Configure the Filesystem Queue: - * <UL> - * <LI> handlerinterval = Interval of the Queue Handler Thread</LI> - * <LI> threadpriority = Priority of the Queue Handler Thread</LI> >LI> - * maxobjects = Defines the max. numbers of Objects in the queue</LI> - * - * </UL> - * - * - * @param conf Description of Parameter - * @exception ConfigurationException Description of Exception - */ - public void configure(Configuration conf) - throws ConfigurationException { - Parameters params = Parameters.fromConfiguration(conf); - this.handlerinterval = params.getParameterAsInteger("handlerinterval", 10); - this.threadpriority = params.getParameterAsInteger("threadpriority", 5); - this.maxobjects = params.getParameterAsInteger("maxobjects", 100); - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Configure Filesystem Queue"); - this.getLogger().debug("handlerinterval=" + handlerinterval); - this.getLogger().debug("threadpriority=" + threadpriority); - } - this.linkedList = new LinkedList(); - } - - - /** - * Starts the Queue Handler Thread - */ - public void start() { - doRun = true; - this.fsQueueHandler = new Thread(this); - this.fsQueueHandler.setDaemon(true); - this.fsQueueHandler.setPriority(this.threadpriority); - this.fsQueueHandler.setName("fsQueueHandler"); - this.fsQueueHandler.start(); - } - - - /** - * Stops the Queue Handler Thread - */ - public void stop() { - doRun = false; - } - - - /** - * Main processing method for the FilesystemQueueImpl object - */ - public void run() { - while (doRun) { - while (!this.isEmpty()) { - FilesystemQueueObject filesystemQueueObject = (FilesystemQueueObject) this.pop(); - try { - this.fsstore.store(filesystemQueueObject.getKey(), - filesystemQueueObject.getObject() - ); - } catch (IOException e) { - this.getLogger().error("Error in fsQueueHandler", e); - } - } - try { - Thread.currentThread().sleep(this.handlerinterval * 1000); - } catch (InterruptedException ignore) { - } - } - } - - - /** - * Clear all elements from queue. - */ - public void clear() { - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Clearing the FilesystemQueue"); - } - ListIterator listIterator = linkedList.listIterator(0); - while (listIterator.hasNext()) { - this.linkedList.remove(listIterator.nextIndex()); - } - } - - - /** - * Insert an element into queue. - * - * @param element the element to be inserted - */ - public void insert(Object element) { - if (this.linkedList.size() < maxobjects) { - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Insert Element in FilesystemQueue"); - } - this.linkedList.addFirst(element); - this.reportSize(); - } else { - this.getLogger().warn("Filesystem Queue full!"); - } - } - - - /** - * Return element on top of heap but don't remove it. - * - * @return the element at top of heap - * @exception NoSuchElementException if isEmpty() == true - */ - public Object peek() - throws NoSuchElementException { - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Peek Element in FilesystemQueue"); - } - return (Comparable) linkedList.getLast(); - } - - - /** - * Return element on top of heap and remove it. - * - * @return the element at top of heap - * @exception NoSuchElementException if isEmpty() == true - */ - public Object pop() - throws NoSuchElementException { - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Pop Element in FilesystemQueue"); - } - return (Comparable) linkedList.removeLast(); - } - - - private void reportSize() { - if (this.getLogger().isDebugEnabled() == true) { - this.getLogger().debug("Size of FilesystemQueue=" - + this.linkedList.size()); - } - } -} - +/***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.jispstore; 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.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.components.store.FilesystemQueue; import org.apache.cocoon.components.store.FilesystemQueueObject; import org.apache.cocoon.components.store.Store; 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; /** * This class provides a asynchron queue for storing objects on the filesystem. * Every store component can uses this component to store object in the * configured cache directory. * * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a> */ public final class FilesystemQueueImpl extends AbstractLoggable implements FilesystemQueue, Configurable, Runnable, ThreadSafe, Composable, Disposable, Startable { private static boolean doRun = false; private int handlerinterval; private int threadpriority; private int maxobjects; private LinkedList linkedList; private Store fsstore; private Thread fsQueueHandler; private ComponentManager manager; /** * Test if queue is empty. * * @return true if queue is empty else false. */ public boolean isEmpty() { return (this.linkedList.size() == 0); } /** * Get components of the ComponentManager * * @param manager Description of Parameter * @exception ComponentException Description of Exception */ public void compose(ComponentManager manager) throws ComponentException { this.manager = manager; if (this.getLogger().isDebugEnabled() == true) { getLogger().debug("Looking up " + Store.ROLE + "/JispFilesystemStore"); } this.fsstore = (Store) manager.lookup(Store.ROLE + "/JispFilesystemStore"); } /** * Dispose the component */ public void dispose() { if (this.manager != null) { this.manager.release(this.fsstore); this.fsstore = null; } } /** * Configure the Filesystem Queue: * <UL> * <LI> handlerinterval = Interval of the Queue Handler Thread</LI> * <LI> threadpriority = Priority of the Queue Handler Thread</LI> >LI> * maxobjects = Defines the max. numbers of Objects in the queue</LI> * * </UL> * * * @param conf Description of Parameter * @exception ConfigurationException Description of Exception */ public void configure(Configuration conf) throws ConfigurationException { Parameters params = Parameters.fromConfiguration(conf); this.handlerinterval = params.getParameterAsInteger("handlerinterval", 10); this.threadpriority = params.getParameterAsInteger("threadpriority", 5); this.maxobjects = params.getParameterAsInteger("maxobjects", 100); if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Configure Filesystem Queue"); this.getLogger().debug("handlerinterval=" + handlerinterval); this.getLogger().debug("threadpriority=" + threadpriority); } this.linkedList = new LinkedList(); } /** * Starts the Queue Handler Thread */ public void start() { doRun = true; this.fsQueueHandler = new Thread(this); this.fsQueueHandler.setDaemon(true); this.fsQueueHandler.setPriority(this.threadpriority); this.fsQueueHandler.setName("fsQueueHandler"); this.fsQueueHandler.start(); } /** * Stops the Queue Handler Thread */ public void stop() { doRun = false; } /** * Main processing method for the FilesystemQueueImpl object */ public void run() { while (doRun) { while (!this.isEmpty()) { FilesystemQueueObject filesystemQueueObject = (FilesystemQueueObject) this.pop(); try { this.fsstore.store(filesystemQueueObject.getKey(), filesystemQueueObject.getObject() ); } catch (IOException e) { this.getLogger().error("Error in fsQueueHandler", e); } } try { Thread.currentThread().sleep(this.handlerinterval * 1000); } catch (InterruptedException ignore) {;} } } /** * Clear all elements from queue. */ public void clear() { if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Clearing the FilesystemQueue"); } ListIterator listIterator = linkedList.listIterator(0); while (listIterator.hasNext()) { this.linkedList.remove(listIterator.nextIndex()); } } /** * Insert an element into queue. * * @param element the element to be inserted */ public void insert(Object element) { if (this.linkedList.size() < maxobjects) { if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Insert Element in FilesystemQueue"); } this.linkedList.addFirst(element); this.reportSize(); } else { this.getLogger().warn("Filesystem Queue full!"); } } /** * Return element on top of heap but don't remove it. * * @return the element at top of heap * @exception NoSuchElementException if isEmpty() == true */ public Object peek() throws NoSuchElementException { if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Peek Element in FilesystemQueue"); } return (Comparable) linkedList.getLast(); } /** * Return element on top of heap and remove it. * * @return the element at top of heap * @exception NoSuchElementException if isEmpty() == true */ public Object pop() throws NoSuchElementException { if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Pop Element in FilesystemQueue"); } return (Comparable) linkedList.removeLast(); } private void reportSize() { if (this.getLogger().isDebugEnabled() == true) { this.getLogger().debug("Size of FilesystemQueue=" + this.linkedList.size()); } } } \ No newline at end of file
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]