From c0cf7d38610e0c8313b829f7f9d58d0f44fc4e81 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Mon, 07 Jun 2010 09:15:44 +0000
Subject: [PATCH] Fix an issue where changes to Password policy subentries are not applied when they are replicated

---
 opends/src/server/org/opends/server/core/SubentryManager.java |  368 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 225 insertions(+), 143 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/SubentryManager.java b/opends/src/server/org/opends/server/core/SubentryManager.java
index 3f07280..60a8c4e 100644
--- a/opends/src/server/org/opends/server/core/SubentryManager.java
+++ b/opends/src/server/org/opends/server/core/SubentryManager.java
@@ -58,6 +58,10 @@
 import org.opends.server.types.operation.PostOperationDeleteOperation;
 import org.opends.server.types.operation.PostOperationModifyDNOperation;
 import org.opends.server.types.operation.PostOperationModifyOperation;
+import org.opends.server.types.operation.PostSynchronizationAddOperation;
+import org.opends.server.types.operation.PostSynchronizationDeleteOperation;
+import org.opends.server.types.operation.PostSynchronizationModifyDNOperation;
+import org.opends.server.types.operation.PostSynchronizationModifyOperation;
 import org.opends.server.types.operation.PreOperationAddOperation;
 import org.opends.server.types.operation.PreOperationDeleteOperation;
 import org.opends.server.types.operation.PreOperationModifyDNOperation;
@@ -127,7 +131,11 @@
           PluginType.POST_OPERATION_ADD,
           PluginType.POST_OPERATION_DELETE,
           PluginType.POST_OPERATION_MODIFY,
-          PluginType.POST_OPERATION_MODIFY_DN),
+          PluginType.POST_OPERATION_MODIFY_DN,
+          PluginType.POST_SYNCHRONIZATION_ADD,
+          PluginType.POST_SYNCHRONIZATION_DELETE,
+          PluginType.POST_SYNCHRONIZATION_MODIFY,
+          PluginType.POST_SYNCHRONIZATION_MODIFY_DN),
           true);
 
     lock = new ReentrantReadWriteLock();
@@ -719,6 +727,156 @@
     }
   }
 
+  private void doPostAdd(Entry entry)
+  {
+    if (entry.isSubentry() || entry.isLDAPSubentry())
+    {
+      try
+      {
+        addSubEntry(entry);
+
+        // Notify change listeners.
+        for (SubentryChangeListener changeListener :
+          changeListeners)
+        {
+          try
+          {
+            changeListener.handleSubentryAdd(entry);
+          }
+          catch (Exception e)
+          {
+            if (debugEnabled())
+            {
+              TRACER.debugCaught(DebugLogLevel.ERROR, e);
+            }
+          }
+        }
+      }
+      catch (Exception e)
+      {
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        }
+
+        // FIXME -- Handle this.
+      }
+    }
+  }
+
+  private void doPostDelete(Entry entry)
+  {
+    if (entry.isSubentry() || entry.isLDAPSubentry())
+    {
+      removeSubEntry(entry);
+
+      // Notify change listeners.
+      for (SubentryChangeListener changeListener :
+        changeListeners)
+      {
+        try
+        {
+          changeListener.handleSubentryDelete(entry);
+        }
+        catch (Exception e)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.ERROR, e);
+          }
+        }
+      }
+    }
+  }
+
+  private void doPostModify(Entry oldEntry, Entry newEntry)
+  {
+    boolean notify = false;
+
+    if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
+    {
+      removeSubEntry(oldEntry);
+      notify = true;
+    }
+    if (newEntry.isSubentry() || newEntry.isLDAPSubentry())
+    {
+      try
+      {
+        addSubEntry(newEntry);
+        notify = true;
+      }
+      catch (Exception e)
+      {
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        }
+
+        // FIXME -- Handle this.
+      }
+    }
+
+    if (notify)
+    {
+      // Notify change listeners.
+      for (SubentryChangeListener changeListener :
+        changeListeners)
+      {
+        try
+        {
+          changeListener.handleSubentryModify(
+                  oldEntry, newEntry);
+        }
+        catch (Exception e)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.ERROR, e);
+          }
+        }
+      }
+    }
+  }
+
+  private void doPostModifyDN(Entry oldEntry, Entry newEntry)
+  {
+    if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
+    {
+      removeSubEntry(oldEntry);
+      try
+      {
+        addSubEntry(newEntry);
+      }
+      catch (Exception e)
+      {
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        }
+
+        // FIXME -- Handle this.
+      }
+
+      // Notify change listeners.
+      for (SubentryChangeListener changeListener :
+        changeListeners)
+      {
+        try
+        {
+          changeListener.handleSubentryModify(
+                  oldEntry, newEntry);
+        }
+        catch (Exception e)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.ERROR, e);
+          }
+        }
+      }
+    }
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -867,42 +1025,9 @@
   public PostOperation doPostOperation(
           PostOperationAddOperation addOperation)
   {
-    Entry entry = addOperation.getEntryToAdd();
+    doPostAdd(addOperation.getEntryToAdd());
 
-    if (entry.isSubentry() || entry.isLDAPSubentry())
-    {
-      try
-      {
-        addSubEntry(entry);
-
-        // Notify change listeners.
-        for (SubentryChangeListener changeListener :
-          changeListeners)
-        {
-          try
-          {
-            changeListener.handleSubentryAdd(entry);
-          }
-          catch (Exception e)
-          {
-            if (debugEnabled())
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e);
-            }
-          }
-        }
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        // FIXME -- Handle this.
-      }
-    }
-
+    // If we've gotten here, then everything is acceptable.
     return PluginResult.PostOperation.continueOperationProcessing();
   }
 
@@ -913,30 +1038,9 @@
   public PostOperation doPostOperation(
           PostOperationDeleteOperation deleteOperation)
   {
-    Entry entry = deleteOperation.getEntryToDelete();
+    doPostDelete(deleteOperation.getEntryToDelete());
 
-    if (entry.isSubentry() || entry.isLDAPSubentry())
-    {
-      removeSubEntry(entry);
-
-      // Notify change listeners.
-      for (SubentryChangeListener changeListener :
-        changeListeners)
-      {
-        try
-        {
-          changeListener.handleSubentryDelete(entry);
-        }
-        catch (Exception e)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.ERROR, e);
-          }
-        }
-      }
-    }
-
+    // If we've gotten here, then everything is acceptable.
     return PluginResult.PostOperation.continueOperationProcessing();
   }
 
@@ -947,55 +1051,10 @@
   public PostOperation doPostOperation(
           PostOperationModifyOperation modifyOperation)
   {
-    Entry oldEntry = modifyOperation.getCurrentEntry();
-    Entry newEntry = modifyOperation.getModifiedEntry();
+    doPostModify(modifyOperation.getCurrentEntry(),
+            modifyOperation.getModifiedEntry());
 
-    boolean notify = false;
-
-    if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
-    {
-      removeSubEntry(oldEntry);
-      notify = true;
-    }
-    if (newEntry.isSubentry() || newEntry.isLDAPSubentry())
-    {
-      try
-      {
-        addSubEntry(newEntry);
-        notify = true;
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        // FIXME -- Handle this.
-      }
-    }
-
-    if (notify)
-    {
-      // Notify change listeners.
-      for (SubentryChangeListener changeListener :
-        changeListeners)
-      {
-        try
-        {
-          changeListener.handleSubentryModify(
-                  oldEntry, newEntry);
-        }
-        catch (Exception e)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.ERROR, e);
-          }
-        }
-      }
-    }
-
+    // If we've gotten here, then everything is acceptable.
     return PluginResult.PostOperation.continueOperationProcessing();
   }
 
@@ -1006,45 +1065,68 @@
   public PostOperation doPostOperation(
           PostOperationModifyDNOperation modifyDNOperation)
   {
+    doPostModifyDN(modifyDNOperation.getOriginalEntry(),
+            modifyDNOperation.getUpdatedEntry());
+
+    // If we've gotten here, then everything is acceptable.
+    return PluginResult.PostOperation.continueOperationProcessing();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void doPostSynchronization(
+      PostSynchronizationAddOperation addOperation)
+  {
+    Entry entry = addOperation.getEntryToAdd();
+    if (entry != null)
+    {
+      doPostAdd(entry);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void doPostSynchronization(
+      PostSynchronizationDeleteOperation deleteOperation)
+  {
+    Entry entry = deleteOperation.getEntryToDelete();
+    if (entry != null)
+    {
+      doPostDelete(entry);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void doPostSynchronization(
+      PostSynchronizationModifyOperation modifyOperation)
+  {
+    Entry entry = modifyOperation.getCurrentEntry();
+    Entry modEntry = modifyOperation.getModifiedEntry();
+    if ((entry != null) && (modEntry != null))
+    {
+      doPostModify(entry, modEntry);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void doPostSynchronization(
+      PostSynchronizationModifyDNOperation modifyDNOperation)
+  {
     Entry oldEntry = modifyDNOperation.getOriginalEntry();
     Entry newEntry = modifyDNOperation.getUpdatedEntry();
-
-    if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
+    if ((oldEntry != null) && (newEntry != null))
     {
-      removeSubEntry(oldEntry);
-      try
-      {
-        addSubEntry(newEntry);
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        // FIXME -- Handle this.
-      }
-
-      // Notify change listeners.
-      for (SubentryChangeListener changeListener :
-        changeListeners)
-      {
-        try
-        {
-          changeListener.handleSubentryModify(
-                  oldEntry, newEntry);
-        }
-        catch (Exception e)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.ERROR, e);
-          }
-        }
-      }
+      doPostModifyDN(oldEntry, newEntry);
     }
-
-    return PluginResult.PostOperation.continueOperationProcessing();
   }
 }

--
Gitblit v1.10.0