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.47 $ $Date: 2006/05/29 13:17:45 $ * @author $Author: abranson $ */ public abstract class Split extends WfVertex { public Vector mErrors; /** * @see java.lang.Object#Object() */ public Split() { mErrors = new Vector(0, 1); getProperties().put("RoutingScriptName", ""); getProperties().put("RoutingScriptVersion", ""); } private boolean loopTested; private int mItemSystemKey = -1; /** * @see com.c2kernel.lifecycle.instance.WfVertex#runNext() */ public abstract void runNext(AgentPath agent) throws ScriptingEngineException; /** * Method addNext. * * @param idNext */ void addNext(String idNext) { new Next(this, (WfVertex) getParent().search(idNext)); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#addNext(com.c2kernel.lifecycle.instance.WfVertex) */ public Next addNext(WfVertex vertex) { Next nxt = new Next(this, vertex); int num = getOutGraphables().length; try { num = Integer.parseInt((String) getProperties().get("LastNum")); } catch (Exception e) { } nxt.getProperties().put("Alias", String.valueOf(num)); getProperties().put("LastNum", String.valueOf(num + 1)); return nxt; } /** * Method getItemSystemKey. * * @return int */ public int getItemSystemKey() { return mItemSystemKey; } /** * Method setItemSystemKey. * * @param itemSystemKey */ public void setItemSystemKey(int itemSystemKey) { mItemSystemKey = itemSystemKey; } /** * @see com.c2kernel.lifecycle.instance.WfVertex#reinit(int) */ // public void initItemSystemKey(String systemKey) { // setItemSystemKey(systemKey); // } public void reinit(int idLoop) { Vertex[] outVertices = getOutGraphables(); for (int i = 0; i < outVertices.length; i++) ((WfVertex) outVertices[i]).reinit(idLoop); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#verify() */ public boolean verify() { mErrors.removeAllElements(); int nbInEdgres = getParent().getChildrenGraphModel().getInEdges(this).length; if (nbInEdgres == 0 && this.getID() != getParent().getChildrenGraphModel().getStartVertexId()) { mErrors.add("not enough previous"); return false; } if (nbInEdgres > 1) { mErrors.add("Bad nb of previous"); return false; } if (getOutEdges().length <= 1 && !(this instanceof Loop)) { mErrors.add("not enough next"); return false; } if (!(this instanceof Loop)) { 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 Loop) { loop = true; j = anteVertices.length; i = outV.length; } else { errInLoop = false; } } } if (errInLoop && loop) { mErrors.add("Problem in Loop"); return false; } } return true; } /** * @see com.c2kernel.lifecycle.instance.WfVertex#getErrors() */ public String getErrors() { if (mErrors.size() == 0) return "No error"; else return (String) mErrors.elementAt(0); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#run() */ public void run(AgentPath agent) throws ScriptingEngineException { runNext(agent); } /** * @see com.c2kernel.lifecycle.instance.WfVertex#loop() */ 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++) { WfVertex tmp = (WfVertex) getOutGraphables()[i]; loop2 = loop2 || tmp.loop(); } } } loopTested = false; return loop2; } public String[] nextNames() { Vertex[] vs = getOutGraphables(); String[] result = new String[vs.length]; for (int i = 0; i < vs.length; i++) result[i] = vs[i].getName(); return result; } protected boolean isInTable(String test, String[] list) { if (test == null) return false; for (int i = 0; i < list.length; i++) if (test.equals(list[i])) return true; return false; } public void runfirst(AgentPath agent) throws ScriptingEngineException { runNext(agent); } }