package no.hal.scxml.generator; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.scxml.ErrorReporter; import org.apache.commons.scxml.Evaluator; import org.apache.commons.scxml.EventDispatcher; import org.apache.commons.scxml.SCXMLExecutor; import org.apache.commons.scxml.SCXMLSemantics; import org.apache.commons.scxml.TriggerEvent; import org.apache.commons.scxml.model.ModelException; public class ScxmlEventQueueExecutor extends SCXMLExecutor { private Log log = LogFactory.getLog(ScxmlEventQueueExecutor.class); public ScxmlEventQueueExecutor() { super(); } public ScxmlEventQueueExecutor(Evaluator expEvaluator, EventDispatcher evtDisp, ErrorReporter errRep, SCXMLSemantics semantics) { super(expEvaluator, evtDisp, errRep, semantics); } public ScxmlEventQueueExecutor(Evaluator expEvaluator, EventDispatcher evtDisp, ErrorReporter errRep) { super(expEvaluator, evtDisp, errRep); } public ScxmlEventQueueExecutor(Evaluator expEvaluator, ErrorReporter errRep) { this(expEvaluator, null, errRep); } // private List<TriggerEvent> pendingEvents = new ArrayList<TriggerEvent>(); public void addEvent(TriggerEvent event) { pendingEvents.add(event); } public boolean pendingEvents() { return pendingEvents.size() > 0; } private boolean pausing = false; public boolean isPausing() { return pausing; } public void pause() { this.pausing = false; } public void resume() throws ModelException { if (! pausing) { return; } this.pausing = true; triggerPendingEvents(); } @Override public synchronized void triggerEvents(TriggerEvent[] events) throws ModelException { if (isPausing()) { pendingEvents.addAll(Arrays.asList(events)); } else { superTriggerEvents(events); } triggerPendingEvents(); } private boolean triggeringEvents = false; public boolean isTriggeringEvents() { return triggeringEvents; } protected void superTriggerEvents(TriggerEvent[] events) throws ModelException { triggeringEvents = true; try { super.triggerEvents(events); } finally { triggeringEvents = false; } } protected void triggerPendingEvents() throws ModelException { if (isPausing()) { return; } while (pendingEvents()) { TriggerEvent[] events = pendingEvents.toArray(new TriggerEvent[pendingEvents.size()]); pendingEvents.clear(); superTriggerEvents(events); } } }