Author: cbegin
Date: Sat Sep  6 22:37:09 2008
New Revision: 692775

URL: http://svn.apache.org/viewvc?rev=692775&view=rev
Log:
moved CacheBuilder to mapping package and improved handling for custom cache 
implementations.

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/CacheBuilder.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-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/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/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.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/main/java/org/apache/ibatis/executor/BaseExecutor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/BaseCacheTest.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
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/PerpetualCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/ScheduledCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SoftCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.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=692775&r1=692774&r2=692775&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
 Sat Sep  6 22:37:09 2008
@@ -43,9 +43,9 @@
     this.getTypeAliasRegistry().registerAlias("JNDI", 
JndiDataSourceFactory.class.getName());
 
     // CACHE ALIASES
-    this.getTypeAliasRegistry().registerAlias("FIFO", 
PerpetualCache.class.getName());
-    this.getTypeAliasRegistry().registerAlias("LRU", 
PerpetualCache.class.getName());
-    this.getTypeAliasRegistry().registerAlias("MEMORY", 
PerpetualCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("FIFO", 
FifoCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("LRU", LruCache.class.getName());
+    this.getTypeAliasRegistry().registerAlias("MEMORY", 
SoftCache.class.getName());
   }
 
   public TransactionManager getTransactionManager() {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapParser.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapParser.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapParser.java
 Sat Sep  6 22:37:09 2008
@@ -19,7 +19,7 @@
   private Reader reader;
   private NodeletParser parser;
 
-  private Cache.Builder cacheBuilder;
+  private CacheBuilder cacheBuilder;
   private List<String> flushCacheStatements;
 
   private ResultMap.Builder resultMapBuilder;
@@ -82,7 +82,8 @@
     Boolean serialize = context.getBooleanAttribute("serialize", true);
     type = config.getTypeAliasRegistry().resolveAlias(type);
     Class clazz = Resources.classForName(type);
-    cacheBuilder = new Cache.Builder(id, clazz);
+    cacheBuilder = new CacheBuilder(id);
+    cacheBuilder.addDecorator(clazz);
 
     //LOCAL_READ_WRITE (serializable=false, readOnly=false)
     //SHARED_READ_ONLY (serializable=false, readOnly=true)

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
 Sat Sep  6 22:37:09 2008
@@ -1,8 +1,5 @@
 package org.apache.ibatis.cache;
 
-import org.apache.ibatis.cache.decorators.*;
-import org.apache.ibatis.reflection.MetaObject;
-
 import java.util.concurrent.locks.ReadWriteLock;
 
 public interface Cache {
@@ -23,57 +20,4 @@
 
   ReadWriteLock getReadWriteLock();
 
-  public class Builder {
-    private String id;
-    private Class implementation;
-    private Integer size;
-    private Long clearInterval;
-    private boolean readWrite;
-
-    public Builder(String id, Class implementation) {
-      this.id = id;
-      this.implementation = implementation;
-    }
-
-    public Builder size(Integer size) {
-      this.size = size;
-      return this;
-    }
-
-    public Builder clearInterval(Long clearInterval) {
-      this.clearInterval = clearInterval;
-      return this;
-    }
-
-    public Builder readWrite(boolean readWrite) {
-      this.readWrite = readWrite;
-      return this;
-    }
-
-    public Cache build() {
-      try {
-        // implementation...
-        Cache cache = (Cache) implementation.newInstance();
-        MetaObject metaCache = MetaObject.forObject(cache);
-        metaCache.setValue("id", id);
-        if (size != null && metaCache.hasSetter("size")) {
-          metaCache.setValue("size", size);
-        }
-        // decorators...
-        if (clearInterval != null) {
-          cache = new ScheduledCache(cache);
-          ((ScheduledCache) cache).setClearInterval(clearInterval);
-        }
-        if (readWrite) {
-          cache = new SerializedCache(cache);
-        }
-        cache = new LoggingCache(cache);
-        cache = new SynchronizedCache(cache);
-        return cache;
-      } catch (Exception e) {
-        throw new CacheException("Error building Cache class.  Cause: " + e, 
e);
-      }
-    }
-  }
-
 }
\ No newline at end of file

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/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?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
 Sat Sep  6 22:37:09 2008
@@ -11,16 +11,13 @@
 public class FifoCache implements Cache {
 
   private final Cache delegate;
-  private final int size;
-  private final LinkedList keyList = new LinkedList();
+  private final LinkedList keyList;
+  private int size;
 
   public FifoCache(Cache delegate) {
-    this(delegate,1024);
-  }
-
-  public FifoCache(Cache delegate, int size) {
     this.delegate = delegate;
-    this.size = size;
+    this.keyList = new LinkedList();
+    this.size = 1024;
   }
 
   public String getId() {
@@ -31,6 +28,10 @@
     return delegate.getSize();
   }
 
+  public void setSize(int size) {
+    this.size = size;
+  }
+
   public void putObject(Object key, Object value) {
     cycleKeyList(key);
     delegate.putObject(key, value);

Modified: 
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=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
 Sat Sep  6 22:37:09 2008
@@ -11,23 +11,12 @@
 public class LruCache implements Cache {
 
   private final Cache delegate;
-
-  private final Map keyMap;
-
+  private 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;
-      }
-    };
+    setSize(1024);
   }
 
   public String getId() {
@@ -38,17 +27,27 @@
     return delegate.getSize();
   }
 
+  public void setSize(final int size) {
+    keyMap = new LinkedHashMap(size, .75F, true) {
+      protected boolean removeEldestEntry(Map.Entry eldest) {
+        boolean tooBig = size() > size;
+        if (tooBig) {
+          eldestKey = eldest.getKey();
+        }
+        return tooBig;
+      }
+    };
+  }
+
   public void putObject(Object key, Object value) {
-    cycleKeyList(key);
     delegate.putObject(key, value);
+    cycleKeyList(key);
   }
 
   public Object getObject(Object key) {
-    try {
-      return delegate.getObject(key);
-    } finally {
-      cycleKeyList(key);
-    }
+    keyMap.get(key); //touch
+    return delegate.getObject(key);
+
   }
 
   public boolean hasKey(Object key) {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
 Sat Sep  6 22:37:09 2008
@@ -7,20 +7,13 @@
 public class ScheduledCache implements Cache {
 
   private Cache delegate;
-  protected long clearInterval = 60 * 60 * 1000; // 1 hour
-  protected long lastClear = System.currentTimeMillis();
+  protected long clearInterval;
+  protected long lastClear;
 
   public ScheduledCache(Cache delegate) {
     this.delegate = delegate;
-  }
-
-  public ScheduledCache(Cache delegate, int clearInterval) {
-    this.delegate = delegate;
-    this.clearInterval = clearInterval;
-  }
-
-  public long getClearInterval() {
-    return clearInterval;
+    this.clearInterval = 60 * 60 * 1000; // 1 hour
+    this.lastClear = System.currentTimeMillis();
   }
 
   public void setClearInterval(long clearInterval) {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java
 Sat Sep  6 22:37:09 2008
@@ -11,18 +11,16 @@
  * Thanks to Dr. Heinz Kabutz for his guidance here.
  */
 public class SoftCache implements Cache {
-  private final int numberOfHardLinks;
-  private final LinkedList hardLinksToAvoidGarbageCollection = new 
LinkedList();
-  private final ReferenceQueue queueOfGarbageCollectedEntries = new 
ReferenceQueue();
+  private final LinkedList hardLinksToAvoidGarbageCollection;
+  private final ReferenceQueue queueOfGarbageCollectedEntries;
   private final Cache delegate;
+  private int numberOfHardLinks;
 
   public SoftCache(Cache delegate) {
-    this(delegate,256);
-  }
-
-  public SoftCache(Cache delegate, int numberOfHardLinks) {
     this.delegate = delegate;
-    this.numberOfHardLinks = numberOfHardLinks;
+    this.numberOfHardLinks = 256;
+    this.hardLinksToAvoidGarbageCollection = new LinkedList();
+    this.queueOfGarbageCollectedEntries = new ReferenceQueue();
   }
 
   public String getId() {
@@ -34,6 +32,10 @@
     return delegate.getSize();
   }
 
+  public void setSize(int size) {
+    this.numberOfHardLinks = size;
+  }
+
   public void putObject(Object key, Object value) {
     removeGarbageCollectedItems();
     delegate.putObject(key, new SoftEntry(key, value, 
queueOfGarbageCollectedEntries));

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=692775&r1=692774&r2=692775&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
 Sat Sep  6 22:37:09 2008
@@ -11,18 +11,16 @@
  * Thanks to Dr. Heinz Kabutz for his guidance here.
  */
 public class WeakCache implements Cache {
-  private final int numberOfHardLinks;
-  private final LinkedList hardLinksToAvoidGarbageCollection = new 
LinkedList();
-  private final ReferenceQueue queueOfGarbageCollectedEntries = new 
ReferenceQueue();
+  private final LinkedList hardLinksToAvoidGarbageCollection;
+  private final ReferenceQueue queueOfGarbageCollectedEntries;
   private final Cache delegate;
+  private int numberOfHardLinks;
 
   public WeakCache(Cache delegate) {
-    this(delegate,256);
-  }
-
-  public WeakCache(Cache delegate, int numberOfHardLinks) {
     this.delegate = delegate;
-    this.numberOfHardLinks = numberOfHardLinks;
+    this.numberOfHardLinks = 256;
+    this.hardLinksToAvoidGarbageCollection = new LinkedList();
+    this.queueOfGarbageCollectedEntries = new ReferenceQueue();
   }
 
   public String getId() {
@@ -34,6 +32,10 @@
     return delegate.getSize();
   }
 
+  public void setSize(int size) {
+    this.numberOfHardLinks = size;
+  }
+
   public void putObject(Object key, Object value) {
     removeGarbageCollectedItems();
     delegate.putObject(key, new WeakEntry(key, value, 
queueOfGarbageCollectedEntries));

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=692775&r1=692774&r2=692775&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
 Sat Sep  6 22:37:09 2008
@@ -14,12 +14,12 @@
 
   private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 
-  public String getId() {
-    return id;
+  public PerpetualCache(String id) {
+    this.id = id;
   }
 
-  public void setId(String id) {
-    this.id = id;
+  public String getId() {
+    return id;
   }
 
   public int getSize() {
@@ -46,7 +46,6 @@
     cache.clear();
   }
 
-
   public ReadWriteLock getReadWriteLock() {
     return readWriteLock;
   }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 Sat Sep  6 22:37:09 2008
@@ -33,7 +33,7 @@
       this.connection = connection;
     }
     this.deferredLoads = new ArrayList<DeferredLoad>();
-    this.localCache = new PerpetualCache();
+    this.localCache = new PerpetualCache("LocalCache");
   }
 
   public Connection getConnection() {

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/CacheBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/CacheBuilder.java?rev=692775&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/CacheBuilder.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/CacheBuilder.java
 Sat Sep  6 22:37:09 2008
@@ -0,0 +1,170 @@
+package org.apache.ibatis.mapping;
+
+import org.apache.ibatis.cache.*;
+import org.apache.ibatis.cache.decorators.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.lang.reflect.Constructor;
+import java.util.*;
+
+public class CacheBuilder {
+  private String id;
+  private Class<? extends Cache> implementation;
+  private List<Class<? extends Cache>> decorators;
+  private Integer size;
+  private Long clearInterval;
+  private boolean readWrite;
+  private Properties properties;
+
+  public CacheBuilder(String id) {
+    this.id = id;
+    this.decorators = new ArrayList<Class<? extends Cache>>();
+  }
+
+  public CacheBuilder implementation(Class<? extends Cache> implementation) {
+    this.implementation = implementation;
+    return this;
+  }
+
+  public CacheBuilder addDecorator(Class<? extends Cache> decorator) {
+    this.decorators.add(decorator);
+    return this;
+  }
+
+  public CacheBuilder size(Integer size) {
+    this.size = size;
+    return this;
+  }
+
+  public CacheBuilder clearInterval(Long clearInterval) {
+    this.clearInterval = clearInterval;
+    return this;
+  }
+
+  public CacheBuilder readWrite(boolean readWrite) {
+    this.readWrite = readWrite;
+    return this;
+  }
+
+  public CacheBuilder properties(Properties properties) {
+    this.properties = properties;
+    return this;
+  }
+
+  public Cache build() {
+    setDefaultImplementations();
+    Cache cache = newBaseCacheInstance(implementation, id);
+    setCacheProperties(cache);
+    for (Class<? extends Cache> decorator : decorators) {
+      cache = newCacheDecoratorInstance(decorator, cache);
+      setCacheProperties(cache);
+    }
+    cache = setStandardDecorators(cache);
+    return cache;
+  }
+
+  private void setDefaultImplementations() {
+    if (implementation == null) {
+      implementation = PerpetualCache.class;
+      if (decorators.size() == 0) {
+        decorators.add(FifoCache.class);
+      }
+    }
+  }
+
+  private Cache setStandardDecorators(Cache cache) {
+    try {
+      if (cache.getClass().getName().startsWith("org.apache.ibatis")) {
+        MetaObject metaCache = MetaObject.forObject(cache);
+        if (size != null && metaCache.hasSetter("size")) {
+          metaCache.setValue("size", size);
+        }
+        if (clearInterval != null) {
+          cache = new ScheduledCache(cache);
+          ((ScheduledCache) cache).setClearInterval(clearInterval);
+        }
+        if (readWrite) {
+          cache = new SerializedCache(cache);
+        }
+        cache = new LoggingCache(cache);
+        cache = new SynchronizedCache(cache);
+      }
+      return cache;
+    } catch (Exception e) {
+      throw new CacheException("Error building standard cache decorators.  
Cause: " + e, e);
+    }
+  }
+
+  private void setCacheProperties(Cache cache) {
+    if (properties != null) {
+      MetaObject metaCache = MetaObject.forObject(cache);
+      for (Map.Entry entry : properties.entrySet()) {
+        String name = (String) entry.getKey();
+        String value = (String) entry.getValue();
+        if (metaCache.hasSetter(name)) {
+          Class type = metaCache.getSetterType(name);
+          if (String.class == type) {
+            metaCache.setValue(name, value);
+          } else if (int.class == type
+              || Integer.class == type) {
+            metaCache.setValue(name, Integer.valueOf(value));
+          } else if (long.class == type
+              || Long.class == type) {
+            metaCache.setValue(name, Long.valueOf(value));
+          } else if (short.class == type
+              || Short.class == type) {
+            metaCache.setValue(name, Short.valueOf(value));
+          } else if (byte.class == type
+              || Byte.class == type) {
+            metaCache.setValue(name, Byte.valueOf(value));
+          } else if (float.class == type
+              || Float.class == type) {
+            metaCache.setValue(name, Float.valueOf(value));
+          } else if (double.class == type
+              || Double.class == type) {
+            metaCache.setValue(name, Double.valueOf(value));
+          } else {
+            throw new CacheException("Unsupported property type for cache: '" 
+ name + "' of type " + type);
+          }
+        }
+      }
+    }
+  }
+
+  private Cache newBaseCacheInstance(Class<? extends Cache> cacheClass, String 
id) {
+    Constructor<? extends Cache> cacheConstructor = 
getBaseCacheConstructor(cacheClass);
+    try {
+      return cacheConstructor.newInstance(id);
+    } catch (Exception e) {
+      throw new CacheException("Could not instantiate cache implementation (" 
+ cacheClass + "). Cause: " + e, e);
+    }
+  }
+
+  private Constructor<? extends Cache> getBaseCacheConstructor(Class<? extends 
Cache> cacheClass) {
+    try {
+      return cacheClass.getConstructor(String.class);
+    } catch (Exception e) {
+      throw new CacheException("Invalid base cache implementation (" + 
cacheClass + ").  " +
+          "Base cache implementations must have a constructor that takes a 
String id as a parameter.  Cause: " + e, e);
+    }
+  }
+
+  private Cache newCacheDecoratorInstance(Class<? extends Cache> cacheClass, 
Cache base) {
+    Constructor<? extends Cache> cacheConstructor = 
getCacheDecoratorConstructor(cacheClass);
+    try {
+      return cacheConstructor.newInstance(base);
+    } catch (Exception e) {
+      throw new CacheException("Could not instantiate cache decorator (" + 
cacheClass + "). Cause: " + e, e);
+    }
+  }
+
+  private Constructor<? extends Cache> getCacheDecoratorConstructor(Class<? 
extends Cache> cacheClass) {
+    try {
+      return cacheClass.getConstructor(Cache.class);
+    } catch (Exception e) {
+      throw new CacheException("Invalid cache decorator (" + cacheClass + ").  
" +
+          "Cache decorators must have a constructor that takes a Cache 
instance as a parameter.  Cause: " + e, e);
+    }
+  }
+}

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/BaseCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/BaseCacheTest.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/BaseCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/BaseCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -10,13 +10,12 @@
 
   @Test
   public void shouldDemonstrateEqualsAndHashCodeForVariousCacheTypes() {
-    PerpetualCache cache = new PerpetualCache();
-    cache.setId("test_cache");
+    PerpetualCache cache = new PerpetualCache("test_cache");
     Assert.assertTrue(cache.equals(cache));
     Assert.assertTrue(cache.equals(new SynchronizedCache(cache)));
     Assert.assertTrue(cache.equals(new SerializedCache(cache)));
     Assert.assertTrue(cache.equals(new LoggingCache(cache)));
-    Assert.assertTrue(cache.equals(new ScheduledCache(cache, 5000)));
+    Assert.assertTrue(cache.equals(new ScheduledCache(cache)));
 
     Assert.assertEquals(cache.hashCode(), new 
SynchronizedCache(cache).hashCode());
     Assert.assertEquals(cache.hashCode(), new 
SerializedCache(cache).hashCode());
@@ -28,7 +27,7 @@
     caches.add(new SynchronizedCache(cache));
     caches.add(new SerializedCache(cache));
     caches.add(new LoggingCache(cache));
-    caches.add(new ScheduledCache(cache, 5000));
+    caches.add(new ScheduledCache(cache));
     Assert.assertEquals(1, caches.size());
   }
 

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=692775&r1=692774&r2=692775&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
 Sat Sep  6 22:37:09 2008
@@ -8,7 +8,8 @@
 
   @Test
   public void shouldRemoveFirstItemInBeyondFiveEntries() {
-    FifoCache cache = new FifoCache(new PerpetualCache(),5);
+    FifoCache cache = new FifoCache(new PerpetualCache("default"));
+    cache.setSize(5);
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }
@@ -20,7 +21,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    FifoCache cache = new FifoCache(new PerpetualCache());
+    FifoCache cache = new FifoCache(new PerpetualCache("default"));
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -29,7 +30,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    FifoCache cache = new FifoCache(new PerpetualCache());
+    FifoCache cache = new FifoCache(new PerpetualCache("default"));
     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=692775&r1=692774&r2=692775&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
 Sat Sep  6 22:37:09 2008
@@ -8,7 +8,8 @@
 
   @Test
   public void shouldRemoveLeastRecentlyUsedItemInBeyondFiveEntries() {
-    LruCache cache = new LruCache(new PerpetualCache(),5);
+    LruCache cache = new LruCache(new PerpetualCache("default"));
+    cache.setSize(5);
     for (int i = 0; i < 5; i++) {
       cache.putObject(i, i);
     }
@@ -20,7 +21,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new LruCache(new PerpetualCache());
+    Cache cache = new LruCache(new PerpetualCache("default"));
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -29,7 +30,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new LruCache(new PerpetualCache());
+    Cache cache = new LruCache(new PerpetualCache("default"));
     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/PerpetualCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/PerpetualCacheTest.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/PerpetualCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/PerpetualCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -8,7 +8,7 @@
 
   @Test
   public void shouldDemonstrateHowAllObjectsAreKept() {
-    Cache cache = new PerpetualCache();
+    Cache cache = new PerpetualCache("default");
     cache = new SynchronizedCache(cache);
     for (int i = 0; i < 100000; i++) {
       cache.putObject(i, i);
@@ -19,7 +19,7 @@
 
   @Test
   public void shouldDemonstrateCopiesAreEqual() {
-    Cache cache = new PerpetualCache();
+    Cache cache = new PerpetualCache("default");
     cache = new SerializedCache(cache);
     for (int i = 0; i < 1000; i++) {
       cache.putObject(i, i);
@@ -29,7 +29,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new PerpetualCache();
+    Cache cache = new PerpetualCache("default");
     cache = new SynchronizedCache(cache);
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
@@ -39,7 +39,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new PerpetualCache();
+    Cache cache = new PerpetualCache("default");
     cache = new SynchronizedCache(cache);
     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/ScheduledCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/ScheduledCacheTest.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/ScheduledCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/ScheduledCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -8,8 +8,9 @@
 
   @Test
   public void shouldDemonstrateHowAllObjectsAreFlushedAfterBasedOnTime() 
throws Exception {
-    Cache cache = new PerpetualCache();
-    cache = new ScheduledCache(cache, 2500);
+    Cache cache = new PerpetualCache("DefaultCache");
+    cache = new ScheduledCache(cache);
+    ((ScheduledCache)cache).setClearInterval(2500);
     cache = new LoggingCache(cache);
     for (int i = 0; i < 100; i++) {
       cache.putObject(i, i);
@@ -21,8 +22,9 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new PerpetualCache();
-    cache = new ScheduledCache(cache, 60000);
+    Cache cache = new PerpetualCache("DefaultCache");
+    cache = new ScheduledCache(cache);
+    ((ScheduledCache)cache).setClearInterval(60000);
     cache = new LoggingCache(cache);
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
@@ -32,8 +34,9 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new PerpetualCache();
-    cache = new ScheduledCache(cache, 60000);
+    Cache cache = new PerpetualCache("DefaultCache");
+    cache = new ScheduledCache(cache);
+    ((ScheduledCache)cache).setClearInterval(60000);
     cache = new LoggingCache(cache);
     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/SoftCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SoftCacheTest.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SoftCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SoftCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -8,7 +8,7 @@
 
   @Test //@Ignore("Until we can find a reliable way to test it on all 
machines.")
   public void shouldDemonstrateObjectsBeingCollectedAsNeeded() throws 
Exception {
-    SoftCache cache = new SoftCache(new PerpetualCache());
+    SoftCache cache = new SoftCache(new PerpetualCache("default"));
     int n = 100000;
     for (int i = 0; i < n; i++) {
       byte[] array = new byte[5001]; //waste a bunch of memory
@@ -22,7 +22,7 @@
 
   @Test
   public void shouldDemonstrateCopiesAreEqual() {
-    Cache cache = new SoftCache(new PerpetualCache());
+    Cache cache = new SoftCache(new PerpetualCache("default"));
     cache = new SerializedCache(cache);
     for (int i = 0; i < 1000; i++) {
       cache.putObject(i, i);
@@ -33,7 +33,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    Cache cache = new SoftCache(new PerpetualCache());
+    Cache cache = new SoftCache(new PerpetualCache("default"));
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -42,7 +42,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    Cache cache = new SoftCache(new PerpetualCache());
+    Cache cache = new SoftCache(new PerpetualCache("default"));
     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/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=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -9,7 +9,7 @@
   @Test
   public void 
shouldDemonstrate5LevelSuperCacheHandlesLotsOfEntriesWithoutCrashing() {
     final int N = 100000;
-    Cache cache = new PerpetualCache();
+    Cache cache = new PerpetualCache("default");
     cache = new LruCache(cache);
     cache = new FifoCache(cache);
     cache = new SoftCache(cache);

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java
 Sat Sep  6 22:37:09 2008
@@ -8,7 +8,7 @@
 
   @Test
   public void shouldDemonstrateObjectsBeingCollectedAsNeeded() {
-    WeakCache cache = new WeakCache(new PerpetualCache());
+    WeakCache cache = new WeakCache(new PerpetualCache("default"));
     for (int i = 0; i < 1000000; i++) {
       cache.putObject(i, i);
     }
@@ -17,7 +17,7 @@
 
   @Test
   public void shouldDemonstrateCopiesAreEqual() {
-    Cache cache = new WeakCache(new PerpetualCache());
+    Cache cache = new WeakCache(new PerpetualCache("default"));
     cache = new SerializedCache(cache);
     for (int i = 0; i < 1000; i++) {
       cache.putObject(i, i);
@@ -28,7 +28,7 @@
 
   @Test
   public void shouldRemoveItemOnDemand() {
-    WeakCache cache = new WeakCache(new PerpetualCache());
+    WeakCache cache = new WeakCache(new PerpetualCache("default"));
     cache.putObject(0, 0);
     Assert.assertNotNull(cache.getObject(0));
     cache.removeObject(0);
@@ -37,7 +37,7 @@
 
   @Test
   public void shouldFlushAllItemsOnDemand() {
-    WeakCache cache = new WeakCache(new PerpetualCache());
+    WeakCache cache = new WeakCache(new PerpetualCache("default"));
     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/executor/ExecutorTestHelper.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java?rev=692775&r1=692774&r2=692775&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java
 Sat Sep  6 22:37:09 2008
@@ -14,14 +14,12 @@
   public static final Cache authorCache;
 
   static {
-    PerpetualCache cache = new PerpetualCache();
-    cache.setId("author_cache");
     authorCache =
         new SynchronizedCache(
             new SerializedCache(
                 new LoggingCache(
                     new ScheduledCache(
-                        cache, 5000))));
+                        new PerpetualCache("author_cache")))));
 
   }
 


Reply via email to