From 36f277e76984f6184f2694507aeb7a3c8d856fda Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Sun, 08 Jul 2007 21:29:59 +0000
Subject: [PATCH] Update the config file handler so that it will report back to clients if a problem occurs while applying a configuration add, delete, or modify after the new configuration has been written to disk.

---
 opends/src/server/org/opends/server/extensions/ConfigFileHandler.java |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 103 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/ConfigFileHandler.java b/opends/src/server/org/opends/server/extensions/ConfigFileHandler.java
index 1d896c2..e878102 100644
--- a/opends/src/server/org/opends/server/extensions/ConfigFileHandler.java
+++ b/opends/src/server/org/opends/server/extensions/ConfigFileHandler.java
@@ -39,6 +39,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -1357,12 +1358,44 @@
 
 
       // Notify all the add listeners that the entry has been added.
+      ResultCode         resultCode = ResultCode.SUCCESS;
+      LinkedList<String> messages   = new LinkedList<String>();
       for (ConfigAddListener l : addListeners)
       {
-        handleConfigChangeResult(l.applyConfigurationAdd(newEntry),
-                                 newEntry.getDN(), l.getClass().getName(),
+        ConfigChangeResult result = l.applyConfigurationAdd(newEntry);
+        if (result.getResultCode() != ResultCode.SUCCESS)
+        {
+          if (resultCode == ResultCode.SUCCESS)
+          {
+            resultCode = result.getResultCode();
+          }
+
+          messages.addAll(result.getMessages());
+        }
+
+        handleConfigChangeResult(result, newEntry.getDN(),
+                                 l.getClass().getName(),
                                  "applyConfigurationAdd");
       }
+
+      if (resultCode != ResultCode.SUCCESS)
+      {
+        StringBuilder buffer = new StringBuilder();
+        if (! messages.isEmpty())
+        {
+          Iterator<String> iterator = messages.iterator();
+          buffer.append(iterator.next());
+          while (iterator.hasNext())
+          {
+            buffer.append(".  ");
+            buffer.append(iterator.next());
+          }
+        }
+
+        int    msgID   = MSGID_CONFIG_FILE_ADD_APPLY_FAILED;
+        String message = getMessage(msgID, String.valueOf(buffer));
+        throw new DirectoryException(resultCode, message, msgID);
+      }
     }
     finally
     {
@@ -1505,12 +1538,44 @@
 
 
       // Notify all the delete listeners that the entry has been removed.
+      ResultCode         resultCode = ResultCode.SUCCESS;
+      LinkedList<String> messages   = new LinkedList<String>();
       for (ConfigDeleteListener l : deleteListeners)
       {
-        handleConfigChangeResult(l.applyConfigurationDelete(entry),
-                                 entry.getDN(), l.getClass().getName(),
+        ConfigChangeResult result = l.applyConfigurationDelete(entry);
+        if (result.getResultCode() != ResultCode.SUCCESS)
+        {
+          if (resultCode == ResultCode.SUCCESS)
+          {
+            resultCode = result.getResultCode();
+          }
+
+          messages.addAll(result.getMessages());
+        }
+
+        handleConfigChangeResult(result, entry.getDN(),
+                                 l.getClass().getName(),
                                  "applyConfigurationDelete");
       }
+
+      if (resultCode != ResultCode.SUCCESS)
+      {
+        StringBuilder buffer = new StringBuilder();
+        if (! messages.isEmpty())
+        {
+          Iterator<String> iterator = messages.iterator();
+          buffer.append(iterator.next());
+          while (iterator.hasNext())
+          {
+            buffer.append(".  ");
+            buffer.append(iterator.next());
+          }
+        }
+
+        int    msgID   = MSGID_CONFIG_FILE_DELETE_APPLY_FAILED;
+        String message = getMessage(msgID, String.valueOf(buffer));
+        throw new DirectoryException(resultCode, message, msgID);
+      }
     }
     finally
     {
@@ -1658,12 +1723,44 @@
 
 
       // Notify all the change listeners of the update.
+      ResultCode         resultCode = ResultCode.SUCCESS;
+      LinkedList<String> messages   = new LinkedList<String>();
       for (ConfigChangeListener l : changeListeners)
       {
-        handleConfigChangeResult(l.applyConfigurationChange(currentEntry),
-                                 currentEntry.getDN(), l.getClass().getName(),
+        ConfigChangeResult result = l.applyConfigurationChange(newEntry);
+        if (result.getResultCode() != ResultCode.SUCCESS)
+        {
+          if (resultCode == ResultCode.SUCCESS)
+          {
+            resultCode = result.getResultCode();
+          }
+
+          messages.addAll(result.getMessages());
+        }
+
+        handleConfigChangeResult(result, newEntry.getDN(),
+                                 l.getClass().getName(),
                                  "applyConfigurationChange");
       }
+
+      if (resultCode != ResultCode.SUCCESS)
+      {
+        StringBuilder buffer = new StringBuilder();
+        if (! messages.isEmpty())
+        {
+          Iterator<String> iterator = messages.iterator();
+          buffer.append(iterator.next());
+          while (iterator.hasNext())
+          {
+            buffer.append(".  ");
+            buffer.append(iterator.next());
+          }
+        }
+
+        int    msgID   = MSGID_CONFIG_FILE_MODIFY_APPLY_FAILED;
+        String message = getMessage(msgID, String.valueOf(buffer));
+        throw new DirectoryException(resultCode, message, msgID);
+      }
     }
     finally
     {

--
Gitblit v1.10.0