From 1649148841be6bc4ac6381d0592dc9ab52438044 Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Sun, 02 Sep 2007 13:05:17 +0000
Subject: [PATCH] - [Issue 1481] Ability to set any JE property in config.ldif - [Issue 2031] provide core JE configurable attributes for FileSystemEntryCache - fixes to entry cache config manager for proper configuration, re-configuration, error reporting.

---
 opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java |   43 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java b/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
index 82974fc..d517506 100644
--- a/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
+++ b/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -33,9 +33,11 @@
 import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import org.opends.messages.MessageBuilder;
 
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.server.EntryCacheCfg;
@@ -58,7 +60,6 @@
 
 import static org.opends.server.loggers.debug.DebugLogger.*;
 import static org.opends.messages.ExtensionMessages.*;
-
 import static org.opends.server.util.ServerConstants.*;
 
 
@@ -100,10 +101,15 @@
   // reference is freed.
   private ReferenceQueue<CacheEntry> referenceQueue;
 
+  // Currently registered configuration object.
+  private SoftReferenceEntryCacheCfg registeredConfiguration;
+
   private Thread cleanerThread;
 
   private volatile boolean shutdown = false;
 
+
+
   static
   {
     timeUnits.put(TIME_UNIT_MILLISECONDS_ABBR, 1D);
@@ -148,6 +154,7 @@
       )
       throws ConfigException, InitializationException
   {
+    registeredConfiguration = configuration;
     configuration.addSoftReferenceChangeListener (this);
     configEntryDN = configuration.dn();
 
@@ -156,11 +163,25 @@
 
     // Read configuration and apply changes.
     boolean applyChanges = true;
+    ArrayList<Message> errorMessages = new ArrayList<Message>();
     EntryCacheCommon.ConfigErrorHandler errorHandler =
       EntryCacheCommon.getConfigErrorHandler (
-          EntryCacheCommon.ConfigPhase.PHASE_INIT, null, null
+          EntryCacheCommon.ConfigPhase.PHASE_INIT, null, errorMessages
           );
-    processEntryCacheConfig (configuration, applyChanges, errorHandler);
+    if (!processEntryCacheConfig(configuration, applyChanges, errorHandler)) {
+      MessageBuilder buffer = new MessageBuilder();
+      if (!errorMessages.isEmpty()) {
+        Iterator<Message> iterator = errorMessages.iterator();
+        buffer.append(iterator.next());
+        while (iterator.hasNext()) {
+          buffer.append(".  ");
+          buffer.append(iterator.next());
+        }
+      }
+      Message message = ERR_SOFTREFCACHE_CANNOT_INITIALIZE.get(
+        buffer.toString());
+      throw new ConfigException(message);
+    }
   }
 
 
@@ -170,7 +191,10 @@
    */
   public synchronized void finalizeEntryCache()
   {
+    registeredConfiguration.removeSoftReferenceChangeListener (this);
+
     shutdown = true;
+
     dnMap.clear();
     idMap.clear();
     if (cleanerThread != null) {
@@ -510,9 +534,12 @@
       EntryCacheCommon.getConfigErrorHandler (
           EntryCacheCommon.ConfigPhase.PHASE_APPLY, null, errorMessages
           );
-    processEntryCacheConfig (configuration, applyChanges, errorHandler);
+    // Do not apply changes unless this cache is enabled.
+    if (configuration.isEnabled()) {
+      processEntryCacheConfig (configuration, applyChanges, errorHandler);
+    }
 
-    boolean adminActionRequired = false;
+    boolean adminActionRequired = errorHandler.getIsAdminActionRequired();
     ConfigChangeResult changeResult = new ConfigChangeResult(
         errorHandler.getResultCode(),
         adminActionRequired,
@@ -530,8 +557,8 @@
    * @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.
+   * @return  <CODE>true</CODE> if configuration is acceptable,
+   *          or <CODE>false</CODE> otherwise.
    */
   public boolean processEntryCacheConfig(
       SoftReferenceEntryCacheCfg          configuration,
@@ -594,6 +621,8 @@
       setLockTimeout(newLockTimeout);
       setIncludeFilters(newIncludeFilters);
       setExcludeFilters(newExcludeFilters);
+
+      registeredConfiguration = configuration;
     }
 
     return errorHandler.getIsAcceptable();

--
Gitblit v1.10.0