From d8f8a5de1139fa97931e555c716910a65dae358d Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 11 Jun 2013 15:38:13 +0000
Subject: [PATCH] Partial fix for OPENDJ-885: Replication replay may lose changes if it can't acquire a writeLock

---
 opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java                                                  |    9 
 opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java                                                     |  235 +------------
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java                                        |  182 ++++------
 opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java                                 |   18 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java       |   38 +-
 opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java                                       |  166 +++------
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java          |   25 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java |   11 
 opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java                                          |   25 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java    |   56 +-
 opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java                                    |   63 +--
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java        |  169 +++------
 12 files changed, 333 insertions(+), 664 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
index a77cf58..424eecb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.api;
 import org.opends.messages.Message;
@@ -33,15 +34,12 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.locks.Lock;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.LockType;
-import org.opends.server.types.LockManager;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.DebugLogLevel;
 import org.opends.server.admin.std.server.EntryCacheCfg;
@@ -101,10 +99,6 @@
   private Set<SearchFilter> includeFilters =
        new HashSet<SearchFilter>(0);
 
-  // The maximum length of time to try to obtain a lock before giving
-  // up.
-  private long lockTimeout = LockManager.DEFAULT_TIMEOUT;
-
   /**
    * Arbitrary number of cache hits for monitoring.
    */
@@ -210,13 +204,9 @@
 
 
   /**
-   * Retrieves the entry with the specified DN from the cache.  The
-   * caller should have already acquired a read or write lock for the
-   * entry if such protection is needed.
-   * Note that this method is called from @see #getEntry(DN entryDN,
-   * LockType lockType, List lockList)
+   * Retrieves the entry with the specified DN from the cache.
    *
-   * @param  entryDN  The DN of the entry to retrieve.
+   * @param  entryDN   The DN of the entry to retrieve.
    *
    * @return  The requested entry if it is present in the cache, or
    *          {@code null} if it is not present.
@@ -226,192 +216,28 @@
 
 
   /**
-   * Retrieves the entry with the specified DN from the cache,
-   * obtaining a lock on the entry before it is returned.  If the
-   * entry is present in the cache, then a lock will be obtained for
-   * that entry and appended to the provided list before the entry is
-   * returned.  If the entry is not present, then no lock will be
-   * obtained.  Note that although this method is declared non-final
-   * it is not recommended for subclasses to implement this method.
-   *
-   * @param  entryDN   The DN of the entry to retrieve.
-   * @param  lockType  The type of lock to obtain (it may be
-   *                   {@code NONE}).
-   * @param  lockList  The list to which the obtained lock will be
-   *                   added (note that no lock will be added if the
-   *                   lock type was {@code NONE}).
-   *
-   * @return  The requested entry if it is present in the cache, or
-   *          {@code null} if it is not present.
-   */
-  public Entry getEntry(DN entryDN,
-                        LockType lockType,
-                        List<Lock> lockList) {
-
-    if (!containsEntry(entryDN)) {
-      // Indicate cache miss.
-      cacheMisses.getAndIncrement();
-
-      return null;
-    }
-
-    // Obtain a lock for the entry before actually retrieving the
-    // entry itself thus preventing any stale entries being returned,
-    // see Issue #1589 for more details.  If an error occurs, then
-    // make sure no lock is held and return null. Otherwise, return
-    // the entry.
-    switch (lockType)
-    {
-      case READ:
-        // Try to obtain a read lock for the entry.
-        Lock readLock = LockManager.lockRead(entryDN, lockTimeout);
-        if (readLock == null)
-        {
-          // We couldn't get the lock, so we have to return null.
-          return null;
-        }
-        else
-        {
-          try
-          {
-            lockList.add(readLock);
-            // and load.
-            Entry entry = getEntry(entryDN);
-            if (entry == null)
-            {
-              lockList.remove(readLock);
-              LockManager.unlock(entryDN, readLock);
-              return null;
-            }
-            return entry;
-          }
-          catch (Exception e)
-          {
-            if (debugEnabled())
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e);
-            }
-
-            // The attempt to add the lock to the list failed,
-            // so we need to release the lock and return null.
-            try
-            {
-              LockManager.unlock(entryDN, readLock);
-            }
-            catch (Exception e2)
-            {
-              if (debugEnabled())
-              {
-                TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-              }
-            }
-
-            return null;
-          }
-        }
-
-      case WRITE:
-        // Try to obtain a write lock for the entry.
-        Lock writeLock = LockManager.lockWrite(entryDN, lockTimeout);
-        if (writeLock == null)
-        {
-          // We couldn't get the lock, so we have to return null.
-          return null;
-        }
-        else
-        {
-          try
-          {
-            lockList.add(writeLock);
-            // and load.
-            Entry entry = getEntry(entryDN);
-            if (entry == null)
-            {
-              lockList.remove(writeLock);
-              LockManager.unlock(entryDN, writeLock);
-              return null;
-            }
-            return entry;
-          }
-          catch (Exception e)
-          {
-            if (debugEnabled())
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e);
-            }
-
-            // The attempt to add the lock to the list failed,
-            // so we need to release the lock and return null.
-            try
-            {
-              LockManager.unlock(entryDN, writeLock);
-            }
-            catch (Exception e2)
-            {
-              if (debugEnabled())
-              {
-                TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-              }
-            }
-
-            return null;
-          }
-        }
-
-      case NONE:
-        // We don't need to obtain a lock, so just return the entry.
-        Entry entry = getEntry(entryDN);
-        if (entry == null)
-        {
-          return null;
-        }
-        return entry;
-
-      default:
-        // This is an unknown type of lock, so we'll return null.
-        return null;
-    }
-  }
-
-
-
-  /**
-   * Retrieves the requested entry if it is present in the cache,
-   * obtaining a lock on the entry before it is returned.  If the
-   * entry is present in the cache, then a lock  will be obtained for
-   * that entry and appended to the provided list before the entry is
-   * returned.  If the entry is not present, then no lock will be
-   * obtained.  Note that although this method is declared non-final
-   * it is not recommended for subclasses to implement this method.
+   * Retrieves the requested entry if it is present in the cache.
    *
    * @param  backend   The backend associated with the entry to
    *                   retrieve.
    * @param  entryID   The entry ID within the provided backend for
    *                   the specified entry.
-   * @param  lockType  The type of lock to obtain (it may be
-   *                   {@code NONE}).
-   * @param  lockList  The list to which the obtained lock will be
-   *                   added (note that no lock will be added if the
-   *                   lock type was {@code NONE}).
    *
    * @return  The requested entry if it is present in the cache, or
    *          {@code null} if it is not present.
    */
-  public Entry getEntry(Backend backend, long entryID,
-                                 LockType lockType,
-                                 List<Lock> lockList) {
-
+  public Entry getEntry(Backend backend, long entryID)
+  {
     // Translate given backend/entryID pair to entryDN.
     DN entryDN = getEntryDN(backend, entryID);
-    if (entryDN == null) {
+    if (entryDN == null)
+    {
       // Indicate cache miss.
       cacheMisses.getAndIncrement();
-
       return null;
     }
-
     // Delegate to by DN lock and load method.
-    return getEntry(entryDN, lockType, lockList);
+    return getEntry(entryDN);
   }
 
 
@@ -615,34 +441,6 @@
 
 
   /**
-   * Retrieves the maximum length of time in milliseconds to wait for
-   * a lock before giving up.
-   *
-   * @return  The maximum length of time in milliseconds to wait for a
-   *          lock before giving up.
-   */
-  public long getLockTimeout()
-  {
-    return lockTimeout;
-  }
-
-
-
-  /**
-   * Specifies the maximum length of time in milliseconds to wait for
-   * a lock before giving up.
-   *
-   * @param  lockTimeout  The maximum length of time in milliseconds
-   *                      to wait for a lock before giving up.
-   */
-  public void setLockTimeout(long lockTimeout)
-  {
-    this.lockTimeout = lockTimeout;
-  }
-
-
-
-  /**
    * Retrieves the set of search filters that may be used to determine
    * whether an entry should be excluded from the cache.
    *
@@ -789,4 +587,19 @@
 
     return true;
   }
+
+
+
+  /**
+   * Return a verbose string representation of the current cache maps. This is
+   * useful primary for debugging and diagnostic purposes such as in the entry
+   * cache unit tests.
+   * <p>
+   * This method is invoked by unit tests for debugging.
+   *
+   * @return String verbose string representation of the current cache maps in
+   *         the following format: dn:id:backend one cache entry map
+   *         representation per line or <CODE>null</CODE> if all maps are empty.
+   */
+  public abstract String toVerboseString();
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index ad1b18d..07fa355 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -1283,7 +1283,6 @@
 
     DatabaseEntry data = new DatabaseEntry();
     DatabaseEntry key = new DatabaseEntry(begin);
-    List<Lock> lockList = new ArrayList<Lock>(1);
 
     int lookthroughCount = 0;
     int lookthroughLimit =
@@ -1337,10 +1336,8 @@
             Entry entry;
             Entry cacheEntry;
 
-            // Try the entry cache first. Note no need to take a lock.
-            lockList.clear();
-            cacheEntry = entryCache.getEntry(backend, entryID.longValue(),
-                LockType.NONE, lockList);
+            // Try the entry cache first.
+            cacheEntry = entryCache.getEntry(backend, entryID.longValue());
 
             if (cacheEntry == null)
             {
@@ -1495,135 +1492,116 @@
     // Iterate through the index candidates.
     if (continueSearch)
     {
-      List<Lock> lockList = new ArrayList<Lock>();
       Iterator<EntryID> iterator = entryIDList.iterator(begin);
       while (iterator.hasNext())
       {
         EntryID id = iterator.next();
         Entry entry;
-        Entry cacheEntry;
 
-        // Try the entry cache first. Note no need to take a lock.
-        lockList.clear();
-        cacheEntry = entryCache.getEntry(backend, id.longValue(),
-            LockType.NONE, lockList);
-
-        // Release any entry lock whatever happens during this block.
-        // (This is actually redundant since we did not take a lock).
-        try
+        // Try the entry cache first.
+        Entry cacheEntry = entryCache.getEntry(backend, id.longValue());
+        if (cacheEntry == null)
         {
-          if (cacheEntry == null)
+          // Fetch the candidate entry from the database.
+          try
           {
-            // Fetch the candidate entry from the database.
-            try
-            {
-              entry = id2entry.get(null, id, LockMode.DEFAULT);
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                TRACER.debugCaught(DebugLogLevel.ERROR, e);
-              }
-              continue;
-            }
+            entry = id2entry.get(null, id, LockMode.DEFAULT);
           }
-          else
+          catch (Exception e)
           {
-            entry = cacheEntry;
+            if (debugEnabled())
+            {
+              TRACER.debugCaught(DebugLogLevel.ERROR, e);
+            }
+            continue;
           }
+        }
+        else
+        {
+          entry = cacheEntry;
+        }
 
-          // Process the candidate entry.
-          if (entry != null)
+        // Process the candidate entry.
+        if (entry != null)
+        {
+          boolean isInScope = false;
+          DN entryDN = entry.getDN();
+
+          if (candidatesAreInScope)
           {
-            boolean isInScope = false;
-            DN entryDN = entry.getDN();
-
-            if (candidatesAreInScope)
+            isInScope = true;
+          }
+          else if (searchScope == SearchScope.SINGLE_LEVEL)
+          {
+            // Check if this entry is an immediate child.
+            if ((entryDN.getNumComponents() ==
+                aBaseDN.getNumComponents() + 1) &&
+                entryDN.isDescendantOf(aBaseDN))
             {
               isInScope = true;
             }
-            else if (searchScope == SearchScope.SINGLE_LEVEL)
+          }
+          else if (searchScope == SearchScope.WHOLE_SUBTREE)
+          {
+            if (entryDN.isDescendantOf(aBaseDN))
             {
-              // Check if this entry is an immediate child.
-              if ((entryDN.getNumComponents() ==
-                aBaseDN.getNumComponents() + 1) &&
-                entryDN.isDescendantOf(aBaseDN))
-              {
-                isInScope = true;
-              }
+              isInScope = true;
             }
-            else if (searchScope == SearchScope.WHOLE_SUBTREE)
+          }
+          else if (searchScope == SearchScope.SUBORDINATE_SUBTREE)
+          {
+            if ((entryDN.getNumComponents() >
+            aBaseDN.getNumComponents()) &&
+            entryDN.isDescendantOf(aBaseDN))
             {
-              if (entryDN.isDescendantOf(aBaseDN))
-              {
-                isInScope = true;
-              }
+              isInScope = true;
             }
-            else if (searchScope == SearchScope.SUBORDINATE_SUBTREE)
-            {
-              if ((entryDN.getNumComponents() >
-              aBaseDN.getNumComponents()) &&
-              entryDN.isDescendantOf(aBaseDN))
-              {
-                isInScope = true;
-              }
-            }
+          }
 
-            // Put this entry in the cache if it did not come from the cache.
-            if (cacheEntry == null)
-            {
-              // Put the entry in the cache making sure not to overwrite
-              // a newer copy that may have been inserted since the time
-              // we read the cache.
-              entryCache.putEntryIfAbsent(entry, backend, id.longValue());
-            }
+          // Put this entry in the cache if it did not come from the cache.
+          if (cacheEntry == null)
+          {
+            // Put the entry in the cache making sure not to overwrite
+            // a newer copy that may have been inserted since the time
+            // we read the cache.
+            entryCache.putEntryIfAbsent(entry, backend, id.longValue());
+          }
 
-            // Filter the entry if it is in scope.
-            if (isInScope)
+          // Filter the entry if it is in scope.
+          if (isInScope)
+          {
+            if (manageDsaIT || entry.getReferralURLs() == null)
             {
-              if (manageDsaIT || entry.getReferralURLs() == null)
+              if (searchOperation.getFilter().matchesEntry(entry))
               {
-                if (searchOperation.getFilter().matchesEntry(entry))
+                if (pageRequest != null &&
+                    searchOperation.getEntriesSent() ==
+                    pageRequest.getSize())
                 {
-                  if (pageRequest != null &&
-                      searchOperation.getEntriesSent() ==
-                        pageRequest.getSize())
-                  {
-                    // The current page is full.
-                    // Set the cookie to remember where we were.
-                    byte[] cookieBytes = id.getDatabaseEntry().getData();
-                    ByteString cookie = ByteString.wrap(cookieBytes);
-                    PagedResultsControl control;
-                    control = new PagedResultsControl(pageRequest.isCritical(),
-                        0, cookie);
-                    searchOperation.getResponseControls().add(control);
-                    return;
-                  }
+                  // The current page is full.
+                  // Set the cookie to remember where we were.
+                  byte[] cookieBytes = id.getDatabaseEntry().getData();
+                  ByteString cookie = ByteString.wrap(cookieBytes);
+                  PagedResultsControl control;
+                  control = new PagedResultsControl(pageRequest.isCritical(),
+                      0, cookie);
+                  searchOperation.getResponseControls().add(control);
+                  return;
+                }
 
-                  if (!searchOperation.returnEntry(entry, null))
-                  {
-                    // We have been told to discontinue processing of the
-                    // search. This could be due to size limit exceeded or
-                    // operation cancelled.
-                    break;
-                  }
+                if (!searchOperation.returnEntry(entry, null))
+                {
+                  // We have been told to discontinue processing of the
+                  // search. This could be due to size limit exceeded or
+                  // operation cancelled.
+                  break;
                 }
               }
             }
           }
         }
-        finally
-        {
-          // Release any entry lock acquired by the entry cache
-          // (This is actually redundant since we did not take a lock).
-          for (Lock lock : lockList)
-          {
-            lock.unlock();
-          }
-        }
-        searchOperation.checkIfCanceled(false);
       }
+      searchOperation.checkIfCanceled(false);
     }
 
     // Before we return success from the search we must ensure the base entry
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
index 5e37fd2..97950e5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
@@ -23,18 +23,17 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
-import java.lang.reflect.Method;
+
+
+
 import org.opends.messages.Message;
 
-
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.SortedMap;
-import java.util.concurrent.locks.Lock;
 
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.server.EntryCacheCfg;
@@ -50,7 +49,6 @@
 import org.opends.server.types.DebugLogLevel;
 import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.LockType;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -110,7 +108,7 @@
   @Override
   public void finalizeEntryCache()
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       entryCache.finalizeEntryCache();
     }
     // ReInitialize cache order array.
@@ -128,7 +126,7 @@
       return false;
     }
 
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       if (entryCache.containsEntry(entryDN)) {
         return true;
       }
@@ -142,52 +140,23 @@
    * {@inheritDoc}
    */
   @Override
-  public Entry getEntry(DN entryDN,
-                        LockType lockType,
-                        List<Lock> lockList)
+  public Entry getEntry(Backend backend, long entryID)
   {
-    Entry entry = null;
-
-    for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) {
-      entry = entryCache.getEntry(entryDN, lockType, lockList);
-      if (entry != null) {
-        break;
+    for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder)
+    {
+      Entry entry = entryCache.getEntry(backend, entryID);
+      if (entry != null)
+      {
+        return entry.duplicate(true);
       }
     }
 
     // Indicate global cache miss.
-    if ((entry == null) && (cacheOrder.length != 0)) {
+    if (cacheOrder.length != 0)
+    {
       cacheMisses.getAndIncrement();
     }
-
-    return (entry != null ? entry.duplicate(true) : null);
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public Entry getEntry(Backend backend, long entryID,
-                                 LockType lockType,
-                                 List<Lock> lockList)
-  {
-    Entry entry = null;
-
-    for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) {
-      entry = entryCache.getEntry(backend, entryID, lockType,
-          lockList);
-      if (entry != null) {
-        break;
-      }
-    }
-
-    // Indicate global cache miss.
-    if ((entry == null) && (cacheOrder.length != 0)) {
-      cacheMisses.getAndIncrement();
-    }
-
-    return (entry != null ? entry.duplicate(true) : null);
+    return null;
   }
 
 
@@ -197,21 +166,21 @@
   @Override
   public Entry getEntry(DN entryDN)
   {
-    Entry entry = null;
-
-    for (EntryCache entryCache : cacheOrder) {
-      entry = entryCache.getEntry(entryDN);
-      if (entry != null) {
-        break;
+    for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder)
+    {
+      Entry entry = entryCache.getEntry(entryDN);
+      if (entry != null)
+      {
+        return entry.duplicate(true);
       }
     }
 
     // Indicate global cache miss.
-    if ((entry == null) && (cacheOrder.length != 0)) {
+    if (cacheOrder.length != 0)
+    {
       cacheMisses.getAndIncrement();
     }
-
-    return (entry != null ? entry.duplicate(true) : null);
+    return null;
   }
 
 
@@ -222,16 +191,15 @@
   @Override
   public long getEntryID(DN entryDN)
   {
-    long entryID = -1;
-
-    for (EntryCache entryCache : cacheOrder) {
-      entryID = entryCache.getEntryID(entryDN);
-      if (entryID != -1) {
-        break;
+    for (EntryCache<?> entryCache : cacheOrder)
+    {
+      long entryID = entryCache.getEntryID(entryDN);
+      if (entryID != -1)
+      {
+        return entryID;
       }
     }
-
-    return entryID;
+    return -1;
   }
 
 
@@ -242,16 +210,15 @@
   @Override
   public DN getEntryDN(Backend backend, long entryID)
   {
-    DN entryDN = null;
-
-    for (EntryCache entryCache : cacheOrder) {
-      entryDN = entryCache.getEntryDN(backend, entryID);
-      if (entryDN != null) {
-        break;
+    for (EntryCache<?> entryCache : cacheOrder)
+    {
+      DN entryDN = entryCache.getEntryDN(backend, entryID);
+      if (entryDN != null)
+      {
+        return entryDN;
       }
     }
-
-    return entryDN;
+    return null;
   }
 
 
@@ -262,7 +229,7 @@
   @Override
   public void putEntry(Entry entry, Backend backend, long entryID)
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       // The first cache in the order which can take this entry
       // gets it.
       if (entryCache.filtersAllowCaching(entry)) {
@@ -281,7 +248,7 @@
   @Override
   public boolean putEntryIfAbsent(Entry entry, Backend backend, long entryID)
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       // The first cache in the order which can take this entry
       // gets it.
       if (entryCache.filtersAllowCaching(entry)) {
@@ -301,7 +268,7 @@
   @Override
   public void removeEntry(DN entryDN)
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       if (entryCache.containsEntry(entryDN)) {
         entryCache.removeEntry(entryDN);
         break;
@@ -317,7 +284,7 @@
   @Override
   public void clear()
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       entryCache.clear();
     }
   }
@@ -330,7 +297,7 @@
   @Override
   public void clearBackend(Backend backend)
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       entryCache.clearBackend(backend);
     }
   }
@@ -343,7 +310,7 @@
   @Override
   public void clearSubtree(DN baseDN)
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       entryCache.clearSubtree(baseDN);
     }
   }
@@ -356,7 +323,7 @@
   @Override
   public void handleLowMemory()
   {
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       entryCache.handleLowMemory();
     }
   }
@@ -413,7 +380,7 @@
     // implementations.
     Long currentEntryCacheCount = new Long(0);
 
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       // Get cache hits and counts from every active cache.
       entryCacheHits += entryCache.getCacheHits();
       currentEntryCacheCount += entryCache.getCacheCount();
@@ -447,7 +414,7 @@
   {
     Long cacheCount = new Long(0);
 
-    for (EntryCache entryCache : cacheOrder) {
+    for (EntryCache<?> entryCache : cacheOrder) {
       cacheCount += entryCache.getCacheCount();
     }
 
@@ -457,41 +424,20 @@
 
 
   /**
-   * Return a verbose string representation of the current cache maps.
-   * This is useful primary for debugging and diagnostic purposes such
-   * as in the entry cache unit tests.
-   * @return String verbose string representation of the current cache
-   *                maps in the following format: dn:id:backend
-   *                one cache entry map representation per line
-   *                or <CODE>null</CODE> if all maps are empty.
+   * {@inheritDoc}
    */
-  private String toVerboseString()
+  public String toVerboseString()
   {
     StringBuilder sb = new StringBuilder();
-
-    for (EntryCache entryCache : cacheOrder) {
-      final Method[] cacheMethods =
-        entryCache.getClass().getDeclaredMethods();
-      for (int i = 0; i < cacheMethods.length; ++i) {
-        if (cacheMethods[i].getName().equals("toVerboseString")) {
-          cacheMethods[i].setAccessible(true);
-          try {
-            Object cacheVerboseString =
-              cacheMethods[i].invoke(entryCache, (Object[]) null);
-            if (cacheVerboseString != null) {
-              sb.append((String) cacheVerboseString);
-            }
-          } catch (Exception e) {
-            if (debugEnabled()) {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e);
-            }
-          }
-        }
+    for (EntryCache<?> entryCache : cacheOrder)
+    {
+      String s = entryCache.toVerboseString();
+      if (s != null)
+      {
+        sb.append(s);
       }
     }
-
     String verboseString = sb.toString();
-
     return (verboseString.length() > 0 ? verboseString : null);
   }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
index d23f0ea..c3e72af 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2012 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -53,6 +53,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.Attribute;
 import org.opends.server.util.ServerConstants;
@@ -126,6 +127,10 @@
   // Currently registered configuration object.
   private FIFOEntryCacheCfg registeredConfiguration;
 
+  // The maximum length of time to try to obtain a lock before giving
+  // up.
+  private long lockTimeout = LockManager.DEFAULT_TIMEOUT;
+
 
 
   /**
@@ -320,7 +325,7 @@
     // Obtain a lock on the cache.  If this fails, then don't do anything.
     try
     {
-      if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS))
+      if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS))
       {
         return;
       }
@@ -450,7 +455,7 @@
     // Obtain a lock on the cache.  If this fails, then don't do anything.
     try
     {
-      if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS))
+      if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS))
       {
         // We can't rule out the possibility of a conflict, so return false.
         return false;
@@ -1026,11 +1031,9 @@
     {
       maxEntries       = newMaxEntries;
       maxAllowedMemory = newMaxAllowedMemory;
-
-      setLockTimeout(newLockTimeout);
+      lockTimeout = newLockTimeout;
       setIncludeFilters(newIncludeFilters);
       setExcludeFilters(newExcludeFilters);
-
       registeredConfiguration = configuration;
     }
 
@@ -1083,15 +1086,9 @@
 
 
   /**
-   * Return a verbose string representation of the current cache maps.
-   * This is useful primary for debugging and diagnostic purposes such
-   * as in the entry cache unit tests.
-   * @return String verbose string representation of the current cache
-   *                maps in the following format: dn:id:backend
-   *                one cache entry map representation per line
-   *                or <CODE>null</CODE> if all maps are empty.
+   * {@inheritDoc}
    */
-  private String toVerboseString()
+  public String toVerboseString()
   {
     StringBuilder sb = new StringBuilder();
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java
index 4ce044a..f182ed6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2012 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -169,7 +169,7 @@
   // Class database, catalog and binding for serialization.
   private Database entryCacheClassDB;
   private StoredClassCatalog classCatalog;
-  private EntryBinding entryCacheDataBinding;
+  private EntryBinding<FileSystemEntryCacheIndex> entryCacheDataBinding;
 
   // JE naming constants.
   private static final String ENTRYCACHEDBNAME = "EntryCacheDB";
@@ -187,6 +187,10 @@
   // Currently registered configuration object.
   private FileSystemEntryCacheCfg registeredConfiguration;
 
+  // The maximum length of time to try to obtain a lock before giving
+  // up.
+  private long lockTimeout = LockManager.DEFAULT_TIMEOUT;
+
   /**
    * Creates a new instance of this entry cache.
    */
@@ -207,7 +211,6 @@
    * {@inheritDoc}
    */
   @Override
-  @SuppressWarnings("unchecked")
   public void initializeEntryCache(FileSystemEntryCacheCfg configuration)
           throws ConfigException, InitializationException {
 
@@ -304,9 +307,8 @@
       classCatalog = new StoredClassCatalog(entryCacheClassDB);
       //This line causes an unchecked call error if the SuppressWarnings
       //annotation is removed at the beginning of this method.
-      entryCacheDataBinding =
-          new SerialBinding(classCatalog,
-          FileSystemEntryCacheIndex.class);
+      entryCacheDataBinding = new SerialBinding<FileSystemEntryCacheIndex>(
+          classCatalog, FileSystemEntryCacheIndex.class);
 
       // Get the root configuration object.
       ServerManagementContext managementContext =
@@ -336,9 +338,7 @@
 
           if (OperationStatus.SUCCESS ==
               entryCacheDB.get(null, indexKey, indexData, LockMode.DEFAULT)) {
-            entryCacheIndex =
-                (FileSystemEntryCacheIndex)
-                entryCacheDataBinding.entryToObject(indexData);
+            entryCacheIndex = entryCacheDataBinding.entryToObject(indexData);
           } else {
             throw new CacheIndexNotFoundException();
           }
@@ -434,7 +434,6 @@
    * {@inheritDoc}
    */
   @Override
-  @SuppressWarnings("unchecked")
   public void finalizeEntryCache() {
 
     cacheWriteLock.lock();
@@ -590,17 +589,18 @@
    */
   @Override
   public DN getEntryDN(Backend backend, long entryID) {
-
     DN entryDN = null;
     cacheReadLock.lock();
     try {
       // Get the map for the provided backend.  If it isn't present, then
       // return null.
-      Map map = entryCacheIndex.backendMap.get(backend.getBackendID());
-      if ( !(map == null) ) {
+      Map<Long, String> map = entryCacheIndex.backendMap.get(backend
+          .getBackendID());
+      if (map != null)
+      {
         // Get the entry DN from the map by its ID.  If it isn't present,
         // then return null.
-        entryDN = DN.decode((String) map.get(entryID));
+        entryDN = DN.decode(map.get(entryID));
       }
     } catch (Exception e) {
       // Ignore.
@@ -706,7 +706,6 @@
    * {@inheritDoc}
    */
   @Override
-  @SuppressWarnings("unchecked")
   public void clear() {
 
     cacheWriteLock.lock();
@@ -732,8 +731,8 @@
           classCatalog = new StoredClassCatalog(entryCacheClassDB);
           //This line causes an unchecked call error if the SuppressWarnings
           //annotation is removed at the beginning of this method.
-          entryCacheDataBinding = new SerialBinding(classCatalog,
-            FileSystemEntryCacheIndex.class);
+          entryCacheDataBinding = new SerialBinding<FileSystemEntryCacheIndex>(
+              classCatalog, FileSystemEntryCacheIndex.class);
         }
       } catch (Exception e) {
         if (debugEnabled()) {
@@ -1142,7 +1141,7 @@
           );
       // Iterate through native JE properties.
       try {
-        Map paramsMap = EnvironmentParams.SUPPORTED_PARAMS;
+        Map<String, ConfigParam> paramsMap = EnvironmentParams.SUPPORTED_PARAMS;
         // If this entry cache is disabled then there is no open JE
         // environment to check against, skip mutable check if so.
         if (configuration.isEnabled()) {
@@ -1156,7 +1155,7 @@
             if (st.countTokens() == 2) {
               String jePropertyName = st.nextToken();
               String jePropertyValue = st.nextToken();
-              ConfigParam param = (ConfigParam) paramsMap.get(jePropertyName);
+              ConfigParam param = paramsMap.get(jePropertyName);
               if (!param.isMutable()) {
                 String oldValue = oldEnvConfig.getConfigParam(param.getName());
                 String newValue = jePropertyValue;
@@ -1262,7 +1261,7 @@
       encodeConfig     = new EntryEncodeConfig(true,
         newCompactEncoding, newCompactEncoding);
 
-      setLockTimeout(newLockTimeout);
+      lockTimeout = newLockTimeout;
       setIncludeFilters(newIncludeFilters);
       setExcludeFilters(newExcludeFilters);
 
@@ -1368,7 +1367,7 @@
                                ByteStringBuilder entryBytes) {
     try {
       // Obtain a lock on the cache.  If this fails, then don't do anything.
-      if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS)) {
+      if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS)) {
         return false;
       }
       // See if the current fs space usage is within acceptable constraints. If
@@ -1488,15 +1487,9 @@
   }
 
   /**
-   * Return a verbose string representation of the current cache maps.
-   * This is useful primary for debugging and diagnostic purposes such
-   * as in the entry cache unit tests.
-   * @return String verbose string representation of the current cache
-   *                maps in the following format: dn:id:backend
-   *                one cache entry map representation per line
-   *                or <CODE>null</CODE> if all maps are empty.
+   * {@inheritDoc}
    */
-  private String toVerboseString()
+  public String toVerboseString()
   {
     StringBuilder sb = new StringBuilder();
 
@@ -1580,7 +1573,7 @@
    * @return boolean {@code true} if the eldest entry should be removed
    *                 from the map; {@code false} if it should be retained.
    */
-  protected boolean removeEldestEntry(Map.Entry eldest) {
+  protected boolean removeEldestEntry(Map.Entry<String, Long> eldest) {
     // Check if we hit the limit on max entries and if so remove
     // the eldest entry otherwise do nothing.
     if (entryCacheIndex.dnMap.size() > maxEntries.longValue()) {
@@ -1588,8 +1581,8 @@
       cacheWriteLock.lock();
       try {
         // Remove the the eldest entry from supporting maps.
-        String entryStringDN = (String) eldest.getKey();
-        long entryID = ((Long) eldest.getValue()).longValue();
+        String entryStringDN = eldest.getKey();
+        long entryID = eldest.getValue();
         cacheEntryKey.setData(entryStringDN.getBytes("UTF-8"));
         Set<String> backendSet = entryCacheIndex.backendMap.keySet();
         Iterator<String> backendIterator = backendSet.iterator();
@@ -1630,9 +1623,6 @@
   private class CacheIndexNotFoundException extends OpenDsException {
     static final long serialVersionUID = 6444756053577853869L;
     public CacheIndexNotFoundException() {}
-    public CacheIndexNotFoundException(Message message) {
-      super(message);
-    }
   }
 
   /**
@@ -1643,9 +1633,6 @@
   private class CacheIndexImpairedException extends OpenDsException {
     static final long serialVersionUID = -369455697709478407L;
     public CacheIndexImpairedException() {}
-    public CacheIndexImpairedException(Message message) {
-      super(message);
-    }
   }
 
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
index fbf7230..8160603 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -55,11 +55,9 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.LockManager;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.util.ServerConstants;
 
-
 import static org.opends.server.loggers.debug.DebugLogger.*;
 import static org.opends.messages.ExtensionMessages.*;
 
@@ -116,7 +114,6 @@
 
     setExcludeFilters(new HashSet<SearchFilter>());
     setIncludeFilters(new HashSet<SearchFilter>());
-    setLockTimeout(LockManager.DEFAULT_TIMEOUT);
     referenceQueue = new ReferenceQueue<CacheEntry>();
   }
 
@@ -562,13 +559,11 @@
   {
     // Local variables to read configuration.
     DN                    newConfigEntryDN;
-    long                  newLockTimeout;
     HashSet<SearchFilter> newIncludeFilters = null;
     HashSet<SearchFilter> newExcludeFilters = null;
 
     // Read configuration.
     newConfigEntryDN = configuration.dn();
-    newLockTimeout   = configuration.getLockTimeout();
 
     // Get include and exclude filters.
     switch (errorHandler.getConfigPhase())
@@ -593,7 +588,6 @@
 
     if (applyChanges && errorHandler.getIsAcceptable())
     {
-      setLockTimeout(newLockTimeout);
       setIncludeFilters(newIncludeFilters);
       setExcludeFilters(newExcludeFilters);
 
@@ -710,15 +704,9 @@
 
 
   /**
-   * Return a verbose string representation of the current cache maps.
-   * This is useful primary for debugging and diagnostic purposes such
-   * as in the entry cache unit tests.
-   * @return String verbose string representation of the current cache
-   *                maps in the following format: dn:id:backend
-   *                one cache entry map representation per line
-   *                or <CODE>null</CODE> if all maps are empty.
+   * {@inheritDoc}
    */
-  private String toVerboseString()
+  public String toVerboseString()
   {
     StringBuilder sb = new StringBuilder();
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
index d12283e..70b25b4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.types;
 
@@ -182,7 +183,7 @@
    * @return  The read lock that was acquired, or {@code null} if it
    *          was not possible to obtain a read lock for some reason.
    */
-  public static Lock tryLockRead(DN entryDN)
+  private static Lock tryLockRead(DN entryDN)
   {
     ReentrantReadWriteLock entryLock =
         new ReentrantReadWriteLock(fair);
@@ -297,7 +298,7 @@
    *          it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static Lock lockRead(DN entryDN, long timeout)
+  private static Lock lockRead(DN entryDN, long timeout)
   {
     // First, try to get the lock without blocking.
     Lock readLock = tryLockRead(entryDN);
@@ -396,7 +397,7 @@
    *          if it was not possible to obtain a write lock for some
    *          reason.
    */
-  public static Lock tryLockWrite(DN entryDN)
+  private static Lock tryLockWrite(DN entryDN)
   {
     ReentrantReadWriteLock entryLock =
         new ReentrantReadWriteLock(fair);
@@ -508,7 +509,7 @@
    *          if it was not possible to obtain a read lock for some
    *          reason.
    */
-  public static Lock lockWrite(DN entryDN, long timeout)
+  private static Lock lockWrite(DN entryDN, long timeout)
   {
     // First, try to get the lock without blocking.
     Lock writeLock = tryLockWrite(entryDN);
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java
index 3abb9fd..168cc48 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java
@@ -23,14 +23,13 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.extensions;
 
 
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.concurrent.locks.Lock;
 
 import org.opends.server.TestCaseUtils;
 import org.opends.server.api.Backend;
@@ -38,7 +37,6 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
-import org.opends.server.types.LockType;
 import org.opends.server.admin.std.server.EntryCacheCfg;
 import org.opends.server.util.ServerConstants;
 
@@ -48,8 +46,9 @@
 
 /**
  * A common set of test cases for all entry cache implementations.
+ * @param <C> The type of entry cache configuration.
  */
-public abstract class CommonEntryCacheTestCase
+public abstract class CommonEntryCacheTestCase<C extends EntryCacheCfg>
        extends ExtensionsTestCase
 {
   /**
@@ -87,37 +86,14 @@
   /**
    * Cache implementation instance.
    */
-  protected EntryCache cache;
+  protected EntryCache<C> cache;
 
 
 
   /**
    * Entry cache configuration instance.
    */
-  protected EntryCacheCfg configuration;
-
-
-
-  /**
-   * Reflection of the toVerboseString implementation method.
-   */
-  protected String toVerboseString()
-            throws Exception
-  {
-    final Method[] cacheMethods =
-        cache.getClass().getDeclaredMethods();
-
-    for (int i = 0; i < cacheMethods.length; ++i) {
-      if (cacheMethods[i].getName().equals("toVerboseString")) {
-        cacheMethods[i].setAccessible(true);
-        Object verboseString =
-          cacheMethods[i].invoke(cache, (Object[]) null);
-        return (String) verboseString;
-      }
-    }
-
-    return null;
-  }
+  protected C configuration;
 
 
 
@@ -129,9 +105,9 @@
   public void testContainsEntry()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -139,14 +115,14 @@
     assertFalse(cache.containsEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.putEntry(testEntriesList.get(0), b, 1);
 
     assertTrue(cache.containsEntry(testEntriesList.get(0).getDN()),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -163,9 +139,9 @@
   public void testGetEntry1()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -173,14 +149,14 @@
     assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.putEntry(testEntriesList.get(0), b, 1);
 
     assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -194,30 +170,27 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testGetEntry2()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
 
-    assertNull(cache.getEntry(testEntriesList.get(0).getDN(), LockType.NONE,
-      new ArrayList<Lock>()),
+    assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.putEntry(testEntriesList.get(0), b, 1);
 
-    assertNotNull(cache.getEntry(testEntriesList.get(0).getDN(), LockType.NONE,
-      new ArrayList<Lock>()),
+    assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -231,28 +204,27 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testGetEntry3()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
 
-    assertNull(cache.getEntry(b, -1, LockType.NONE, new ArrayList<Lock>()),
+    assertNull(cache.getEntry(b, -1),
       "Not expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.putEntry(testEntriesList.get(0), b, 1);
 
-    assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNotNull(cache.getEntry(b, 1),
       "Expected to find entry id " + Integer.toString(1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -268,9 +240,9 @@
   public void testGetEntryID()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -278,14 +250,14 @@
     assertEquals(cache.getEntryID(testEntriesList.get(0).getDN()), -1,
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.putEntry(testEntriesList.get(0), b, 1);
 
     assertEquals(cache.getEntryID(testEntriesList.get(0).getDN()), 1,
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -298,13 +270,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testPutEntry()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -314,12 +285,12 @@
     assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNotNull(cache.getEntry(b, 1),
       "Expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -332,13 +303,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testPutEntryIfAbsent()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -346,22 +316,22 @@
     assertTrue(cache.putEntryIfAbsent(testEntriesList.get(0), b, 1),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     assertFalse(cache.putEntryIfAbsent(testEntriesList.get(0), b, 1),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNotNull(cache.getEntry(b, 1),
       "Expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -374,13 +344,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testRemoveEntry()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -392,12 +361,12 @@
     assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNull(cache.getEntry(b, 1),
       "Not expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -410,13 +379,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testClear()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -428,12 +396,12 @@
     assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNull(cache.getEntry(b, 1),
       "Not expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -446,13 +414,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testClearBackend()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -463,20 +430,20 @@
     cache.putEntry(testEntriesList.get(1), c, 1);
     cache.clearBackend(b);
 
-    assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNull(cache.getEntry(b, 1),
       "Not expected to find entry id " + Integer.toString(1) + " on backend " +
       b.getBackendID() + " in the cache.  Cache contents:" +
-      ServerConstants.EOL + toVerboseString());
+      ServerConstants.EOL + cache.toVerboseString());
 
     assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNotNull(cache.getEntry(c, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNotNull(cache.getEntry(c, 1),
       "Expected to find entry id " + Integer.toString(1) + " on backend " +
       c.getBackendID() + " in the cache.  Cache contents:" +
-      ServerConstants.EOL + toVerboseString());
+      ServerConstants.EOL + cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -489,13 +456,12 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testClearSubtree()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -512,17 +478,17 @@
     assertNull(cache.getEntry(testEntriesList.get(0).getDN()),
       "Not expected to find " + testEntriesList.get(0).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
-    assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()),
+    assertNull(cache.getEntry(b, 1),
       "Not expected to find entry id " + Integer.toString(-1) +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     assertNotNull(cache.getEntry(testEntry.getDN()),
       "Expected to find " + testEntry.getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     // Clear the cache so that other tests can start from scratch.
     cache.clear();
@@ -538,9 +504,9 @@
   public void testHandleLowMemory()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     cache.handleLowMemory();
 
@@ -556,7 +522,6 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @SuppressWarnings("unchecked")
   public void testCacheConcurrency()
          throws Exception
   {
@@ -568,7 +533,7 @@
         cache.getEntry(testEntriesList.get(i).getDN());
         cache.removeEntry(testEntriesList.get(i).getDN());
         cache.putEntryIfAbsent(testEntriesList.get(i), b, i);
-        cache.getEntry(b, i, LockType.NONE, new ArrayList<Lock>());
+        cache.getEntry(b, i);
       }
     }
   }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java
index cc56aaa..1c99632 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions copyright 2011 ForgeRock AS
+ *      Portions copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -59,12 +59,12 @@
  */
 @Test(groups = "entrycache", sequential=true)
 public class DefaultEntryCacheTestCase
-       extends CommonEntryCacheTestCase
+       extends CommonEntryCacheTestCase<EntryCacheCfg>
 {
   // Entry cache implementations participating in this test.
-  private EntryCache softRefCache = null;
-  private EntryCache fifoCache = null;
-  private EntryCache fsCache = null;
+  private SoftReferenceEntryCache softRefCache = null;
+  private FIFOEntryCache fifoCache = null;
+  private FileSystemEntryCache fsCache = null;
 
   // ... and their configuration entries.
   Entry cacheSoftReferenceConfigEntry = null;
@@ -113,7 +113,7 @@
       "ds-cfg-include-filter: uid=test1*",
       "ds-cfg-exclude-filter: uid=test0*");
     softRefCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheSoftReferenceConfigEntry));
+      SoftReferenceEntryCacheCfgDefn.getInstance(), cacheSoftReferenceConfigEntry));
     cacheOrderMap.put(1, softRefCache);
 
     fifoCache = new FIFOEntryCache();
@@ -130,7 +130,7 @@
       "ds-cfg-include-filter: uid=test2*",
       "ds-cfg-exclude-filter: uid=test0*");
     fifoCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheFIFOConfigEntry));
+      FIFOEntryCacheCfgDefn.getInstance(), cacheFIFOConfigEntry));
     cacheOrderMap.put(2, fifoCache);
 
     File cacheDirectory = TestCaseUtils.createTemporaryDirectory("opendj-test");
@@ -151,7 +151,7 @@
       "ds-cfg-cache-directory: " + cacheDirectory.getAbsolutePath());
 
     fsCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheFSConfigEntry));
+      FileSystemEntryCacheCfgDefn.getInstance(), cacheFSConfigEntry));
     cacheOrderMap.put(3, fsCache);
 
     // Plug all cache implementations into default entry cache.
@@ -265,7 +265,7 @@
     }
 
     // Finilize all entry cache implementations.
-    for (EntryCache entryCache : cacheOrderMap.values()) {
+    for (EntryCache<?> entryCache : cacheOrderMap.values()) {
       entryCache.finalizeEntryCache();
     }
 
@@ -445,9 +445,9 @@
   public void testCacheLevels()
          throws Exception
   {
-    assertNull(toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      toVerboseString());
+      cache.toVerboseString());
 
     TestCaseUtils.initializeTestBackend(false);
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -466,19 +466,19 @@
         "Expected to find " +
         testSoftRefEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
       assertNotNull(super.cache.getEntry(
         testFIFOEntriesList.get(0).getDN()),
         "Expected to find " +
         testFIFOEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
       assertNotNull(super.cache.getEntry(
         testFSEntriesList.get(0).getDN()),
         "Expected to find " +
         testFSEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
     }
 
     // Ensure all test entries landed on their levels.
@@ -488,19 +488,19 @@
         "Expected to find " +
         testSoftRefEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
       assertNotNull(fifoCache.getEntry(
         testFIFOEntriesList.get(0).getDN()),
         "Expected to find " +
         testFIFOEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
       assertNotNull(fsCache.getEntry(
         testFSEntriesList.get(0).getDN()),
         "Expected to find " +
         testFSEntriesList.get(0).getDN().toString() +
         " in the cache.  Cache contents:" +
-        ServerConstants.EOL + toVerboseString());
+        ServerConstants.EOL + cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
@@ -513,9 +513,9 @@
   public void cacheConcurrencySetup()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java
index 4d2cf6a..b6f94c1 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.extensions;
 
@@ -33,6 +34,7 @@
 import org.opends.server.admin.server.AdminTestCaseUtils;
 import org.testng.annotations.BeforeClass;
 import org.opends.server.admin.std.meta.*;
+import org.opends.server.admin.std.server.FIFOEntryCacheCfg;
 import org.opends.server.api.Backend;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DN;
@@ -51,7 +53,7 @@
  */
 @Test(groups = "entrycache", sequential=true)
 public class FIFOEntryCacheTestCase
-       extends CommonEntryCacheTestCase
+       extends CommonEntryCacheTestCase<FIFOEntryCacheCfg>
 {
   /**
    * Initialize the entry cache test.
@@ -59,7 +61,6 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @BeforeClass()
-  @SuppressWarnings("unchecked")
   public void entryCacheTestInit()
          throws Exception
   {
@@ -78,7 +79,7 @@
       "ds-cfg-enabled: true",
       "ds-cfg-max-entries: " + Integer.toString(super.MAXENTRIES));
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheConfigEntry);
+      FIFOEntryCacheCfgDefn.getInstance(), cacheConfigEntry);
 
     // Force GC to make sure we have enough memory for
     // the cache capping constraints to work properly.
@@ -289,9 +290,9 @@
   public void testHandleLowMemory()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
 
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
 
@@ -308,7 +309,7 @@
         super.testEntriesList.get(i).getDN()), "Not expected to find " +
         super.testEntriesList.get(i).getDN().toString() + " in the " +
         "cache.  Cache contents:" + ServerConstants.EOL +
-        super.toVerboseString());
+        cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
@@ -321,9 +322,9 @@
   public void cacheConcurrencySetup()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
@@ -361,9 +362,9 @@
   public void testCacheRotation()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
 
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
 
@@ -377,7 +378,7 @@
         super.testEntriesList.get(i).getDN()), "Not expected to find " +
         super.testEntriesList.get(i).getDN().toString() + " in the " +
         "cache.  Cache contents:" + ServerConstants.EOL +
-        super.toVerboseString());
+        cache.toVerboseString());
     }
 
     // Make sure remaining NUMTESTENTRIES are still in the cache.
@@ -389,7 +390,7 @@
         super.testEntriesList.get(i).getDN()), "Expected to find " +
         super.testEntriesList.get(i).getDN().toString() + " in the " +
         "cache.  Cache contents:" + ServerConstants.EOL +
-        super.toVerboseString());
+        cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java
index 514c811..1c23cfb 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2007-2008 Sun Microsystems, Inc.
- *      Portions copyright 2011 ForgeRock AS
+ *      Portions copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -56,7 +56,7 @@
  */
 @Test(groups = "entrycache", sequential=true)
 public class FileSystemEntryCacheTestCase
-       extends CommonEntryCacheTestCase
+       extends CommonEntryCacheTestCase<FileSystemEntryCacheCfg>
 {
   /**
    * Configuration entry for this cache.
@@ -71,7 +71,6 @@
   /**
    * Utility method to restore default cache configuration.
    */
-  @SuppressWarnings("unchecked")
   private void restoreCacheDefaults()
           throws Exception
   {
@@ -80,16 +79,16 @@
 
     // Configure this cache back to defaults.
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheConfigEntry);
+      FileSystemEntryCacheCfgDefn.getInstance(), cacheConfigEntry);
 
     // Initialize the cache.
     super.cache = new FileSystemEntryCache();
     super.cache.initializeEntryCache(configuration);
 
     // Make sure the cache is empty.
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
@@ -97,7 +96,6 @@
   /**
    * Utility method to configure the cache with LRU access order.
    */
-  @SuppressWarnings("unchecked")
   private void setupLRUCache()
           throws Exception
   {
@@ -110,16 +108,16 @@
       Attributes.create("ds-cfg-cache-type", "LRU");
     newCacheConfigEntry.addAttribute(cacheConfigTypeAttr, null);
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), newCacheConfigEntry);
+        FileSystemEntryCacheCfgDefn.getInstance(), newCacheConfigEntry);
 
     // Initialize the cache.
     super.cache = new FileSystemEntryCache();
     super.cache.initializeEntryCache(configuration);
 
     // Make sure the cache is empty.
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
@@ -127,7 +125,6 @@
   /**
    * Utility method to initialize persistent cache.
    */
-  @SuppressWarnings("unchecked")
   private void persistentCacheSetup()
           throws Exception
   {
@@ -154,16 +151,16 @@
       Attributes.create("ds-cfg-max-entries", Integer.toString(super.MAXENTRIES));
     newCacheConfigEntry.removeAttribute(cacheConfigMaxAttr, null);
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), newCacheConfigEntry);
+        FileSystemEntryCacheCfgDefn.getInstance(), newCacheConfigEntry);
 
     // Initialize the cache.
     super.cache = new FileSystemEntryCache();
     super.cache.initializeEntryCache(configuration);
 
     // Make sure the cache is empty.
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
@@ -190,7 +187,6 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @BeforeClass
-  @SuppressWarnings("unchecked")
   public void entryCacheTestInit()
          throws Exception
   {
@@ -212,7 +208,7 @@
       "ds-cfg-max-entries: " + Integer.toString(super.MAXENTRIES),
       "ds-cfg-cache-directory: " + cacheDirectory.getAbsolutePath());
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheConfigEntry);
+        FileSystemEntryCacheCfgDefn.getInstance(), cacheConfigEntry);
 
     // Force GC to make sure we have enough memory for
     // the cache capping constraints to work properly.
@@ -270,8 +266,7 @@
     super.cache.finalizeEntryCache();
 
     // Remove default FS cache JE environment.
-    FileSystemEntryCacheCfg config =
-      (FileSystemEntryCacheCfg) super.configuration;
+    FileSystemEntryCacheCfg config = super.configuration;
     TestCaseUtils.deleteDirectory(new File(config.getCacheDirectory()));
   }
 
@@ -437,9 +432,9 @@
   public void cacheConcurrencySetup()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 
@@ -518,9 +513,9 @@
   public void testCacheRotationFIFO()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
 
     // Put some test entries in the cache.
     Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
@@ -534,7 +529,7 @@
         super.testEntriesList.get(i).getDN()), "Not expected to find " +
         super.testEntriesList.get(i).getDN().toString() + " in the " +
         "cache.  Cache contents:" + ServerConstants.EOL +
-        super.toVerboseString());
+        cache.toVerboseString());
     }
 
     // Make sure remaining NUMTESTENTRIES are still in the cache.
@@ -546,7 +541,7 @@
         super.testEntriesList.get(i).getDN()), "Expected to find " +
         super.testEntriesList.get(i).getDN().toString() + " in the " +
         "cache.  Cache contents:" + ServerConstants.EOL +
-        super.toVerboseString());
+        cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
@@ -559,7 +554,6 @@
    * Tests LRU cache rotation on specific number of entries.
    */
   @Test(groups = "slow")
-  @SuppressWarnings("unchecked")
   public void testCacheRotationLRU()
          throws Exception
   {
@@ -584,7 +578,7 @@
           "Expected to find " +
           super.testEntriesList.get(i).getDN().toString() + " in the " +
           "cache.  Cache contents:" + ServerConstants.EOL +
-          super.toVerboseString());
+          cache.toVerboseString());
     }
 
     // Plus the last cache entry added.
@@ -593,7 +587,7 @@
       "Expected to find " +
       super.testEntriesList.get(super.NUMTESTENTRIES - 1).getDN().toString() +
       " in the cache.  Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
 
     // And remaining NUMTESTENTRIES - 1 are now rotated.
     for(int i = (super.MAXENTRIES - 1);
@@ -604,7 +598,7 @@
           "Not expected to find " +
           super.testEntriesList.get(i).getDN().toString() + " in the " +
           "cache.  Cache contents:" + ServerConstants.EOL +
-          super.toVerboseString());
+          cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
@@ -620,7 +614,6 @@
    * Tests cache persistence with consistent backend.
    */
   @Test(groups = "slow")
-  @SuppressWarnings("unchecked")
   public void testCachePersistence()
          throws Exception
   {
@@ -653,7 +646,7 @@
           "Expected to find " +
           super.testEntriesList.get(i).getDN().toString() + " in the " +
           "cache.  Cache contents:" + ServerConstants.EOL +
-          super.toVerboseString());
+          cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
@@ -673,7 +666,6 @@
    * Tests cache persistence with inconsistent backend.
    */
   @Test(groups = "slow")
-  @SuppressWarnings("unchecked")
   public void testCachePersistenceInconsistent()
          throws Exception
   {
@@ -719,7 +711,7 @@
           "Not expected to find " +
           super.testEntriesList.get(i).getDN().toString() + " in the " +
           "cache.  Cache contents:" + ServerConstants.EOL +
-          super.toVerboseString());
+          cache.toVerboseString());
     }
 
     // Clear the cache so that other tests can start from scratch.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java
index 3e77ae9..c94b143 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 package org.opends.server.extensions;
 
@@ -33,6 +34,7 @@
 import org.opends.server.admin.server.AdminTestCaseUtils;
 import org.testng.annotations.BeforeClass;
 import org.opends.server.admin.std.meta.*;
+import org.opends.server.admin.std.server.SoftReferenceEntryCacheCfg;
 import org.opends.server.types.Entry;
 import org.opends.server.util.ServerConstants;
 import org.testng.annotations.AfterClass;
@@ -48,7 +50,7 @@
  */
 @Test(groups = "entrycache", sequential=true)
 public class SoftReferenceEntryCacheTestCase
-       extends CommonEntryCacheTestCase
+       extends CommonEntryCacheTestCase<SoftReferenceEntryCacheCfg>
 {
   /**
    * Initialize the entry cache test.
@@ -56,7 +58,6 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @BeforeClass()
-  @SuppressWarnings("unchecked")
   public void entryCacheTestInit()
          throws Exception
   {
@@ -75,7 +76,7 @@
       "org.opends.server.extensions.SoftReferenceEntryCache",
       "ds-cfg-enabled: true");
     super.configuration = AdminTestCaseUtils.getConfiguration(
-      EntryCacheCfgDefn.getInstance(), cacheConfigEntry);
+      SoftReferenceEntryCacheCfgDefn.getInstance(), cacheConfigEntry);
 
     // Force GC to make sure we have enough memory for
     // the cache capping constraints to work properly.
@@ -295,9 +296,9 @@
   public void cacheConcurrencySetup()
          throws Exception
   {
-    assertNull(super.toVerboseString(),
+    assertNull(cache.toVerboseString(),
       "Expected empty cache.  " + "Cache contents:" + ServerConstants.EOL +
-      super.toVerboseString());
+      cache.toVerboseString());
   }
 
 

--
Gitblit v1.10.0