package com.c2kernel.lifecycle.instance; import java.util.Vector; import com.c2kernel.graph.model.Vertex; import com.c2kernel.graph.traversal.GraphTraversal; import com.c2kernel.lookup.AgentPath; import com.c2kernel.scripting.ScriptingEngineException; /** * @version $Revision: 1.52 $ $Date: 2005/05/10 15:14:54 $ * @author $Author: abranson $ */ public class Join extends WfVertex { public Vector mErrors; /** * @see java.lang.Object#Object() */ public Join() { super(); mErrors = new Vector(0, 1); } private boolean loopTested; public int counter = 0; private String mItemSystemKey = ""; /** * @see com.c2kernel.lifecycle.instance.WfVertex#runNext() */ @Override public void runNext(AgentPath agent) throws ScriptingEngineException { AdvancementCalculator adv = new AdvancementCalculator(); adv.calculate((CompositeActivity) getParent()); if (adv.hasprevActive.get(String.valueOf(getID())) == null) { Vertex[] outVertices = getOutGraphables(); if (outVertices.length > 0) { WfVertex nextAct = (WfVertex) outVertices[0]; nextAct.run(agent); } else super.runNext(agent); } } /** * Method addNext. * * @param idNext */ public void addNext(String idNext) { new Next(this, (WfVertex) getParent().search(idNext)); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#reinit(int) */ @Override public void reinit(int idLoop) { Vertex[] outVertices = getOutGraphables(); if (outVertices.length == 1) { WfVertex nextAct = (WfVertex) outVertices[0]; nextAct.reinit(idLoop); } } /** * Method getItemSystemKey. * * @return String */ /* * public CompositeActivity process() { return parent.process(); } */ public String getItemSystemKey() { return mItemSystemKey; } /** * Method setItemSystemKey. * * @param itemSystemKey */ public void setItemSystemKey(String itemSystemKey) { mItemSystemKey = itemSystemKey; } /** * @see com.c2kernel.lifecycle.instance.WfVertex#verify() */ // public void initItemSystemKey(String systemKey) { // this.setItemSystemKey(systemKey); // } @Override public boolean verify() { mErrors.removeAllElements(); int nbOutEdges = getOutEdges().length; int nbInEdges = getInEdges().length; String type = (String) getProperties().get("Type"); if (nbInEdges < 1) { mErrors.add("not enough previous"); return false; } if (type != null && type.equals("Route")) { if (nbInEdges > 1) { mErrors.add("Bad nb of previous"); return false; } } if (nbOutEdges > 1) { mErrors.add("too many next"); return false; } if (nbOutEdges == 0) { if (!((CompositeActivity) getParent()).hasGoodNumberOfActivity()) { mErrors.add("too many endpoints"); return false; } } Vertex[] outV = getOutGraphables(); Vertex[] anteVertices = GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false); boolean loop = false; boolean errInLoop = false; 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 Loop) { loop = true; j = anteVertices.length; i = outV.length; } else { errInLoop = true; } } } if (errInLoop && loop) { mErrors.add("Problem in Loop"); return false; } return true; } /** * @see com.c2kernel.lifecycle.instance.WfVertex#getErrors() */ @Override public String getErrors() { if (mErrors.size() == 0) return "No error"; else return mErrors.elementAt(0); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#run() */ @Override public void run(AgentPath agent) throws ScriptingEngineException { runNext(agent); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#addNext(com.c2kernel.lifecycle.instance.WfVertex) */ @Override public Next addNext(WfVertex vertex) { return new Next(this, vertex); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#loop() */ @Override public boolean loop() { boolean loop2 = false; if (!loopTested) { loopTested = true; if (getOutGraphables().length != 0) loop2 = ((WfVertex) getOutGraphables()[0]).loop(); } else loop2 = true; loopTested = false; return loop2; } @Override public void runfirst(AgentPath agent) throws ScriptingEngineException { runNext(agent); } /* * (non-Javadoc) * * @see com.c2kernel.graph.model.Vertex#isJoin() */ @Override public boolean isJoin() { return true; } }