From bff247202b2e096249150884a93601b19e836c9a Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Wed, 02 May 2007 08:29:33 +0000
Subject: [PATCH] Issue #1560 - Migrate some objects to the new admin framework: - Entry Cache - Account Status Notification Handler - Password Storage Scheme

---
 opends/src/server/org/opends/server/extensions/FIFOEntryCache.java | 1100 ++++++++++-----------------------------------------------
 1 files changed, 199 insertions(+), 901 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java b/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
index 70c174f..53bfa87 100644
--- a/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
+++ b/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
@@ -41,10 +41,10 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.opends.server.api.Backend;
-import org.opends.server.api.ConfigurableComponent;
 import org.opends.server.api.EntryCache;
+import org.opends.server.admin.std.server.FIFOEntryCacheCfg;
+import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.config.ConfigAttribute;
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.IntegerConfigAttribute;
 import org.opends.server.config.IntegerWithUnitConfigAttribute;
@@ -54,8 +54,6 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
-import org.opends.server.types.ErrorLogCategory;
-import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.InitializationException;
 import org.opends.server.types.LockManager;
 import org.opends.server.types.LockType;
@@ -66,11 +64,9 @@
 import static org.opends.server.loggers.debug.DebugLogger.debugCaught;
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
 import org.opends.server.types.DebugLogLevel;
-import static org.opends.server.loggers.Error.*;
 import static org.opends.server.messages.ExtensionsMessages.*;
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
 
 
 
@@ -100,8 +96,8 @@
  * of the given filters will be stored in the cache.
  */
 public class FIFOEntryCache
-       extends EntryCache
-       implements ConfigurableComponent
+       extends EntryCache <FIFOEntryCacheCfg>
+       implements ConfigurationChangeListener<FIFOEntryCacheCfg>
 {
 
 
@@ -179,291 +175,35 @@
 
 
   /**
-   * Initializes this entry cache implementation so that it will be available
-   * for storing and retrieving entries.
-   *
-   * @param  configEntry  The configuration entry containing the settings to use
-   *                      for this entry cache.
-   *
-   * @throws  ConfigException  If there is a problem with the provided
-   *                           configuration entry that would prevent this
-   *                           entry cache from being used.
-   *
-   * @throws  InitializationException  If a problem occurs during the
-   *                                   initialization process that is not
-   *                                   related to the configuration.
+   * {@inheritDoc}
    */
-  public void initializeEntryCache(ConfigEntry configEntry)
-         throws ConfigException, InitializationException
+  public void initializeEntryCache(
+      FIFOEntryCacheCfg configuration
+      )
+      throws ConfigException, InitializationException
   {
-    configEntryDN = configEntry.getDN();
-
+    configuration.addFIFOChangeListener (this);
+    configEntryDN = configuration.dn();
 
     // Initialize the cache structures.
     idMap     = new HashMap<Backend,HashMap<Long,CacheEntry>>();
     dnMap     = new LinkedHashMap<DN,CacheEntry>();
     cacheLock = new ReentrantLock();
-    runtime   = Runtime.getRuntime();
 
 
-    // Determine the maximum memory usage as a percentage of the total JVM
-    // memory.
-    maxMemoryPercent = DEFAULT_FIFOCACHE_MAX_MEMORY_PCT;
-    int msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_MEMORY_PCT;
-    IntegerConfigAttribute maxMemoryPctStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_MEMORY_PCT,
-                                    getMessage(msgID), true, false, false, true,
-                                    1, true, 100);
-    try
-    {
-      IntegerConfigAttribute maxMemoryPctAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxMemoryPctStub);
-      if (maxMemoryPctAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        maxMemoryPercent = maxMemoryPctAttr.activeIntValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // Log an error message.
-      logError(ErrorLogCategory.CONFIGURATION, ErrorLogSeverity.SEVERE_ERROR,
-               MSGID_FIFOCACHE_CANNOT_DETERMINE_MAX_MEMORY_PCT,
-               String.valueOf(configEntryDN), getExceptionMessage(e),
-               maxMemoryPercent);
-    }
-
-    maxAllowedMemory = runtime.maxMemory() / 100 * maxMemoryPercent;
-
-
-    // Determine the maximum number of entries that we will allow in the cache.
-    maxEntries = DEFAULT_FIFOCACHE_MAX_ENTRIES;
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_ENTRIES;
-    IntegerConfigAttribute maxEntriesStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_ENTRIES,
-                                    getMessage(msgID), true, false, false,
-                                    true, 0, false, 0);
-    try
-    {
-      IntegerConfigAttribute maxEntriesAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxEntriesStub);
-      if (maxEntriesAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        maxEntries = maxEntriesAttr.activeValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // Log an error message.
-      logError(ErrorLogCategory.CONFIGURATION, ErrorLogSeverity.SEVERE_ERROR,
-               MSGID_FIFOCACHE_CANNOT_DETERMINE_MAX_ENTRIES,
-               String.valueOf(configEntryDN), getExceptionMessage(e));
-    }
-
-
-    // Determine the lock timeout to use when interacting with the lock manager.
-    lockTimeout = DEFAULT_FIFOCACHE_LOCK_TIMEOUT;
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_LOCK_TIMEOUT;
-    IntegerWithUnitConfigAttribute lockTimeoutStub =
-         new IntegerWithUnitConfigAttribute(ATTR_FIFOCACHE_LOCK_TIMEOUT,
-                                            getMessage(msgID), false, timeUnits,
-                                            true, 0, false, 0);
-    try
-    {
-      IntegerWithUnitConfigAttribute lockTimeoutAttr =
-             (IntegerWithUnitConfigAttribute)
-             configEntry.getConfigAttribute(lockTimeoutStub);
-      if (lockTimeoutAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        lockTimeout = lockTimeoutAttr.activeCalculatedValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // Log an error message.
-      logError(ErrorLogCategory.CONFIGURATION, ErrorLogSeverity.SEVERE_ERROR,
-               MSGID_FIFOCACHE_CANNOT_DETERMINE_LOCK_TIMEOUT,
-               String.valueOf(configEntryDN), getExceptionMessage(e),
-               lockTimeout);
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be included in the cache.
-    includeFilters = new HashSet<SearchFilter>();
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_INCLUDE_FILTERS;
-    StringConfigAttribute includeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_INCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute includeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(includeStub);
-      if (includeAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        List<String> filterStrings = includeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no include filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              includeFilters.add(
-                   SearchFilter.createFilterFromString(filterString));
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter.  Log a warning and continue.
-              logError(ErrorLogCategory.CONFIGURATION,
-                       ErrorLogSeverity.SEVERE_WARNING,
-                       MSGID_FIFOCACHE_CANNOT_DECODE_INCLUDE_FILTER,
-                       String.valueOf(configEntryDN), filterString,
-                       getExceptionMessage(e));
-            }
-          }
-
-          if (includeFilters.isEmpty())
-          {
-            logError(ErrorLogCategory.CONFIGURATION,
-                     ErrorLogSeverity.SEVERE_ERROR,
-                     MSGID_FIFOCACHE_CANNOT_DECODE_ANY_INCLUDE_FILTERS,
-                     String.valueOf(configEntryDN));
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // Log an error message.
-      logError(ErrorLogCategory.CONFIGURATION, ErrorLogSeverity.SEVERE_ERROR,
-               MSGID_FIFOCACHE_CANNOT_DETERMINE_INCLUDE_FILTERS,
-               String.valueOf(configEntryDN), getExceptionMessage(e));
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be excluded from the cache.
-    excludeFilters = new HashSet<SearchFilter>();
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_EXCLUDE_FILTERS;
-    StringConfigAttribute excludeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_EXCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute excludeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(excludeStub);
-      if (excludeAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        List<String> filterStrings = excludeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no exclude filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              excludeFilters.add(
-                   SearchFilter.createFilterFromString(filterString));
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter.  Log a warning and continue.
-              logError(ErrorLogCategory.CONFIGURATION,
-                       ErrorLogSeverity.SEVERE_WARNING,
-                       MSGID_FIFOCACHE_CANNOT_DECODE_EXCLUDE_FILTER,
-                       String.valueOf(configEntryDN), filterString,
-                       getExceptionMessage(e));
-            }
-          }
-
-          if (excludeFilters.isEmpty())
-          {
-            logError(ErrorLogCategory.CONFIGURATION,
-                     ErrorLogSeverity.SEVERE_ERROR,
-                     MSGID_FIFOCACHE_CANNOT_DECODE_ANY_EXCLUDE_FILTERS,
-                     String.valueOf(configEntryDN));
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // Log an error message.
-      logError(ErrorLogCategory.CONFIGURATION, ErrorLogSeverity.SEVERE_ERROR,
-               MSGID_FIFOCACHE_CANNOT_DETERMINE_EXCLUDE_FILTERS,
-               String.valueOf(configEntryDN), getExceptionMessage(e));
-    }
+    // Read configuration and apply changes.
+    boolean applyChanges = true;
+    EntryCacheCommon.ConfigErrorHandler errorHandler =
+      EntryCacheCommon.getConfigErrorHandler (
+          EntryCacheCommon.ConfigPhase.PHASE_INIT, null, null
+          );
+    processEntryCacheConfig (configuration, applyChanges, errorHandler);
   }
 
 
 
   /**
-   * Performs any necessary cleanup work (e.g., flushing all cached entries and
-   * releasing any other held resources) that should be performed when the
-   * server is to be shut down or the entry cache destroyed or replaced.
+   * {@inheritDoc}
    */
   public void finalizeEntryCache()
   {
@@ -492,14 +232,7 @@
 
 
   /**
-   * Indicates whether the entry cache currently contains the entry with the
-   * specified DN.  This method may be called without holding any locks if a
-   * point-in-time check is all that is required.
-   *
-   * @param  entryDN  The DN for which to make the determination.
-   *
-   * @return  <CODE>true</CODE> if the entry cache currently contains the entry
-   *          with the specified DN, or <CODE>false</CODE> if not.
+   * {@inheritDoc}
    */
   public boolean containsEntry(DN entryDN)
   {
@@ -510,14 +243,7 @@
 
 
   /**
-   * 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.
-   *
-   * @param  entryDN  The DN of the entry to retrieve.
-   *
-   * @return  The requested entry if it is present in the cache, or
-   *          <CODE>null</CODE> if it is not present.
+   * {@inheritDoc}
    */
   public Entry getEntry(DN entryDN)
   {
@@ -536,14 +262,7 @@
 
 
   /**
-   * Retrieves the entry ID for 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.
-   *
-   * @param  entryDN  The DN of the entry for which to retrieve the entry ID.
-   *
-   * @return  The entry ID for the requested entry, or -1 if it is not present
-   *          in the cache.
+   * {@inheritDoc}
    */
   public long getEntryID(DN entryDN)
   {
@@ -562,20 +281,7 @@
 
 
   /**
-   * 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.
-   *
-   * @param  entryDN   The DN of the entry to retrieve.
-   * @param  lockType  The type of lock to obtain (it may be <CODE>NONE</CODE>).
-   * @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</CODE>).
-   *
-   * @return  The requested entry if it is present in the cache, or
-   *          <CODE>null</CODE> if it is not present.
+   * {@inheritDoc}
    */
   public Entry getEntry(DN entryDN, LockType lockType, List<Lock> lockList)
   {
@@ -684,22 +390,7 @@
 
 
   /**
-   * 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.
-   *
-   * @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</CODE>).
-   * @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</CODE>).
-   *
-   * @return  The requested entry if it is present in the cache, or
-   *          <CODE>null</CODE> if it is not present.
+   * {@inheritDoc}
    */
   public Entry getEntry(Backend backend, long entryID, LockType lockType,
                         List<Lock> lockList)
@@ -820,14 +511,7 @@
 
 
   /**
-   * Stores the provided entry in the cache.  Note that the mechanism that it
-   * uses to achieve this is implementation-dependent, and it is acceptable for
-   * the entry to not actually be stored in any cache.
-   *
-   * @param  entry    The entry to store in the cache.
-   * @param  backend  The backend with which the entry is associated.
-   * @param  entryID  The entry ID within the provided backend that uniquely
-   *                  identifies the specified entry.
+   * {@inheritDoc}
    */
   public void putEntry(Entry entry, Backend backend, long entryID)
   {
@@ -999,22 +683,7 @@
 
 
   /**
-   * Stores the provided entry in the cache only if it does not conflict with an
-   * entry that already exists.  Note that the mechanism that it uses to achieve
-   * this is implementation-dependent, and it is acceptable for the entry to not
-   * actually be stored in any cache.  However, this method must not overwrite
-   * an existing version of the entry.
-   *
-   * @param  entry    The entry to store in the cache.
-   * @param  backend  The backend with which the entry is associated.
-   * @param  entryID  The entry ID within the provided backend that uniquely
-   *                  identifies the specified entry.
-   *
-   * @return  <CODE>false</CODE> if an existing entry or some other problem
-   *          prevented the method from completing successfully, or
-   *          <CODE>true</CODE> if there was no conflict and the entry was
-   *          either stored or the cache determined that this entry should never
-   *          be cached for some reason.
+   * {@inheritDoc}
    */
   public boolean putEntryIfAbsent(Entry entry, Backend backend, long entryID)
   {
@@ -1201,9 +870,7 @@
 
 
   /**
-   * Removes the specified entry from the cache.
-   *
-   * @param  entryDN  The DN of the entry to remove from the cache.
+   * {@inheritDoc}
    */
   public void removeEntry(DN entryDN)
   {
@@ -1257,8 +924,7 @@
 
 
   /**
-   * Removes all entries from the cache.  The cache should still be available
-   * for future use.
+   * {@inheritDoc}
    */
   public void clear()
   {
@@ -1295,10 +961,7 @@
 
 
   /**
-   * Removes all entries from the cache that are associated with the provided
-   * backend.
-   *
-   * @param  backend  The backend for which to flush the associated entries.
+   * {@inheritDoc}
    */
   public void clearBackend(Backend backend)
   {
@@ -1359,9 +1022,7 @@
 
 
   /**
-   * Removes all entries from the cache that are below the provided DN.
-   *
-   * @param  baseDN  The base DN below which all entries should be flushed.
+   * {@inheritDoc}
    */
   public void clearSubtree(DN baseDN)
   {
@@ -1403,11 +1064,7 @@
 
 
   /**
-   * Clears all entries at or below the specified base DN that are associated
-   * with the given backend.  The caller must already hold the cache lock.
-   *
-   * @param  baseDN   The base DN below which all entries should be flushed.
-   * @param  backend  The backend for which to remove the appropriate entries.
+   * {@inheritDoc}
    */
   private void clearSubtree(DN baseDN, Backend backend)
   {
@@ -1474,10 +1131,7 @@
 
 
   /**
-   * Attempts to react to a scenario in which it is determined that the system
-   * is running low on available memory.  In this case, the entry cache should
-   * attempt to free some memory if possible to try to avoid out of memory
-   * errors.
+   * {@inheritDoc}
    */
   public void handleLowMemory()
   {
@@ -1618,235 +1272,55 @@
 
 
   /**
-   * Indicates whether the provided configuration entry has an acceptable
-   * configuration for this component.  If it does not, then detailed
-   * information about the problem(s) should be added to the provided list.
-   *
-   * @param  configEntry          The configuration entry for which to make the
-   *                              determination.
-   * @param  unacceptableReasons  A list that can be used to hold messages about
-   *                              why the provided entry does not have an
-   *                              acceptable configuration.
-   *
-   * @return  <CODE>true</CODE> if the provided entry has an acceptable
-   *          configuration for this component, or <CODE>false</CODE> if not.
+   * {@inheritDoc}
    */
-  public boolean hasAcceptableConfiguration(ConfigEntry configEntry,
-                                            List<String> unacceptableReasons)
+  public boolean isConfigurationChangeAcceptable(
+      FIFOEntryCacheCfg configuration,
+      List<String>      unacceptableReasons
+      )
   {
-    // Start out assuming that the configuration is valid.
-    boolean configIsAcceptable = true;
+    // Make sure that we can process the defined character sets.  If so, then
+    // we'll accept the new configuration.
+    boolean applyChanges = false;
+    EntryCacheCommon.ConfigErrorHandler errorHandler =
+      EntryCacheCommon.getConfigErrorHandler (
+          EntryCacheCommon.ConfigPhase.PHASE_ACCEPTABLE,
+          unacceptableReasons,
+          null
+        );
+    processEntryCacheConfig (configuration, applyChanges, errorHandler);
+
+    return errorHandler.getIsAcceptable();
+  }
 
 
-    // Determine the maximum memory usage as a percentage of the total JVM
-    // memory.
-    int msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_MEMORY_PCT;
-    IntegerConfigAttribute maxMemoryPctStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_MEMORY_PCT,
-                                    getMessage(msgID), true, false, false, true,
-                                    1, true, 100);
-    try
-    {
-      IntegerConfigAttribute maxMemoryPctAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxMemoryPctStub);
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
 
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_MAX_MEMORY_PCT;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         getExceptionMessage(e)));
-      configIsAcceptable = false;
-    }
+  /**
+   * {@inheritDoc}
+   */
+  public ConfigChangeResult applyConfigurationChange(
+      FIFOEntryCacheCfg configuration
+      )
+  {
+    // Make sure that we can process the defined character sets.  If so, then
+    // activate the new configuration.
+    boolean applyChanges = false;
+    ArrayList<String> errorMessages = new ArrayList<String>();
+    EntryCacheCommon.ConfigErrorHandler errorHandler =
+      EntryCacheCommon.getConfigErrorHandler (
+          EntryCacheCommon.ConfigPhase.PHASE_APPLY, null, errorMessages
+          );
+    processEntryCacheConfig (configuration, applyChanges, errorHandler);
 
 
-    // Determine the maximum number of entries that we will allow in the cache.
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_ENTRIES;
-    IntegerConfigAttribute maxEntriesStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_ENTRIES,
-                                    getMessage(msgID), true, false, false,
-                                    true, 0, false, 0);
-    try
-    {
-      IntegerConfigAttribute maxEntriesAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxEntriesStub);
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
+    boolean adminActionRequired = false;
+    ConfigChangeResult changeResult = new ConfigChangeResult(
+        errorHandler.getResultCode(),
+        adminActionRequired,
+        errorHandler.getErrorMessages()
+        );
 
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_MAX_ENTRIES;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         getExceptionMessage(e)));
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the lock timeout to use when interacting with the lock manager.
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_LOCK_TIMEOUT;
-    IntegerWithUnitConfigAttribute lockTimeoutStub =
-         new IntegerWithUnitConfigAttribute(ATTR_FIFOCACHE_LOCK_TIMEOUT,
-                                            getMessage(msgID), false, timeUnits,
-                                            true, 0, false, 0);
-    try
-    {
-      IntegerWithUnitConfigAttribute lockTimeoutAttr =
-             (IntegerWithUnitConfigAttribute)
-             configEntry.getConfigAttribute(lockTimeoutStub);
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_LOCK_TIMEOUT;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         getExceptionMessage(e)));
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be included in the cache.
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_INCLUDE_FILTERS;
-    StringConfigAttribute includeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_INCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute includeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(includeStub);
-      if (includeAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        List<String> filterStrings = includeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no include filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              SearchFilter.createFilterFromString(filterString);
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter, so it isn't valid.
-              msgID = MSGID_FIFOCACHE_INVALID_INCLUDE_FILTER;
-              unacceptableReasons.add(getMessage(msgID,
-                                           String.valueOf(configEntryDN),
-                                            filterString,
-                                            getExceptionMessage(e)));
-              configIsAcceptable = false;
-            }
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_INCLUDE_FILTERS;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         getExceptionMessage(e)));
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be excluded from the cache.
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_EXCLUDE_FILTERS;
-    StringConfigAttribute excludeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_EXCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute excludeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(excludeStub);
-      if (excludeAttr == null)
-      {
-        // This is fine -- we'll just use the default.
-      }
-      else
-      {
-        List<String> filterStrings = excludeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no exclude filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              SearchFilter.createFilterFromString(filterString);
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter, so it isn't valid.
-              msgID = MSGID_FIFOCACHE_INVALID_EXCLUDE_FILTER;
-              unacceptableReasons.add(getMessage(msgID,
-                                           String.valueOf(configEntryDN),
-                                            filterString,
-                                            getExceptionMessage(e)));
-              configIsAcceptable = false;
-            }
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_EXCLUDE_FILTERS;
-      unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                         getExceptionMessage(e)));
-      configIsAcceptable = false;
-    }
-
-
-    return configIsAcceptable;
+    return changeResult;
   }
 
 
@@ -1860,335 +1334,159 @@
    * successfully (and optionally about parameters that were not changed) should
    * also be included.
    *
-   * @param  configEntry      The entry containing the new configuration to
+   * @param  configuration    The entry containing the new configuration to
    *                          apply for this component.
    * @param  detailedResults  Indicates whether detailed information about the
    *                          processing should be added to the list.
    *
    * @return  Information about the result of the configuration update.
    */
-  public ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry,
-                                                  boolean detailedResults)
+  public ConfigChangeResult applyNewConfiguration(
+      FIFOEntryCacheCfg configuration,
+      boolean           detailedResults
+      )
   {
-    // Create a set of variables to use for the result.
-    ResultCode        resultCode          = ResultCode.SUCCESS;
-    boolean           adminActionRequired = false;
-    ArrayList<String> messages            = new ArrayList<String>();
-    boolean           configIsAcceptable  = true;
+    // Store the current value to detect changes.
+    long                  prevLockTimeout      = lockTimeout;
+    long                  prevMaxEntries       = maxEntries;
+    int                   prevMaxMemoryPercent = maxMemoryPercent;
+    HashSet<SearchFilter> prevIncludeFilters   = includeFilters;
+    HashSet<SearchFilter> prevExcludeFilters   = excludeFilters;
 
+    // Activate the new configuration.
+    ConfigChangeResult changeResult = applyConfigurationChange(configuration);
 
-    // Determine the maximum memory usage as a percentage of the total JVM
-    // memory.
-    int newMaxMemoryPercent = DEFAULT_FIFOCACHE_MAX_MEMORY_PCT;
-    int msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_MEMORY_PCT;
-    IntegerConfigAttribute maxMemoryPctStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_MEMORY_PCT,
-                                    getMessage(msgID), true, false, false, true,
-                                    1, true, 100);
-    try
+    // Add detailed messages if needed.
+    ResultCode resultCode = changeResult.getResultCode();
+    boolean configIsAcceptable = (resultCode == ResultCode.SUCCESS);
+    if (detailedResults && configIsAcceptable)
     {
-      IntegerConfigAttribute maxMemoryPctAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxMemoryPctStub);
-      if (maxMemoryPctAttr != null)
+      if (maxMemoryPercent != prevMaxMemoryPercent)
       {
-        newMaxMemoryPercent = maxMemoryPctAttr.pendingIntValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
+        changeResult.addMessage(
+            getMessage(
+                MSGID_FIFOCACHE_UPDATED_MAX_MEMORY_PCT,
+                maxMemoryPercent,
+                maxAllowedMemory));
       }
 
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_MAX_MEMORY_PCT;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-      resultCode = ResultCode.CONSTRAINT_VIOLATION;
-      configIsAcceptable = false;
-    }
 
-
-    // Determine the maximum number of entries that we will allow in the cache.
-    long newMaxEntries = DEFAULT_FIFOCACHE_MAX_ENTRIES;
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_MAX_ENTRIES;
-    IntegerConfigAttribute maxEntriesStub =
-         new IntegerConfigAttribute(ATTR_FIFOCACHE_MAX_ENTRIES,
-                                    getMessage(msgID), true, false, false,
-                                    true, 0, false, 0);
-    try
-    {
-      IntegerConfigAttribute maxEntriesAttr =
-           (IntegerConfigAttribute)
-           configEntry.getConfigAttribute(maxEntriesStub);
-      if (maxEntriesAttr != null)
+      if (maxEntries != prevMaxEntries)
       {
-        newMaxEntries = maxEntriesAttr.pendingValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
+        changeResult.addMessage(
+            getMessage (MSGID_FIFOCACHE_UPDATED_MAX_ENTRIES, maxEntries));
       }
 
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_MAX_ENTRIES;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-
-      if (resultCode == ResultCode.SUCCESS)
+      if (lockTimeout != prevLockTimeout)
       {
-        resultCode = ResultCode.CONSTRAINT_VIOLATION;
+        changeResult.addMessage(
+            getMessage (MSGID_FIFOCACHE_UPDATED_LOCK_TIMEOUT, lockTimeout));
       }
 
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the lock timeout to use when interacting with the lock manager.
-    long newLockTimeout = DEFAULT_FIFOCACHE_LOCK_TIMEOUT;
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_LOCK_TIMEOUT;
-    IntegerWithUnitConfigAttribute lockTimeoutStub =
-         new IntegerWithUnitConfigAttribute(ATTR_FIFOCACHE_LOCK_TIMEOUT,
-                                            getMessage(msgID), false, timeUnits,
-                                            true, 0, false, 0);
-    try
-    {
-      IntegerWithUnitConfigAttribute lockTimeoutAttr =
-             (IntegerWithUnitConfigAttribute)
-             configEntry.getConfigAttribute(lockTimeoutStub);
-      if (lockTimeoutAttr != null)
+      if (!includeFilters.equals(prevIncludeFilters))
       {
-        newLockTimeout = lockTimeoutAttr.pendingCalculatedValue();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
+        changeResult.addMessage(
+            getMessage (MSGID_FIFOCACHE_UPDATED_INCLUDE_FILTERS));
       }
 
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_LOCK_TIMEOUT;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-
-      if (resultCode == ResultCode.SUCCESS)
+      if (!excludeFilters.equals(prevExcludeFilters))
       {
-        resultCode = ResultCode.CONSTRAINT_VIOLATION;
-      }
-
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be included in the cache.
-    HashSet<SearchFilter> newIncludeFilters = new HashSet<SearchFilter>();
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_INCLUDE_FILTERS;
-    StringConfigAttribute includeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_INCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute includeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(includeStub);
-      if (includeAttr != null)
-      {
-        List<String> filterStrings = includeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no include filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              newIncludeFilters.add(
-                   SearchFilter.createFilterFromString(filterString));
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter, so it isn't valid.
-              msgID = MSGID_FIFOCACHE_INVALID_INCLUDE_FILTER;
-              messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                      filterString,
-                                      getExceptionMessage(e)));
-
-              if (resultCode == ResultCode.SUCCESS)
-              {
-                resultCode = ResultCode.INVALID_ATTRIBUTE_SYNTAX;
-              }
-
-              configIsAcceptable = false;
-            }
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_INCLUDE_FILTERS;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-
-      if (resultCode == ResultCode.SUCCESS)
-      {
-        resultCode = ResultCode.CONSTRAINT_VIOLATION;
-      }
-
-      configIsAcceptable = false;
-    }
-
-
-    // Determine the set of cache filters that can be used to control the
-    // entries that should be exclude from the cache.
-    HashSet<SearchFilter> newExcludeFilters = new HashSet<SearchFilter>();
-    msgID = MSGID_FIFOCACHE_DESCRIPTION_EXCLUDE_FILTERS;
-    StringConfigAttribute excludeStub =
-         new StringConfigAttribute(ATTR_FIFOCACHE_EXCLUDE_FILTER,
-                                   getMessage(msgID), false, true, false);
-    try
-    {
-      StringConfigAttribute excludeAttr =
-           (StringConfigAttribute) configEntry.getConfigAttribute(excludeStub);
-      if (excludeAttr != null)
-      {
-        List<String> filterStrings = excludeAttr.activeValues();
-        if ((filterStrings == null) || filterStrings.isEmpty())
-        {
-          // There are no exclude filters, so we'll allow anything by default.
-        }
-        else
-        {
-          for (String filterString : filterStrings)
-          {
-            try
-            {
-              newExcludeFilters.add(
-                   SearchFilter.createFilterFromString(filterString));
-            }
-            catch (Exception e)
-            {
-              if (debugEnabled())
-              {
-                debugCaught(DebugLogLevel.ERROR, e);
-              }
-
-              // We couldn't decode this filter, so it isn't valid.
-              msgID = MSGID_FIFOCACHE_INVALID_EXCLUDE_FILTER;
-              messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                                      filterString, getExceptionMessage(e)));
-
-              if (resultCode == ResultCode.SUCCESS)
-              {
-                resultCode = ResultCode.INVALID_ATTRIBUTE_SYNTAX;
-              }
-
-              configIsAcceptable = false;
-            }
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      // An error occurred, so the provided value must not be valid.
-      msgID = MSGID_FIFOCACHE_INVALID_EXCLUDE_FILTERS;
-      messages.add(getMessage(msgID, String.valueOf(configEntryDN),
-                              getExceptionMessage(e)));
-
-      if (resultCode == ResultCode.SUCCESS)
-      {
-        resultCode = ResultCode.CONSTRAINT_VIOLATION;
-      }
-
-      configIsAcceptable = false;
-    }
-
-
-    if (configIsAcceptable)
-    {
-      if (maxMemoryPercent != newMaxMemoryPercent)
-      {
-        maxMemoryPercent = newMaxMemoryPercent;
-        maxAllowedMemory = runtime.maxMemory() / 100 * maxMemoryPercent;
-
-        if (detailedResults)
-        {
-          messages.add(getMessage(MSGID_FIFOCACHE_UPDATED_MAX_MEMORY_PCT,
-                                  maxMemoryPercent, maxAllowedMemory));
-        }
-      }
-
-      if (maxEntries != newMaxEntries)
-      {
-        maxEntries = newMaxEntries;
-
-        if (detailedResults)
-        {
-          messages.add(getMessage(MSGID_FIFOCACHE_UPDATED_MAX_ENTRIES,
-                                  maxEntries));
-        }
-      }
-
-      if (lockTimeout != newLockTimeout)
-      {
-        lockTimeout = newLockTimeout;
-
-        if (detailedResults)
-        {
-          messages.add(getMessage(MSGID_FIFOCACHE_UPDATED_LOCK_TIMEOUT,
-                                  lockTimeout));
-        }
-      }
-
-      if (!includeFilters.equals(newIncludeFilters))
-      {
-        includeFilters = newIncludeFilters;
-
-        if (detailedResults)
-        {
-          messages.add(getMessage(MSGID_FIFOCACHE_UPDATED_INCLUDE_FILTERS));
-        }
-      }
-
-      if (!excludeFilters.equals(newExcludeFilters))
-      {
-        excludeFilters = newExcludeFilters;
-
-        if (detailedResults)
-        {
-          messages.add(getMessage(MSGID_FIFOCACHE_UPDATED_EXCLUDE_FILTERS));
-        }
+        changeResult.addMessage(
+            getMessage (MSGID_FIFOCACHE_UPDATED_EXCLUDE_FILTERS));
       }
     }
 
-
-    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+    return changeResult;
   }
+
+
+
+  /**
+   * Parses the provided configuration and configure the entry cache.
+   *
+   * @param configuration  The new configuration containing the changes.
+   * @param applyChanges   If true then take into account the new configuration.
+   * @param errorHandler   An handler used to report errors.
+   *
+   * @return  The mapping between strings of character set values and the
+   *          minimum number of characters required from those sets.
+   */
+  public boolean processEntryCacheConfig(
+      FIFOEntryCacheCfg                   configuration,
+      boolean                             applyChanges,
+      EntryCacheCommon.ConfigErrorHandler errorHandler
+      )
+  {
+    // Local variables to read configuration.
+    DN                    newConfigEntryDN;
+    long                  newLockTimeout;
+    long                  newMaxEntries;
+    int                   newMaxMemoryPercent;
+    long                  newMaxAllowedMemory;
+    HashSet<SearchFilter> newIncludeFilters = null;
+    HashSet<SearchFilter> newExcludeFilters = null;
+
+    // Read configuration.
+    newConfigEntryDN = configuration.dn();
+    newLockTimeout   = configuration.getLockTimeout();
+    newMaxEntries    = configuration.getMaxEntries();
+
+    // Maximum memory the cache can use.
+    newMaxMemoryPercent = (int) configuration.getMaxMemoryPercent();
+    long maxJvmHeapSize = Runtime.getRuntime().maxMemory();
+    newMaxAllowedMemory = (maxJvmHeapSize / 100) * newMaxMemoryPercent;
+
+    // Get include and exclude filters.
+    switch (errorHandler.getConfigPhase())
+    {
+    case PHASE_INIT:
+      newIncludeFilters = EntryCacheCommon.getFilters (
+          configuration.getIncludeFilter(),
+          MSGID_FIFOCACHE_INVALID_INCLUDE_FILTER,
+          MSGID_FIFOCACHE_CANNOT_DECODE_ANY_INCLUDE_FILTERS,
+          errorHandler,
+          configEntryDN
+          );
+      newExcludeFilters = EntryCacheCommon.getFilters (
+          configuration.getExcludeFilter(),
+          MSGID_FIFOCACHE_CANNOT_DECODE_EXCLUDE_FILTER,
+          MSGID_FIFOCACHE_CANNOT_DECODE_ANY_EXCLUDE_FILTERS,
+          errorHandler,
+          configEntryDN
+          );
+      break;
+    case PHASE_ACCEPTABLE:  // acceptable and apply are using the same
+    case PHASE_APPLY:       // error ID codes
+      newIncludeFilters = EntryCacheCommon.getFilters (
+          configuration.getIncludeFilter(),
+          MSGID_FIFOCACHE_INVALID_INCLUDE_FILTER,
+          0,
+          errorHandler,
+          configEntryDN
+          );
+      newExcludeFilters = EntryCacheCommon.getFilters (
+          configuration.getExcludeFilter(),
+          MSGID_FIFOCACHE_INVALID_EXCLUDE_FILTER,
+          0,
+          errorHandler,
+          configEntryDN
+          );
+      break;
+    }
+
+    if (applyChanges && errorHandler.getIsAcceptable())
+    {
+      configEntryDN    = newConfigEntryDN;
+      lockTimeout      = newLockTimeout;
+      maxEntries       = newMaxEntries;
+      maxMemoryPercent = newMaxMemoryPercent;
+      maxAllowedMemory = newMaxAllowedMemory;
+      includeFilters   = newIncludeFilters;
+      excludeFilters   = newExcludeFilters;
+    }
+
+    return errorHandler.getIsAcceptable();
+  }
+
 }
 

--
Gitblit v1.10.0