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