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...

[email protected]
Newsgroups gmane.comp.jakarta.turbine.jcs.devel
Message-ID <[email protected]>
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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.