You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jcs-dev@jakarta.apache.org by tv...@apache.org on 2007/05/10 18:04:27 UTC

svn commit: r536904 [13/38] - in /jakarta/jcs/trunk: ./ auxiliary-builds/javagroups/ auxiliary-builds/javagroups/src/java/org/apache/jcs/auxiliary/javagroups/ auxiliary-builds/javagroups/src/test/org/apache/jcs/auxiliary/javagroups/ auxiliary-builds/jd...

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java Thu May 10 09:03:42 2007
@@ -1,437 +1,447 @@
-package org.apache.jcs.auxiliary.disk.block;
-
-/*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache License, Version
- * 2.0 (the "License") you may not use this file except in compliance with the License. You may
- * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
- * applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
- * the License for the specific language governing permissions and limitations under the License.
- */
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jcs.auxiliary.disk.LRUMapJCS;
-import org.apache.jcs.utils.timing.ElapsedTimer;
-
-import EDU.oswego.cs.dl.util.concurrent.ClockDaemon;
-import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
-
-/**
- * This is responsible for storing the keys.
- * <p>
- * @author Aaron Smuts
- */
-public class BlockDiskKeyStore
-{
-    /** The logger */
-    private static final Log log = LogFactory.getLog( BlockDiskKeyStore.class );
-
-    /** Attributes governing the behavior of the block disk cache. */
-    private BlockDiskCacheAttributes blockDiskCacheAttributes;
-
-    /** The key to block map */
-    private Map keyHash;
-
-    /** The file where we persist the keys */
-    private File keyFile;
-
-    /** The name to prefix log messages with. */
-    private final String logCacheName;
-
-    /** Name of the file where we persist the keys */
-    private String fileName;
-
-    /** The maximum number of keys to store in memory */
-    private int maxKeySize;
-
-    /** we need this so we can communicate free blocks to the data store when keys fall off the LRU */
-    private BlockDiskCache blockDiskCache;
-
-    /** The root directory in which the keyFile lives */
-    private File rootDirectory;
-
-    /**
-     * The background key persister, one for all regions.
-     */
-    private static ClockDaemon persistenceDaemon;
-
-    /**
-     * Set the configuration options.
-     * <p>
-     * @param cacheAttributes
-     * @param blockDiskCache used for freeing
-     * @throws Exception
-     */
-    public BlockDiskKeyStore( BlockDiskCacheAttributes cacheAttributes, BlockDiskCache blockDiskCache )
-        throws Exception
-    {
-        this.blockDiskCacheAttributes = cacheAttributes;
-        this.logCacheName = "Region [" + this.blockDiskCacheAttributes.getCacheName() + "] ";
-        this.fileName = this.blockDiskCacheAttributes.getCacheName();
-        this.maxKeySize = cacheAttributes.getMaxKeySize();
-        this.blockDiskCache = blockDiskCache;
-
-        String rootDirName = cacheAttributes.getDiskPath();
-        this.rootDirectory = new File( rootDirName );
-        this.rootDirectory.mkdirs();
-
-        if ( log.isInfoEnabled() )
-        {
-            log.info( logCacheName + "Cache file root directory [" + rootDirName + "]" );
-        }
-
-        this.keyFile = new File( rootDirectory, fileName + ".key" );
-
-        if ( log.isInfoEnabled() )
-        {
-            log.info( logCacheName + "Key File [" + this.keyFile.getAbsolutePath() + "]" );
-        }
-
-        if ( keyFile.length() > 0 )
-        {
-            loadKeys();
-            // TODO verify somehow
-        }
-        else
-        {
-            initKeyMap();
-        }
-
-        // add this region to the persistence thread.
-        // TODO we might need to stagger this a bit.
-        if ( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() > 0 )
-        {
-            if ( persistenceDaemon == null )
-            {
-                persistenceDaemon = new ClockDaemon();
-                persistenceDaemon.setThreadFactory( new MyThreadFactory() );
-            }
-            persistenceDaemon
-                .executePeriodically( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() * 1000,
-                                      new Runnable()
-                                      {
-                                          public void run()
-                                          {
-                                              saveKeys();
-                                          }
-                                      }, false );
-        }
-    }
-
-    /**
-     * Saves key file to disk. This gets the LRUMap entry set and write the entries out one by one
-     * after putting them in a wrapper.
-     */
-    protected void saveKeys()
-    {
-        try
-        {
-            ElapsedTimer timer = new ElapsedTimer();
-            int numKeys = keyHash.size();
-            if ( log.isInfoEnabled() )
-            {
-                log.info( logCacheName + "Saving keys to [" + this.keyFile.getAbsolutePath() + "], key count ["
-                    + numKeys + "]" );
-            }
-
-            keyFile.delete();
-
-            keyFile = new File( rootDirectory, fileName + ".key" );
-            FileOutputStream fos = new FileOutputStream( keyFile );
-            BufferedOutputStream bos = new BufferedOutputStream( fos, 1024 );
-            ObjectOutputStream oos = new ObjectOutputStream( bos );
-            try
-            {
-                // don't need to synchronize, since the underlying collection makes a copy
-                Iterator keyIt = keyHash.entrySet().iterator();
-                while ( keyIt.hasNext() )
-                {
-                    Map.Entry entry = (Map.Entry) keyIt.next();
-                    BlockDiskElementDescriptor descriptor = new BlockDiskElementDescriptor();
-                    descriptor.setKey( (Serializable) entry.getKey() );
-                    descriptor.setBlocks( (int[]) entry.getValue() );
-                    // stream these out in the loop.
-                    oos.writeObject( descriptor );
-                }
-            }
-            finally
-            {
-                oos.flush();
-                oos.close();
-            }
-
-            if ( log.isInfoEnabled() )
-            {
-                log.info( logCacheName + "Finished saving keys. It took " + timer.getElapsedTimeString() + " to store "
-                    + numKeys + " keys.  Key file length [" + keyFile.length() + "]" );
-            }
-        }
-        catch ( Exception e )
-        {
-            log.error( logCacheName + "Problem storing keys.", e );
-        }
-    }
-
-    /**
-     * Resets the file and creates a new key map.
-     */
-    protected void reset()
-    {
-        File keyFileTemp = new File( this.rootDirectory, fileName + ".key" );
-        keyFileTemp.delete();
-
-        keyFile = new File( this.rootDirectory, fileName + ".key" );
-
-        initKeyMap();
-    }
-
-    /**
-     * This is mainly used for testing. It leave the disk in tact, and just clears memory.
-     */
-    protected void clearMemoryMap()
-    {
-        this.keyHash.clear();
-    }
-
-    /**
-     * Create the map for keys that contain the index position on disk.
-     */
-    private void initKeyMap()
-    {
-        keyHash = null;
-        if ( maxKeySize >= 0 )
-        {
-            keyHash = new LRUMap( maxKeySize );
-            if ( log.isInfoEnabled() )
-            {
-                log.info( logCacheName + "Set maxKeySize to: '" + maxKeySize + "'" );
-            }
-        }
-        else
-        {
-            // If no max size, use a plain map for memory and processing efficiency.
-            keyHash = new HashMap();
-            // keyHash = Collections.synchronizedMap( new HashMap() );
-            if ( log.isInfoEnabled() )
-            {
-                log.info( logCacheName + "Set maxKeySize to unlimited'" );
-            }
-        }
-    }
-
-    /**
-     * Loads the keys from the .key file. The keys are stored individually on disk. They are added
-     * one by one to an LRUMap..
-     * <p>
-     * @throws InterruptedException
-     */
-    protected void loadKeys()
-        throws InterruptedException
-    {
-        if ( log.isInfoEnabled() )
-        {
-            log.info( logCacheName + "Loading keys for " + keyFile.toString() );
-        }
-
-        try
-        {
-            // create a key map to use.
-            initKeyMap();
-
-            HashMap keys = new HashMap();
-
-            FileInputStream fis = new FileInputStream( keyFile );
-            BufferedInputStream bis = new BufferedInputStream( fis );
-            ObjectInputStream ois = new ObjectInputStream( bis );
-            try
-            {
-                while ( true )
-                {
-                    BlockDiskElementDescriptor descriptor = (BlockDiskElementDescriptor) ois.readObject();
-                    if ( descriptor != null )
-                    {
-                        keys.put( descriptor.getKey(), descriptor.getBlocks() );
-                    }
-                }
-            }
-            catch ( EOFException eof )
-            {
-                // nothing
-            }
-            finally
-            {
-                ois.close();
-            }
-
-            if ( !keys.isEmpty() )
-            {
-                if ( log.isDebugEnabled() )
-                {
-                    log.debug( logCacheName + "Found " + keys.size() + " in keys file." );
-                }
-
-                keyHash.putAll( keys );
-
-                if ( log.isInfoEnabled() )
-                {
-                    log.info( logCacheName + "Loaded keys from [" + fileName + "], key count: " + keyHash.size()
-                        + "; up to " + maxKeySize + " will be available." );
-                }
-            }
-        }
-        catch ( Exception e )
-        {
-            log.error( logCacheName + "Problem loading keys for file " + fileName, e );
-        }
-    }
-
-    /**
-     * Gets the entry set.
-     * <p>
-     * @return entry set.
-     */
-    public Set entrySet()
-    {
-        return this.keyHash.entrySet();
-    }
-
-    /**
-     * Gets the key set.
-     * <p>
-     * @return key set.
-     */
-    public Set keySet()
-    {
-        return this.keyHash.keySet();
-    }
-
-    /**
-     * Gets the size of the key hash.
-     * <p>
-     * @return the number of keys.
-     */
-    public int size()
-    {
-        return this.keyHash.size();
-    }
-
-    /**
-     * gets the object for the key.
-     * <p>
-     * @param key
-     * @return Object
-     */
-    public int[] get( Object key )
-    {
-        return (int[]) this.keyHash.get( key );
-    }
-
-    /**
-     * Puts a int[] in the keyStore.
-     * <p>
-     * @param key
-     * @param value
-     */
-    public void put( Object key, int[] value )
-    {
-        this.keyHash.put( key, value );
-    }
-
-    /**
-     * Remove by key.
-     * <p>
-     * @param key
-     * @return BlockDiskElementDescriptor if it was present, else null
-     */
-    public int[] remove( Object key )
-    {
-        return (int[]) this.keyHash.remove( key );
-    }
-
-    /**
-     * Class for recylcing and lru. This implments the LRU overflow callback, so we can mark the
-     * blocks as free.
-     */
-    public class LRUMap
-        extends LRUMapJCS
-    {
-        /** Don't change */
-        private static final long serialVersionUID = 4955079991472142198L;
-
-        /**
-         * <code>tag</code> tells us which map we are working on.
-         */
-        public String tag = "orig";
-
-        /**
-         * Default
-         */
-        public LRUMap()
-        {
-            super();
-        }
-
-        /**
-         * @param maxKeySize
-         */
-        public LRUMap( int maxKeySize )
-        {
-            super( maxKeySize );
-        }
-
-        /**
-         * This is called when the may key size is reaced. The least recently used item will be
-         * passed here. We will store the position and size of the spot on disk in the recycle bin.
-         * <p>
-         * @param key 
-         * @param value 
-         */
-        protected void processRemovedLRU( Object key, Object value )
-        {
-            blockDiskCache.freeBlocks( (int[]) value );
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( logCacheName + "Removing key: [" + key + "] from key store." );
-                log.debug( logCacheName + "Key store size: [" + this.size() + "]." );
-            }
-        }
-    }
-
-    /**
-     * Allows us to set the daemon status on the clockdaemon
-     * @author aaronsm
-     */
-    class MyThreadFactory
-        implements ThreadFactory
-    {
-
-        /**
-         * Ensures that we create daemon threads.
-         * <p>
-         * (non-Javadoc)
-         * @see EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
-         */
-        public Thread newThread( Runnable runner )
-        {
-            Thread t = new Thread( runner );
-            t.setDaemon( true );
-            t.setPriority( Thread.MIN_PRIORITY );
-            return t;
-        }
-    }
-}
+package org.apache.jcs.auxiliary.disk.block;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jcs.auxiliary.disk.LRUMapJCS;
+import org.apache.jcs.utils.timing.ElapsedTimer;
+
+import EDU.oswego.cs.dl.util.concurrent.ClockDaemon;
+import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
+
+/**
+ * This is responsible for storing the keys.
+ * <p>
+ * @author Aaron Smuts
+ */
+public class BlockDiskKeyStore
+{
+    /** The logger */
+    private static final Log log = LogFactory.getLog( BlockDiskKeyStore.class );
+
+    /** Attributes governing the behavior of the block disk cache. */
+    private BlockDiskCacheAttributes blockDiskCacheAttributes;
+
+    /** The key to block map */
+    private Map keyHash;
+
+    /** The file where we persist the keys */
+    private File keyFile;
+
+    /** The name to prefix log messages with. */
+    private final String logCacheName;
+
+    /** Name of the file where we persist the keys */
+    private String fileName;
+
+    /** The maximum number of keys to store in memory */
+    private int maxKeySize;
+
+    /** we need this so we can communicate free blocks to the data store when keys fall off the LRU */
+    private BlockDiskCache blockDiskCache;
+
+    /** The root directory in which the keyFile lives */
+    private File rootDirectory;
+
+    /**
+     * The background key persister, one for all regions.
+     */
+    private static ClockDaemon persistenceDaemon;
+
+    /**
+     * Set the configuration options.
+     * <p>
+     * @param cacheAttributes
+     * @param blockDiskCache used for freeing
+     * @throws Exception
+     */
+    public BlockDiskKeyStore( BlockDiskCacheAttributes cacheAttributes, BlockDiskCache blockDiskCache )
+        throws Exception
+    {
+        this.blockDiskCacheAttributes = cacheAttributes;
+        this.logCacheName = "Region [" + this.blockDiskCacheAttributes.getCacheName() + "] ";
+        this.fileName = this.blockDiskCacheAttributes.getCacheName();
+        this.maxKeySize = cacheAttributes.getMaxKeySize();
+        this.blockDiskCache = blockDiskCache;
+
+        String rootDirName = cacheAttributes.getDiskPath();
+        this.rootDirectory = new File( rootDirName );
+        this.rootDirectory.mkdirs();
+
+        if ( log.isInfoEnabled() )
+        {
+            log.info( logCacheName + "Cache file root directory [" + rootDirName + "]" );
+        }
+
+        this.keyFile = new File( rootDirectory, fileName + ".key" );
+
+        if ( log.isInfoEnabled() )
+        {
+            log.info( logCacheName + "Key File [" + this.keyFile.getAbsolutePath() + "]" );
+        }
+
+        if ( keyFile.length() > 0 )
+        {
+            loadKeys();
+            // TODO verify somehow
+        }
+        else
+        {
+            initKeyMap();
+        }
+
+        // add this region to the persistence thread.
+        // TODO we might need to stagger this a bit.
+        if ( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() > 0 )
+        {
+            if ( persistenceDaemon == null )
+            {
+                persistenceDaemon = new ClockDaemon();
+                persistenceDaemon.setThreadFactory( new MyThreadFactory() );
+            }
+            persistenceDaemon
+                .executePeriodically( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() * 1000,
+                                      new Runnable()
+                                      {
+                                          public void run()
+                                          {
+                                              saveKeys();
+                                          }
+                                      }, false );
+        }
+    }
+
+    /**
+     * Saves key file to disk. This gets the LRUMap entry set and write the entries out one by one
+     * after putting them in a wrapper.
+     */
+    protected void saveKeys()
+    {
+        try
+        {
+            ElapsedTimer timer = new ElapsedTimer();
+            int numKeys = keyHash.size();
+            if ( log.isInfoEnabled() )
+            {
+                log.info( logCacheName + "Saving keys to [" + this.keyFile.getAbsolutePath() + "], key count ["
+                    + numKeys + "]" );
+            }
+
+            keyFile.delete();
+
+            keyFile = new File( rootDirectory, fileName + ".key" );
+            FileOutputStream fos = new FileOutputStream( keyFile );
+            BufferedOutputStream bos = new BufferedOutputStream( fos, 1024 );
+            ObjectOutputStream oos = new ObjectOutputStream( bos );
+            try
+            {
+                // don't need to synchronize, since the underlying collection makes a copy
+                Iterator keyIt = keyHash.entrySet().iterator();
+                while ( keyIt.hasNext() )
+                {
+                    Map.Entry entry = (Map.Entry) keyIt.next();
+                    BlockDiskElementDescriptor descriptor = new BlockDiskElementDescriptor();
+                    descriptor.setKey( (Serializable) entry.getKey() );
+                    descriptor.setBlocks( (int[]) entry.getValue() );
+                    // stream these out in the loop.
+                    oos.writeObject( descriptor );
+                }
+            }
+            finally
+            {
+                oos.flush();
+                oos.close();
+            }
+
+            if ( log.isInfoEnabled() )
+            {
+                log.info( logCacheName + "Finished saving keys. It took " + timer.getElapsedTimeString() + " to store "
+                    + numKeys + " keys.  Key file length [" + keyFile.length() + "]" );
+            }
+        }
+        catch ( Exception e )
+        {
+            log.error( logCacheName + "Problem storing keys.", e );
+        }
+    }
+
+    /**
+     * Resets the file and creates a new key map.
+     */
+    protected void reset()
+    {
+        File keyFileTemp = new File( this.rootDirectory, fileName + ".key" );
+        keyFileTemp.delete();
+
+        keyFile = new File( this.rootDirectory, fileName + ".key" );
+
+        initKeyMap();
+    }
+
+    /**
+     * This is mainly used for testing. It leave the disk in tact, and just clears memory.
+     */
+    protected void clearMemoryMap()
+    {
+        this.keyHash.clear();
+    }
+
+    /**
+     * Create the map for keys that contain the index position on disk.
+     */
+    private void initKeyMap()
+    {
+        keyHash = null;
+        if ( maxKeySize >= 0 )
+        {
+            keyHash = new LRUMap( maxKeySize );
+            if ( log.isInfoEnabled() )
+            {
+                log.info( logCacheName + "Set maxKeySize to: '" + maxKeySize + "'" );
+            }
+        }
+        else
+        {
+            // If no max size, use a plain map for memory and processing efficiency.
+            keyHash = new HashMap();
+            // keyHash = Collections.synchronizedMap( new HashMap() );
+            if ( log.isInfoEnabled() )
+            {
+                log.info( logCacheName + "Set maxKeySize to unlimited'" );
+            }
+        }
+    }
+
+    /**
+     * Loads the keys from the .key file. The keys are stored individually on disk. They are added
+     * one by one to an LRUMap..
+     * <p>
+     * @throws InterruptedException
+     */
+    protected void loadKeys()
+        throws InterruptedException
+    {
+        if ( log.isInfoEnabled() )
+        {
+            log.info( logCacheName + "Loading keys for " + keyFile.toString() );
+        }
+
+        try
+        {
+            // create a key map to use.
+            initKeyMap();
+
+            HashMap keys = new HashMap();
+
+            FileInputStream fis = new FileInputStream( keyFile );
+            BufferedInputStream bis = new BufferedInputStream( fis );
+            ObjectInputStream ois = new ObjectInputStream( bis );
+            try
+            {
+                while ( true )
+                {
+                    BlockDiskElementDescriptor descriptor = (BlockDiskElementDescriptor) ois.readObject();
+                    if ( descriptor != null )
+                    {
+                        keys.put( descriptor.getKey(), descriptor.getBlocks() );
+                    }
+                }
+            }
+            catch ( EOFException eof )
+            {
+                // nothing
+            }
+            finally
+            {
+                ois.close();
+            }
+
+            if ( !keys.isEmpty() )
+            {
+                if ( log.isDebugEnabled() )
+                {
+                    log.debug( logCacheName + "Found " + keys.size() + " in keys file." );
+                }
+
+                keyHash.putAll( keys );
+
+                if ( log.isInfoEnabled() )
+                {
+                    log.info( logCacheName + "Loaded keys from [" + fileName + "], key count: " + keyHash.size()
+                        + "; up to " + maxKeySize + " will be available." );
+                }
+            }
+        }
+        catch ( Exception e )
+        {
+            log.error( logCacheName + "Problem loading keys for file " + fileName, e );
+        }
+    }
+
+    /**
+     * Gets the entry set.
+     * <p>
+     * @return entry set.
+     */
+    public Set entrySet()
+    {
+        return this.keyHash.entrySet();
+    }
+
+    /**
+     * Gets the key set.
+     * <p>
+     * @return key set.
+     */
+    public Set keySet()
+    {
+        return this.keyHash.keySet();
+    }
+
+    /**
+     * Gets the size of the key hash.
+     * <p>
+     * @return the number of keys.
+     */
+    public int size()
+    {
+        return this.keyHash.size();
+    }
+
+    /**
+     * gets the object for the key.
+     * <p>
+     * @param key
+     * @return Object
+     */
+    public int[] get( Object key )
+    {
+        return (int[]) this.keyHash.get( key );
+    }
+
+    /**
+     * Puts a int[] in the keyStore.
+     * <p>
+     * @param key
+     * @param value
+     */
+    public void put( Object key, int[] value )
+    {
+        this.keyHash.put( key, value );
+    }
+
+    /**
+     * Remove by key.
+     * <p>
+     * @param key
+     * @return BlockDiskElementDescriptor if it was present, else null
+     */
+    public int[] remove( Object key )
+    {
+        return (int[]) this.keyHash.remove( key );
+    }
+
+    /**
+     * Class for recylcing and lru. This implments the LRU overflow callback, so we can mark the
+     * blocks as free.
+     */
+    public class LRUMap
+        extends LRUMapJCS
+    {
+        /** Don't change */
+        private static final long serialVersionUID = 4955079991472142198L;
+
+        /**
+         * <code>tag</code> tells us which map we are working on.
+         */
+        public String tag = "orig";
+
+        /**
+         * Default
+         */
+        public LRUMap()
+        {
+            super();
+        }
+
+        /**
+         * @param maxKeySize
+         */
+        public LRUMap( int maxKeySize )
+        {
+            super( maxKeySize );
+        }
+
+        /**
+         * This is called when the may key size is reaced. The least recently used item will be
+         * passed here. We will store the position and size of the spot on disk in the recycle bin.
+         * <p>
+         * @param key
+         * @param value
+         */
+        protected void processRemovedLRU( Object key, Object value )
+        {
+            blockDiskCache.freeBlocks( (int[]) value );
+            if ( log.isDebugEnabled() )
+            {
+                log.debug( logCacheName + "Removing key: [" + key + "] from key store." );
+                log.debug( logCacheName + "Key store size: [" + this.size() + "]." );
+            }
+        }
+    }
+
+    /**
+     * Allows us to set the daemon status on the clockdaemon
+     * @author aaronsm
+     */
+    class MyThreadFactory
+        implements ThreadFactory
+    {
+
+        /**
+         * Ensures that we create daemon threads.
+         * <p>
+         * (non-Javadoc)
+         * @see EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+         */
+        public Thread newThread( Runnable runner )
+        {
+            Thread t = new Thread( runner );
+            t.setDaemon( true );
+            t.setPriority( Thread.MIN_PRIORITY );
+            return t;
+        }
+    }
+}

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java Thu May 10 09:03:42 2007
@@ -1,12 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache License, Version
- * 2.0 (the "License") you may not use this file except in compliance with the License. You may
- * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
- * applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
- * the License for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import java.io.File;

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java Thu May 10 09:03:42 2007
@@ -1,12 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache License, Version
- * 2.0 (the "License") you may not use this file except in compliance with the License. You may
- * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
- * applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
- * the License for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import java.io.File;
@@ -638,7 +648,7 @@
             log.error( logCacheName + "No longer alive so returning false for key = " + key );
             return false;
         }
-        
+
         if ( key == null )
         {
             return false;
@@ -777,7 +787,7 @@
      * <p>
      * This operates under a lock obtained in doRemove().
      * <p>
-     * @param key 
+     * @param key
      * @return true if an item was removed.
      */
     private boolean performSingleKeyRemoval( Serializable key )

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheAttributes.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheAttributes.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheAttributes.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheAttributes.java Thu May 10 09:03:42 2007
@@ -1,14 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache
- * License, Version 2.0 (the "License") you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import org.apache.jcs.auxiliary.AuxiliaryCacheAttributes;
@@ -40,9 +48,9 @@
 
     /** Should we optimize on shutdown. */
     public static final boolean DEFAULT_OPTIMIZE_ON_SHUTDOWN = true;
-    
+
     private boolean optimizeOnShutdown = DEFAULT_OPTIMIZE_ON_SHUTDOWN;
-    
+
     /**
      * Constructor for the DiskCacheAttributes object
      */

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheFactory.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheFactory.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheFactory.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheFactory.java Thu May 10 09:03:42 2007
@@ -1,14 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache
- * License, Version 2.0 (the "License") you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import org.apache.commons.logging.Log;

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheManager.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheManager.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheManager.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheManager.java Thu May 10 09:03:42 2007
@@ -1,14 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache
- * License, Version 2.0 (the "License") you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import java.util.Enumeration;

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskDumper.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskDumper.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskDumper.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskDumper.java Thu May 10 09:03:42 2007
@@ -1,14 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache
- * License, Version 2.0 (the "License") you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 /**

Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskElementDescriptor.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskElementDescriptor.java?view=diff&rev=536904&r1=536903&r2=536904
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskElementDescriptor.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskElementDescriptor.java Thu May 10 09:03:42 2007
@@ -1,12 +1,22 @@
 package org.apache.jcs.auxiliary.disk.indexed;
 
 /*
- * Copyright 2001-2004 The Apache Software Foundation. Licensed under the Apache License, Version
- * 2.0 (the "License") you may not use this file except in compliance with the License. You may
- * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
- * applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
- * the License for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
 import java.io.Serializable;



---------------------------------------------------------------------
To unsubscribe, e-mail: jcs-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jcs-dev-help@jakarta.apache.org