/* Created on 11 mars 2004 */ package com.c2kernel.lifecycle.instance; import java.io.Serializable; import java.util.Hashtable; import com.c2kernel.graph.model.Vertex; import com.c2kernel.lifecycle.instance.stateMachine.States; //import com.c2kernel.utils.Logger; /** @author XSeb74 */ public class AdvancementCalculator implements Serializable { private CompositeActivity activity; private Hashtable isMarked; private Hashtable HasNextMarked; public Hashtable hasprevActive; private long mCurrentNbActExp = 0; private long mMaximuNbActexp = 0; private long mNbActpassed = 0; private long mNbActpassedWithCurrent = 0; private long mNbActLeftWithCurrent = 0; private long mNbActLeftWithoutCurrent = 0; private boolean mIsbranchActive = false; private boolean mIsbranchFinished = true; private boolean mHasPrevActive = false; public AdvancementCalculator() { isMarked = new Hashtable(); HasNextMarked = new Hashtable(); hasprevActive = new Hashtable(); } public void calculate(CompositeActivity act) { // Logger.debug(0, act.getName()+" >>>>>>>>>"); if (act instanceof Workflow) { calculate((CompositeActivity) act.search("workflow/domain")); return; } activity = act; Vertex v = activity.getChildGraphModel().getStartVertex(); check(v, this); isMarked = new Hashtable(); calc(v, this); // Logger.debug(0, act.getName()+" <<<<<<<<<"); } private void check(Vertex v, AdvancementCalculator current) { current.isMarked.put(v, ""); Vertex[] nexts = current.activity.getChildGraphModel().getOutVertices(v); for (Vertex next : nexts) if (current.isMarked.get(next) != null) current.HasNextMarked.put(v, next); else check(next, current); int j=0; for (Vertex next : nexts) if (current.HasNextMarked.get(next) != null) j++; if (j != 0 && j==nexts.length) current.HasNextMarked.put(v, nexts[0]); } private void calc(Vertex v, AdvancementCalculator current) { if (current.isMarked.get(v) != null && !(v instanceof Join)) return; if (v instanceof Activity) { current.isMarked.put(v, current); Activity act = (Activity) v; if (v instanceof CompositeActivity) { CompositeActivity cact = (CompositeActivity) v; AdvancementCalculator adv = new AdvancementCalculator(); adv.isMarked = current.isMarked; adv.HasNextMarked = current.HasNextMarked; adv.calculate(cact); current.mCurrentNbActExp += adv.mCurrentNbActExp; current.mMaximuNbActexp += adv.mMaximuNbActexp; current.mNbActpassed += adv.mNbActpassed; current.mNbActpassedWithCurrent += adv.mNbActpassedWithCurrent; current.mIsbranchActive = current.mIsbranchActive || adv.mIsbranchActive||act.getActive(); current.mNbActLeftWithCurrent += adv.mNbActLeftWithCurrent; current.mNbActLeftWithoutCurrent += adv.mNbActLeftWithoutCurrent; current.mHasPrevActive = adv.mHasPrevActive||act.getActive(); if (adv.hasprevActive.size()!=0) current.mHasPrevActive=true; } else { current.mCurrentNbActExp += 1; current.mMaximuNbActexp += 1; if (act.getCurrentState() == States.FINISHED) { current.mNbActpassed += 1; current.mNbActpassedWithCurrent += 1; } else if (act.getActive()&&act.getState()