From bf135c5c0f1c9b949de97f97092780f8c3d9a8a2 Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Tue, 04 Nov 2008 09:53:59 +0000
Subject: [PATCH] fix 3560, Cannot recreate a workflow after a create/delete

---
 opends/src/server/org/opends/server/core/WorkflowImpl.java |   61 ++++++++++++++++++++++++++++--
 1 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/WorkflowImpl.java b/opends/src/server/org/opends/server/core/WorkflowImpl.java
index ca8ce53..6193e3f 100644
--- a/opends/src/server/org/opends/server/core/WorkflowImpl.java
+++ b/opends/src/server/org/opends/server/core/WorkflowImpl.java
@@ -34,7 +34,6 @@
 import java.util.Observer;
 import java.util.TreeMap;
 
-import org.opends.messages.Message;
 import org.opends.messages.MessageBuilder;
 import org.opends.server.admin.std.server.WorkflowCfg;
 import org.opends.server.types.*;
@@ -85,6 +84,12 @@
   // A lock to protect concurrent access to the registeredWorkflows.
   private static Object registeredWorkflowsLock = new Object();
 
+  // A reference counter used to count the number of workflow nodes that
+  // were registered with a network group. A workflow can be disabled or
+  // deleted only when its reference counter value is 0.
+  private int referenceCounter = 0;
+  private Object referenceCounterLock = new Object();
+
 
   /**
    * Creates a new instance of a workflow implementation. To define a workflow
@@ -219,10 +224,9 @@
       // The workflow must not be already registered
       if (registeredWorkflows.containsKey(workflowID))
       {
-        Message message =
-            ERR_REGISTER_WORKFLOW_ALREADY_EXISTS.get(workflowID);
         throw new DirectoryException(
-            ResultCode.UNWILLING_TO_PERFORM, message);
+            ResultCode.UNWILLING_TO_PERFORM,
+            ERR_REGISTER_WORKFLOW_ALREADY_EXISTS.get(workflowID));
       }
 
       TreeMap<String, Workflow> newRegisteredWorkflows =
@@ -466,4 +470,53 @@
       rootWorkflowElement = null;
     }
   }
+
+
+  /**
+   * Increments the workflow reference counter.
+   * <p>
+   * As long as the counter value is not 0 the workflow cannot be
+   * disabled nor deleted.
+   */
+  public void incrementReferenceCounter()
+  {
+    synchronized (referenceCounterLock)
+    {
+      referenceCounter++;
+    }
+  }
+
+
+  /**
+   * Decrements the workflow reference counter.
+   * <p>
+   * As long as the counter value is not 0 the workflow cannot be
+   * disabled nor deleted.
+   */
+  public void decrementReferenceCounter()
+  {
+    synchronized (referenceCounterLock)
+    {
+      if (referenceCounter == 0)
+      {
+        // the counter value is 0, we should not need to decrement anymore
+        throw new AssertionError(
+          "Reference counter of the workflow " + workflowID
+          + " is already set to 0, cannot decrement it anymore"
+          );
+      }
+      referenceCounter--;
+    }
+  }
+
+
+  /**
+   * Gets the value of the reference counter of the workflow.
+   *
+   * @return the reference counter of the workflow
+   */
+  public int getReferenceCounter()
+  {
+    return referenceCounter;
+  }
 }

--
Gitblit v1.10.0