summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/lifecycle/instance/Loop.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/c2kernel/lifecycle/instance/Loop.java')
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/Loop.java107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/Loop.java b/src/main/java/com/c2kernel/lifecycle/instance/Loop.java
new file mode 100644
index 0000000..8228ba9
--- /dev/null
+++ b/src/main/java/com/c2kernel/lifecycle/instance/Loop.java
@@ -0,0 +1,107 @@
+package com.c2kernel.lifecycle.instance;
+import com.c2kernel.graph.model.Vertex;
+import com.c2kernel.graph.traversal.GraphTraversal;
+import com.c2kernel.lookup.AgentPath;
+import com.c2kernel.scripting.ScriptingEngineException;
+import com.c2kernel.utils.Logger;
+/**
+ * @version $Revision: 1.35 $ $Date: 2005/05/10 15:14:54 $
+ * @author $Author: abranson $
+ */
+public class Loop extends XOrSplit
+{
+ /**
+ * @see java.lang.Object#Object()
+ */
+ public Loop()
+ {
+ super();
+ }
+ /**
+ * @see com.c2kernel.lifecycle.instance.WfVertex#loop()
+ */
+ @Override
+ public boolean loop()
+ {
+ return true;
+ }
+ @Override
+ public void followNext(Next activeNext, AgentPath agent) throws ScriptingEngineException
+ {
+ WfVertex v = activeNext.getTerminusVertex();
+ if (!isInPrev(v))
+ v.run(agent);
+ else
+ {
+ v.reinit(getID());
+ v.run(agent);
+ }
+ }
+ /**
+ * @see com.c2kernel.lifecycle.instance.WfVertex#reinit(int)
+ */
+ @Override
+ public void reinit(int idLoop)
+ {
+ Logger.msg(8, "Loop.reinit");
+ if (idLoop == getID())
+ return;
+ else
+ {
+ Vertex[] outVertices = getOutGraphables();
+ for (int j = 0; j < outVertices.length; j++)
+ {
+ if (!isInPrev(outVertices[j]))
+ ((WfVertex) outVertices[j]).reinit(idLoop);
+ }
+ }
+ }
+ /**
+ * @see com.c2kernel.lifecycle.instance.WfVertex#verify()
+ */
+ @Override
+ public boolean verify()
+ {
+ boolean err = super.verify();
+ Vertex[] nexts = getOutGraphables();
+ Vertex[] anteVertices = GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false);
+ int k = 0;
+ int l = 0;
+ Vertex[] brothers = getParent().getChildren();
+ for (Vertex brother : brothers)
+ if (brother instanceof Loop)
+ l++;
+ for (Vertex next : nexts) {
+ for (Vertex anteVertice : anteVertices)
+ if (next.getID() == anteVertice.getID())
+ k++;
+ }
+ if (k != 1 && !(l > 1))
+ {
+ mErrors.add("bad number of pointing back nexts");
+ return false;
+ }
+ // if (nexts.length>2) {
+ // mErrors.add("you must only have 2 nexts");
+ // return false;
+ // }
+ return err;
+ }
+ private boolean isInPrev(Vertex vertex)
+ {
+ int id = vertex.getID();
+ Vertex[] anteVertices = GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false);
+ for (Vertex anteVertice : anteVertices) {
+ if (anteVertice.getID() == id)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ @Override
+ public boolean isLoop()
+ {
+ return true;
+ }
+}