Author: cbegin
Date: Thu Sep  4 23:19:54 2008
New Revision: 692345

URL: http://svn.apache.org/viewvc?rev=692345&view=rev
Log:
Introduced transactional cache

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
      - copied, changed from r692224, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
Removed:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
Modified:
    
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/LoggingCache.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/SerializedCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.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
    
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/cache/impl/SoftCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
    
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml

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=692345&r1=692344&r2=692345&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
 Thu Sep  4 23:19:54 2008
@@ -3,6 +3,8 @@
 import org.apache.ibatis.cache.decorators.*;
 import org.apache.ibatis.reflection.MetaObject;
 
+import java.util.concurrent.locks.ReadWriteLock;
+
 public interface Cache {
 
   String getId();
@@ -19,6 +21,8 @@
 
   void clear();
 
+  ReadWriteLock getReadWriteLock();
+
   public class Builder {
     private String id;
     private Class implementation;

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java?rev=692345&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
 Thu Sep  4 23:19:54 2008
@@ -0,0 +1,40 @@
+package org.apache.ibatis.cache;
+
+import org.apache.ibatis.cache.decorators.TransactionalCache;
+
+import java.util.*;
+
+public class TransactionalCacheManager {
+
+  private Map<Cache, TransactionalCache> transactionalCaches = new 
HashMap<Cache, TransactionalCache>();
+
+  public void clear(Cache cache) {
+    getTransactionalCache(cache).clear();
+  }
+
+  public void putObject(Cache cache, CacheKey key, Object value) {
+    getTransactionalCache(cache).putObject(key, value);
+  }
+
+  public void commit() {
+    for(TransactionalCache txCache : transactionalCaches.values()) {
+      txCache.commit();
+    }
+  }
+
+  public void rollback() {
+    for(TransactionalCache txCache : transactionalCaches.values()) {
+      txCache.rollback();
+    }
+  }
+
+  private TransactionalCache getTransactionalCache(Cache cache) {
+    TransactionalCache txCache = transactionalCaches.get(cache);
+    if (txCache == null) {
+      txCache = new TransactionalCache(cache);
+      transactionalCaches.put(cache,txCache);
+    }
+    return txCache;
+  }
+
+}

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
 Thu Sep  4 23:19:54 2008
@@ -3,7 +3,9 @@
 import org.apache.ibatis.cache.*;
 import org.apache.ibatis.logging.*;
 
-public class LoggingCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class LoggingCache implements Cache {
 
   private static final Log log = LogFactory.getLog(LoggingCache.class);
 
@@ -50,6 +52,18 @@
     delegate.clear();
   }
 
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  public int hashCode() {
+    return delegate.hashCode();
+  }
+
+  public boolean equals(Object obj) {
+    return delegate.equals(obj);
+  }
+
   private double getHitRatio() {
     return (double) hits / (double) requests;
   }

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=692345&r1=692344&r2=692345&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
 Thu Sep  4 23:19:54 2008
@@ -2,7 +2,9 @@
 
 import org.apache.ibatis.cache.*;
 
-public class ScheduledCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class ScheduledCache implements Cache {
 
   private Cache delegate;
   protected long clearInterval = 60 * 60 * 1000; // 1 hour
@@ -65,6 +67,18 @@
     delegate.clear();
   }
 
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  public int hashCode() {
+    return delegate.hashCode();
+  }
+
+  public boolean equals(Object obj) {
+    return delegate.equals(obj);
+  }
+
   private boolean clearWhenStale() {
     if (System.currentTimeMillis() - lastClear > clearInterval) {
       clear();

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
 Thu Sep  4 23:19:54 2008
@@ -3,8 +3,9 @@
 import org.apache.ibatis.cache.*;
 
 import java.io.*;
+import java.util.concurrent.locks.ReadWriteLock;
 
-public class SerializedCache extends BaseCache {
+public class SerializedCache implements Cache {
 
   private Cache delegate;
 
@@ -45,6 +46,10 @@
     delegate.clear();
   }
 
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
   private byte[] serialize(Serializable value) {
     try {
       ByteArrayOutputStream bos = new ByteArrayOutputStream();

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
 Thu Sep  4 23:19:54 2008
@@ -2,7 +2,9 @@
 
 import org.apache.ibatis.cache.*;
 
-public class SynchronizedCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class SynchronizedCache implements Cache {
 
   private Cache delegate;
 
@@ -14,28 +16,87 @@
     return delegate.getId();
   }
 
-  public synchronized int getSize() {
-    return delegate.getSize();
+  public int getSize() {
+    acquireReadLock();
+    try {
+      return delegate.getSize();      
+    } finally {
+      releaseReadLock();
+    }
+  }
+
+  public void putObject(Object key, Object object) {
+    acquireWriteLock();
+    try {
+      delegate.putObject(key, object);
+    } finally {
+      releaseWriteLock();
+    }
+  }
+
+  public Object getObject(Object key) {
+    acquireReadLock();
+    try {
+      return delegate.getObject(key);
+    } finally {
+      releaseReadLock();
+    }
+  }
+
+  public boolean hasKey(Object key) {
+    acquireReadLock();
+    try {
+      return delegate.hasKey(key);
+    } finally {
+      releaseReadLock();
+    }
+  }
+
+  public Object removeObject(Object key) {
+    acquireWriteLock();
+    try {
+      return delegate.removeObject(key);
+    } finally {
+      releaseWriteLock();
+    }
+  }
+
+
+  public void clear() {
+    acquireWriteLock();
+    try {
+      delegate.clear();
+    } finally {
+      releaseWriteLock();
+    }
+  }
+
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  public int hashCode() {
+    return delegate.hashCode();
   }
 
-  public synchronized void putObject(Object key, Object object) {
-    delegate.putObject(key, object);
+  public boolean equals(Object obj) {
+    return delegate.equals(obj);
   }
 
-  public synchronized Object getObject(Object key) {
-    return delegate.getObject(key);
+  private void acquireReadLock() {
+    getReadWriteLock().readLock().lock();
   }
 
-  public synchronized boolean hasKey(Object key) {
-    return delegate.hasKey(key);
+  private void releaseReadLock() {
+    getReadWriteLock().readLock().unlock();
   }
 
-  public synchronized Object removeObject(Object key) {
-    return delegate.removeObject(key);
+  private void acquireWriteLock() {
+    getReadWriteLock().writeLock().lock();
   }
 
-  public synchronized void clear() {
-    delegate.clear();
+  private void releaseWriteLock() {
+    getReadWriteLock().writeLock().unlock();
   }
 
 }

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java?rev=692345&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
 Thu Sep  4 23:19:54 2008
@@ -0,0 +1,117 @@
+package org.apache.ibatis.cache.decorators;
+
+import org.apache.ibatis.cache.*;
+
+import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class TransactionalCache implements Cache {
+
+  private Cache delegate;
+  private boolean clearOnCommit;
+  private Map<Object, AddEntry> entriesToAddOnCommit;
+  private Map<Object, RemoveEntry> entriesToRemoveOnCommit;
+
+  public TransactionalCache(Cache delegate) {
+    this.delegate = delegate;
+    this.clearOnCommit = false;
+    this.entriesToAddOnCommit = new HashMap<Object, AddEntry>();
+    this.entriesToRemoveOnCommit = new HashMap<Object, RemoveEntry>();
+  }
+
+  public String getId() {
+    return delegate.getId();
+  }
+
+  public int getSize() {
+    return delegate.getSize();
+  }
+
+  public Object getObject(Object key) {
+    return delegate.getObject(key);
+  }
+
+  public boolean hasKey(Object key) {
+    return delegate.hasKey(key);
+  }
+
+  public ReadWriteLock getReadWriteLock() {
+    return delegate.getReadWriteLock();
+  }
+
+  public void putObject(Object key, Object object) {
+    entriesToRemoveOnCommit.remove(key);
+    entriesToAddOnCommit.put(key, new AddEntry(delegate,key,object));
+  }
+
+  public Object removeObject(Object key) {
+    entriesToAddOnCommit.remove(key);
+    entriesToRemoveOnCommit.put(key, new RemoveEntry(delegate,key));
+    return delegate.getObject(key);
+  }
+
+  public void clear() {
+    clearOnCommit = true;
+  }
+
+  public void commit() {
+    delegate.getReadWriteLock().writeLock().lock();
+    try {
+      if (clearOnCommit) {
+        delegate.clear();
+      } else {
+        for (RemoveEntry entry : entriesToRemoveOnCommit.values()) {
+          entry.commit();
+        }
+      }
+      for (AddEntry entry : entriesToAddOnCommit.values()) {
+        entry.commit();
+      }
+      reset();
+    } finally {
+      delegate.getReadWriteLock().writeLock().unlock();
+    }
+  }
+
+  public void rollback() {
+    reset();
+  }
+
+  private void reset() {
+    clearOnCommit = false;
+    entriesToRemoveOnCommit.clear();
+    entriesToAddOnCommit.clear();
+  }
+
+  private static class AddEntry {
+    private Cache cache;
+    private Object key;
+    private Object value;
+
+    public AddEntry(Cache cache, Object key, Object value) {
+      this.cache = cache;
+      this.key = key;
+      this.value = value;
+    }
+
+    public void commit() {
+      cache.putObject(key, value);
+    }
+  }
+
+  private static class RemoveEntry {
+    private Cache cache;
+    private Object key;
+
+    public RemoveEntry(Cache cache, Object key) {
+      this.cache = cache;
+      this.key = key;
+    }
+
+    public void commit() {
+      cache.removeObject(key);
+    }
+  }
+
+
+}

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
 (from r692224, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java&r1=692224&r2=692345&rev=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
 Thu Sep  4 23:19:54 2008
@@ -1,4 +1,8 @@
-package org.apache.ibatis.cache;
+package org.apache.ibatis.cache.impl;
+
+import org.apache.ibatis.cache.*;
+
+import java.util.concurrent.locks.*;
 
 /**
  * Base Cache class implements a template method pattern for subclasses.
@@ -7,6 +11,8 @@
 
   protected String id;
 
+  private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
   public String getId() {
     return id;
   }
@@ -15,14 +21,18 @@
     this.id = id;
   }
 
+  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 BaseCache)) return false;
+    if (!(o instanceof Cache)) return false;
 
-    BaseCache baseCache = (BaseCache) o;
+    Cache otherCache = (Cache) o;
 
-    if (!getId().equals(baseCache.getId())) return false;
+    if (!getId().equals(otherCache.getId())) return false;
 
     return true;
   }

Modified: 
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/impl/FifoCache.java?rev=692345&r1=692344&r2=692345&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/impl/FifoCache.java
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,6 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
 
 import java.util.*;
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,6 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
 
 import java.util.*;
 

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=692345&r1=692344&r2=692345&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
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,6 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
 
 import java.util.*;
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,6 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
 
 import javax.util.SoftHashMap;
 import java.util.Map;

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,6 @@
 package org.apache.ibatis.cache.impl;
 
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
 
 import java.util.*;
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
 Thu Sep  4 23:19:54 2008
@@ -11,9 +11,7 @@
 public class CachingExecutor implements Executor {
 
   private Executor delegate;
-
-  private Set<Cache> clearCaches;
-  private List<CacheEntry> cacheEntries;
+  private TransactionalCacheManager tcm = new TransactionalCacheManager();
 
   public CachingExecutor(Executor delegate) {
     this.delegate = delegate;
@@ -30,35 +28,32 @@
   public int update(MappedStatement ms, Object parameterObject) throws 
SQLException {
     Cache cache = ms.getCache();
     if (cache != null) {
-      if (clearCaches == null) {
-        clearCaches = new HashSet<Cache>();
-      }
-      clearCaches.add(cache);
+      tcm.clear(cache);
     }
     return delegate.update(ms, parameterObject);
   }
 
+
   public List query(MappedStatement ms, Object parameterObject, int offset, 
int limit, ResultHandler resultHandler) throws SQLException {
     if (ms != null) {
       Cache cache = ms.getCache();
       if (cache != null) {
-        synchronized (cache) {
+        cache.getReadWriteLock().readLock().lock();
+        try {
           CacheKey key = createCacheKey(ms, parameterObject, offset, limit);
           if (cache.hasKey(key)) {
             return (List) cache.getObject(key);
           } else {
             List list = delegate.query(ms, parameterObject, offset, limit, 
resultHandler);
-            if (cacheEntries == null) {
-              cacheEntries = new ArrayList<CacheEntry>();
-            }
-            cacheEntries.add(new CacheEntry(cache, key, list));
+            tcm.putObject(cache, key, list);
             return list;
           }
+        } finally {
+          cache.getReadWriteLock().readLock().unlock();
         }
       }
     }
     return delegate.query(ms, parameterObject, offset, limit, resultHandler);
-
   }
 
   public List flushStatements() throws SQLException {
@@ -66,25 +61,16 @@
   }
 
   public void commit(boolean required) throws SQLException {
-    if (clearCaches != null) {
-      for (Cache cache : clearCaches) {
-        cache.clear();
-      }
-      clearCaches.clear();
-    }
-    if (cacheEntries != null) {
-      for (CacheEntry entry : cacheEntries) {
-        entry.commit();
-      }
-      cacheEntries.clear();
-    }
     delegate.commit(required);
+    tcm.commit();
   }
 
   public void rollback(boolean required) throws SQLException {
-    if (clearCaches != null) clearCaches.clear();
-    if (cacheEntries != null) cacheEntries.clear();
-    delegate.rollback(required);
+    try {
+      delegate.rollback(required);
+    } finally {
+      tcm.rollback();
+    }
   }
 
   public CacheKey createCacheKey(MappedStatement ms, Object parameterObject, 
int offset, int limit) {
@@ -99,20 +85,4 @@
     throw new UnsupportedOperationException("The CachingExecutor should not be 
used by result loaders and thus deferLoad() should never be called.");
   }
 
-  private static class CacheEntry {
-    private Cache cache;
-    private CacheKey key;
-    private Object value;
-
-    public CacheEntry(Cache cache, CacheKey key, Object value) {
-      this.cache = cache;
-      this.key = key;
-      this.value = value;
-    }
-
-    public void commit() {
-      cache.putObject(key, value);
-    }
-  }
-
 }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
 Thu Sep  4 23:19:54 2008
@@ -1,6 +1,4 @@
-<mapper type="com.domain.PersonMapper">
-
-  <defaultCache cacheType="MyLRU" cacheDomain="PersonMapper"/>
+<mapper type="com.domain.PersonMapper" cacheDomain="">
 
   <resultMap id="" type="" extends="">
     <constructor>
@@ -22,8 +20,7 @@
            mode="" scale="" resultMap=""/>
   </parameterMap>
 
-  <select id="selectAllPeople" cacheType="" cacheDomain=""
-          flushCache="" parameterType="" resultType="" resultMap="">
+  <select id="selectAllPeople" cacheDomain="" flushCache="" parameterType="" 
resultType="" resultMap="">
     select * from PERSON order by
     
${opts.order,javaType="",jdbcType="",typeHandler="",mode="",scale="",resultMap=""}
   </select>

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
 Thu Sep  4 23:19:54 2008
@@ -20,11 +20,9 @@
     <setting name="" value=""/>
   </settings>
 
-  <caches default="MyLRU">
-    <cache id="myLRU" type="LRU">
-      <properties name="" value=""/>
-    </cache>
-  </caches>
+  <cache type="LRU">
+    <properties name="" value=""/>
+  </cache>
 
   <environments default="development">
     <environment id="development">


Reply via email to