Author: cbegin
Date: Fri Sep  5 12:41:29 2008
New Revision: 692516

URL: http://svn.apache.org/viewvc?rev=692516&view=rev
Log:
Made LRU and FIFO decorators.

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
      - copied, changed from r692465, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
Removed:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
 Fri Sep  5 12:41:29 2008
@@ -5,8 +5,8 @@
 import com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig;
 import com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig;
 import com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig;
-import org.apache.ibatis.cache.impl.*;
-import org.apache.ibatis.cache.decorators.WeakCache;
+import org.apache.ibatis.cache.decorators.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
 import org.apache.ibatis.mapping.Configuration;
 
 import javax.sql.DataSource;
@@ -43,9 +43,9 @@
     this.getTypeAliasRegistry().registerAlias("JNDI", 
JndiDataSourceFactory.class.getName());
 
     // CACHE ALIASES
-    this.getTypeAliasRegistry().registerAlias("FIFO", 
FifoCache.class.getName());
-    this.getTypeAliasRegistry().registerAlias("LRU", LruCache.class.getName());
-    this.getTypeAliasRegistry().registerAlias("MEMORY", 
LruCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("FIFO", 
PerpetualCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("LRU", 
PerpetualCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("MEMORY", 
PerpetualCache.class.getName());
   }
 
   public TransactionManager getTransactionManager() {

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
 (from r692465, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java&r1=692465&r2=692516&rev=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
 Fri Sep  5 12:41:29 2008
@@ -1,51 +1,68 @@
-package org.apache.ibatis.cache.impl;
+package org.apache.ibatis.cache.decorators;
 
-import org.apache.ibatis.cache.impl.BaseCache;
+import org.apache.ibatis.cache.Cache;
 
 import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
 
 /**
- * FIFO (first in, first out) cache controller implementation
+ * FIFO (first in, first out) cache decorator
  */
-public class FifoCache extends BaseCache {
+public class FifoCache implements Cache {
 
-  private int size = 1024;
-  private Map cache = new HashMap();
-  private List keyList = new LinkedList();
+  private final Cache delegate;
+  private final int size;
+  private final LinkedList keyList = new LinkedList();
 
-  public int getSize() {
-    return size;
+  public FifoCache(Cache delegate) {
+    this(delegate,1024);
   }
 
-  public void setSize(int size) {
+  public FifoCache(Cache delegate, int size) {
+    this.delegate = delegate;
     this.size = size;
   }
 
+  public String getId() {
+    return delegate.getId();
+  }
+
+  public int getSize() {
+    return delegate.getSize();
+  }
+
   public void putObject(Object key, Object value) {
-    cache.put(key, value);
-    keyList.add(key);
-    if (keyList.size() > size) {
-      Object oldestKey = keyList.remove(0);
-      cache.remove(oldestKey);
-    }
+    cycleKeyList(key);
+    delegate.putObject(key, value);
   }
 
   public Object getObject(Object key) {
-    return cache.get(key);
+    return delegate.getObject(key);
   }
 
   public boolean hasKey(Object key) {
-    return cache.containsKey(key);
+    return delegate.hasKey(key);
   }
 
   public Object removeObject(Object key) {
-    keyList.remove(key);
-    return cache.remove(key);
+    return delegate.removeObject(key);
   }
 
   public void clear() {
-    cache.clear();
+    delegate.clear();
     keyList.clear();
   }
 
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  private void cycleKeyList(Object key) {
+    keyList.addLast(key);
+    if (keyList.size() > size) {
+      Object oldestKey = keyList.removeFirst();
+      delegate.removeObject(oldestKey);
+    }
+  }
+
 }

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java?rev=692516&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
 Fri Sep  5 12:41:29 2008
@@ -0,0 +1,80 @@
+package org.apache.ibatis.cache.decorators;
+
+import org.apache.ibatis.cache.Cache;
+
+import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
+
+/**
+ * Lru (first in, first out) cache decorator
+ */
+public class LruCache implements Cache {
+
+  private final Cache delegate;
+
+  private final Map keyMap;
+
+  private Object eldestKey;
+
+  public LruCache(Cache delegate) {
+    this(delegate, 1024);
+  }
+
+  public LruCache(Cache delegate, final int size) {
+    this.delegate = delegate;
+    keyMap = new LinkedHashMap(size, .75F, true) {
+      protected boolean removeEldestEntry(Map.Entry eldest) {
+        eldestKey = eldest.getKey();
+        return size() > size;
+      }
+    };
+  }
+
+  public String getId() {
+    return delegate.getId();
+  }
+
+  public int getSize() {
+    return delegate.getSize();
+  }
+
+  public void putObject(Object key, Object value) {
+    cycleKeyList(key);
+    delegate.putObject(key, value);
+  }
+
+  public Object getObject(Object key) {
+    try {
+      return delegate.getObject(key);
+    } finally {
+      cycleKeyList(key);
+    }
+  }
+
+  public boolean hasKey(Object key) {
+    return delegate.hasKey(key);
+  }
+
+  public Object removeObject(Object key) {
+    return delegate.removeObject(key);
+  }
+
+  public void clear() {
+    delegate.clear();
+    keyMap.clear();
+  }
+
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  private void cycleKeyList(Object key) {
+    keyMap.put(key,key);
+    if (eldestKey != null) {
+      delegate.removeObject(eldestKey);
+      eldestKey = null;
+    }
+  }
+
+}
+

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
 Fri Sep  5 12:41:29 2008
@@ -1,6 +1,5 @@
 package org.apache.ibatis.cache.decorators;
 
-import org.apache.ibatis.cache.impl.BaseCache;
 import org.apache.ibatis.cache.Cache;
 
 import java.util.*;
@@ -11,7 +10,7 @@
  * Weak Reference cache decorator
  * Thanks to Dr. Heinz Kabutz for his guidance here.
  */
-public class WeakCache extends BaseCache {
+public class WeakCache implements Cache {
   private final int numberOfHardLinks;
   private final LinkedList hardLinksToAvoidGarbageCollection = new 
LinkedList();
   private final ReferenceQueue queueOfGarbageCollectedEntries = new 
ReferenceQueue();

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
 Fri Sep  5 12:41:29 2008
@@ -1,13 +1,27 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.impl.BaseCache;
+
+import org.apache.ibatis.cache.*;
 
 import java.util.*;
+import java.util.concurrent.locks.*;
+
+public class PerpetualCache implements Cache {
 
-public class PerpetualCache extends BaseCache {
+  private String id;
 
   private Map cache = new HashMap();
 
+  private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
   public int getSize() {
     return cache.size();
   }
@@ -32,4 +46,23 @@
     cache.clear();
   }
 
+
+  public ReadWriteLock getReadWriteLock() {
+    return readWriteLock;
+  }
+
+  public boolean equals(Object o) {
+    if (getId() == null) throw new CacheException("Cache instances require an 
ID.");
+    if (this == o) return true;
+    if (!(o instanceof Cache)) return false;
+
+    Cache otherCache = (Cache) o;
+    return getId().equals(otherCache.getId());
+  }
+
+  public int hashCode() {
+    if (getId() == null) throw new CacheException("Cache instances require an 
ID.");
+    return getId().hashCode();
+  }
+
 }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
 Fri Sep  5 12:41:29 2008
@@ -1,14 +1,14 @@
 package org.apache.ibatis.cache;
 
-import org.apache.ibatis.cache.impl.FifoCache;
+import org.apache.ibatis.cache.decorators.FifoCache;
+import org.apache.ibatis.cache.impl.PerpetualCache;
 import org.junit.*;
 
 public class FifoCacheTest {
 
   @Test
   public void shouldRemoveFirstItemInBeyondFiveEntries() {
-    FifoCache cache = new FifoCache();
-    cache.setSize(5);
+    FifoCache cache = new FifoCache(new PerpetualCache(),5);
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }
@@ -20,7 +20,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new FifoCache();
+    FifoCache cache = new FifoCache(new PerpetualCache());
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -29,7 +29,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new FifoCache();
+    FifoCache cache = new FifoCache(new PerpetualCache());
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
 Fri Sep  5 12:41:29 2008
@@ -1,14 +1,14 @@
 package org.apache.ibatis.cache;
 
-import org.apache.ibatis.cache.impl.LruCache;
+import org.apache.ibatis.cache.decorators.LruCache;
+import org.apache.ibatis.cache.impl.PerpetualCache;
 import org.junit.*;
 
 public class LruCacheTest {
 
   @Test
   public void shouldRemoveLeastRecentlyUsedItemInBeyondFiveEntries() {
-    LruCache cache = new LruCache();
-    cache.setSize(5);
+    LruCache cache = new LruCache(new PerpetualCache(),5);
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }
@@ -20,7 +20,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new LruCache();
+    Cache cache = new LruCache(new PerpetualCache());
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -29,7 +29,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new LruCache();
+    Cache cache = new LruCache(new PerpetualCache());
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java?rev=692516&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
 Fri Sep  5 12:41:29 2008
@@ -0,0 +1,27 @@
+package org.apache.ibatis.cache;
+
+import org.junit.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
+import org.apache.ibatis.cache.decorators.*;
+
+public class SuperCacheTest {
+
+  @Test
+  public void 
shouldDemonstrate5LevelSuperCacheHandlesLotsOfEntriesWithoutCrashing() {
+    final int N = 1000000;
+    Cache cache = new PerpetualCache();
+    cache = new LruCache(cache,500000);
+    cache = new FifoCache(cache,500000);
+    cache = new SoftCache(cache);
+    cache = new WeakCache(cache);
+    for (int i = 0; i < N; i++) {
+      cache.putObject(i, i);
+      Object o = cache.getObject(i);
+      Assert.assertTrue(o == null || i == ((Integer) o));
+    }
+    System.out.println(cache.getSize());
+    Assert.assertTrue(cache.getSize() < N);
+  }
+
+
+}


Reply via email to