package com.c2kernel.lifecycle; import java.util.Vector; import com.c2kernel.graph.model.Vertex; import com.c2kernel.graph.traversal.GraphTraversal; import com.c2kernel.lifecycle.instance.AndSplit; import com.c2kernel.lifecycle.instance.WfVertex; /** * @version $Revision: 1.19 $ $Date: 2005/09/29 10:18:31 $ * @author $Author: abranson $ */ public class AndSplitDef extends WfVertexDef { /** * @see java.lang.Object#Object() */ public AndSplitDef() { mErrors = new Vector(0, 1); getProperties().put("RoutingScriptName", ""); getProperties().put("RoutingScriptVersion", -1); } /** * @see com.c2kernel.lifecycle.WfVertexDef#verify() */ @Override public boolean verify() { mErrors.removeAllElements(); boolean err = true; int nbInEdges = getInEdges().length; if (nbInEdges == 0 && this.getID() != getParent().getChildrenGraphModel().getStartVertexId()) { mErrors.add("Unreachable"); err = false; } else if (nbInEdges > 1) { mErrors.add("Bad nb of previous"); err = false; } else { if (getOutEdges().length <= 1) { mErrors.add("not enough next"); err = false; } else if (!(this instanceof LoopDef)) { Vertex[] outV = getOutGraphables(); Vertex[] anteVertices = GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false); boolean loop = false; boolean errInLoop = true; for (int i = 0; i < outV.length; i++) { for (int j = 0; j < anteVertices.length; j++) if (!loop && outV[i].getID() == anteVertices[j].getID()) { if (outV[i] instanceof LoopDef) { loop = true; j = anteVertices.length; i = outV.length; } else { errInLoop = false; } } } if (errInLoop && loop) { mErrors.add("Problem in Loop"); err = false; } } } return err; } @Override public boolean loop() { boolean loop2 = false; if (!loopTested) { loopTested = true; if (getOutGraphables().length != 0) { Vertex[] outVertices = getOutGraphables(); for (int i = 0; i < outVertices.length; i++) { WfVertexDef tmp = (WfVertexDef) getOutGraphables()[i]; loop2 = loop2 || tmp.loop(); } } } loopTested = false; return loop2; } @Override public WfVertex instantiate() { AndSplit newSplit = new AndSplit(); configureInstance(newSplit); return newSplit; } }