From 25dac9c266bda7e12badf795984da0cfcf2dff41 Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Mon, 27 Aug 2007 11:31:55 +0000
Subject: [PATCH] fix for issue 2150  : ConcurrentModificationException in InitializeTask

---
 opends/src/server/org/opends/server/backends/task/Task.java |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/task/Task.java b/opends/src/server/org/opends/server/backends/task/Task.java
index 10a9cd7..1a83f2d 100644
--- a/opends/src/server/org/opends/server/backends/task/Task.java
+++ b/opends/src/server/org/opends/server/backends/task/Task.java
@@ -53,6 +53,8 @@
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+import org.opends.server.types.ModificationType;
 
 
 import org.opends.server.types.InitializationException;
@@ -594,6 +596,46 @@
     }
   }
 
+  /**
+   * Replaces an attribute values of the task entry.
+   *
+   * @param  name  The name of the attribute that must be replaced.
+   *
+   * @param  value The value that must replace the previous values of the
+   *               attribute.
+   *
+   * @throws DirectoryException When an error occurs.
+   */
+  protected void replaceAttributeValue(String name, String value)
+  throws DirectoryException
+  {
+    // We only need to grab the entry-level lock if we don't already hold the
+    // broader scheduler lock.
+    boolean needLock = (! taskScheduler.holdsSchedulerLock());
+    Lock lock = null;
+    if (needLock)
+    {
+      lock = taskScheduler.writeLockEntry(taskEntryDN);
+    }
+
+    try
+    {
+      Entry taskEntry = getTaskEntry();
+
+      ArrayList<Modification> modifications = new ArrayList<Modification>();
+      modifications.add(new Modification(ModificationType.REPLACE,
+          new Attribute(name, value)));
+
+      taskEntry.applyModifications(modifications);
+    }
+    finally
+    {
+      if (needLock)
+      {
+        taskScheduler.unlockEntry(taskEntryDN, lock);
+      }
+    }
+  }
 
 
   /**

--
Gitblit v1.10.0