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]