From 2ac5818538b5755834cc872356fda708c2edaa6f Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 23 Dec 2014 16:10:54 +0000
Subject: [PATCH] OPENDJ-1706 Persistit: online import fails with NPE

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/ConfigFileHandler.java |   35 +++++++++++++++++++++--------------
 1 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/ConfigFileHandler.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/ConfigFileHandler.java
index 69616ce..2846df0 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/ConfigFileHandler.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/ConfigFileHandler.java
@@ -995,11 +995,14 @@
 
       // Notify all the add listeners that the entry has been added.
       final ConfigChangeResult aggregatedResult = new ConfigChangeResult();
-      for (ConfigAddListener l : addListeners)
+      for (ConfigAddListener l : addListeners) // This is an iterator over a COWArrayList
       {
-        final ConfigChangeResult result = l.applyConfigurationAdd(newEntry);
-        aggregate(aggregatedResult, result);
-        handleConfigChangeResult(result, newEntry.getDN(), l.getClass().getName(), "applyConfigurationAdd");
+        if (addListeners.contains(l))
+        { // ignore listeners that deregistered themselves
+          final ConfigChangeResult result = l.applyConfigurationAdd(newEntry);
+          aggregate(aggregatedResult, result);
+          handleConfigChangeResult(result, newEntry.getDN(), l.getClass().getName(), "applyConfigurationAdd");
+        }
       }
 
       throwIfUnsuccessful(aggregatedResult, ERR_CONFIG_FILE_ADD_APPLY_FAILED);
@@ -1095,11 +1098,14 @@
 
       // Notify all the delete listeners that the entry has been removed.
       final ConfigChangeResult aggregatedResult = new ConfigChangeResult();
-      for (ConfigDeleteListener l : deleteListeners)
+      for (ConfigDeleteListener l : deleteListeners) // This is an iterator over a COWArrayList
       {
-        final ConfigChangeResult result = l.applyConfigurationDelete(entry);
-        aggregate(aggregatedResult, result);
-        handleConfigChangeResult(result, entry.getDN(), l.getClass().getName(), "applyConfigurationDelete");
+        if (deleteListeners.contains(l))
+        { // ignore listeners that deregistered themselves
+          final ConfigChangeResult result = l.applyConfigurationDelete(entry);
+          aggregate(aggregatedResult, result);
+          handleConfigChangeResult(result, entry.getDN(), l.getClass().getName(), "applyConfigurationDelete");
+        }
       }
 
       throwIfUnsuccessful(aggregatedResult, ERR_CONFIG_FILE_DELETE_APPLY_FAILED);
@@ -1208,11 +1214,14 @@
 
       // Notify all the change listeners of the update.
       final ConfigChangeResult aggregatedResult = new ConfigChangeResult();
-      for (ConfigChangeListener l : changeListeners)
+      for (ConfigChangeListener l : changeListeners) // This is an iterator over a COWArrayList
       {
-        final ConfigChangeResult result = l.applyConfigurationChange(currentEntry);
-        aggregate(aggregatedResult, result);
-        handleConfigChangeResult(result, currentEntry.getDN(), l.getClass().getName(), "applyConfigurationChange");
+        if (changeListeners.contains(l))
+        { // ignore listeners that deregistered themselves
+          final ConfigChangeResult result = l.applyConfigurationChange(currentEntry);
+          aggregate(aggregatedResult, result);
+          handleConfigChangeResult(result, currentEntry.getDN(), l.getClass().getName(), "applyConfigurationChange");
+        }
       }
 
       throwIfUnsuccessful(aggregatedResult, ERR_CONFIG_FILE_MODIFY_APPLY_FAILED);
@@ -1379,8 +1388,6 @@
     return null;
   }
 
-
-
   /**
    * Performs a subtree search starting at the provided base entry, returning
    * all entries anywhere in that subtree that match the provided filter.

--
Gitblit v1.10.0