List of usage examples for org.apache.commons.scxml SCXMLExecutor SCXMLExecutor
public SCXMLExecutor(final Evaluator expEvaluator, final EventDispatcher evtDisp, final ErrorReporter errRep)
From source file:com.korwe.thecore.scxml.ScxmlMessageProcessor.java
@Override public void initialize(String sessionId) { super.initialize(sessionId); try {/*from w w w . j a va 2 s .c om*/ String scxmlPath = CoreConfig.getInstance().getProperty("scxml_path"); if (LOG.isDebugEnabled()) { LOG.debug("SCXML path = " + scxmlPath); } File scfile = new File(scxmlPath); if (LOG.isDebugEnabled()) { LOG.debug("Absolute path: [" + scfile.getAbsolutePath() + "]"); } InputSource source = new InputSource(new BufferedReader(new FileReader(scxmlPath))); scxml = SCXMLParser.parse(source, new SimpleErrorHandler()); exec = new SCXMLExecutor(new JexlEvaluator(), new SimpleDispatcher(), new SimpleErrorReporter()); exec.setStateMachine(scxml); exec.addListener(scxml, new SimpleSCXMLListener()); exec.registerInvokerClass("x-coremessage", SendCoreMessageInvoker.class); Context context = new JexlContext(); context.set("sessionId", sessionId); context.set("lastMsg", null); exec.setRootContext(context); exec.go(); } catch (Exception e) { LOG.error("Failed to parse SCXML", e); } }
From source file:ch.shaktipat.saraswati.internal.common.AbstractStateMachine.java
/** * Instantiate and initialize the underlying executor instance. * * @param stateMachine The state machine * @param rootCtx The root context/*from w ww . ja v a2 s. c o m*/ * @param evaluator The expression evaluator */ private void initialize(final SCXML stateMachine, final Context rootCtx, final Evaluator evaluator) { engine = new SCXMLExecutor(evaluator, new SimpleDispatcher(), new SimpleErrorReporter()); engine.setStateMachine(stateMachine); engine.setSuperStep(true); engine.setRootContext(rootCtx); engine.addListener(stateMachine, new EntryListener()); try { engine.go(); } catch (ModelException me) { logError(me); } }
From source file:alma.acs.nc.sm.generic.AcsScxmlEngine.java
/** * Starts SCXML execution.//from w w w . jav a 2 s. com * <p> * TODO: define and throw exception in case of model failure. */ public void startExecution() { try { exec = new SCXMLExecutor(exprEvaluator, eventDispatcher, errorTracer); // make sure scxml is a valid SCXML doc -> ToBeDone exec.addListener(scxml, errorTracer); exec.setRootContext(exprContext); exec.setStateMachine(scxml); // @TODO: When do we need a java invoker? // exec.registerInvokerClass("java", SMJavaInvoker.class); exec.go(); } catch (ModelException e) { logger.severe("Could not start SM execution: " + e.getMessage()); } logger.fine("Started SM execution ..."); }
From source file:de.dfki.iui.mmds.scxml.engine.impl.SCXMLEngineImpl.java
/** * Instantiate and initialize the underlying executor instance. * /*from ww w .j a v a2 s .c om*/ * @param stateMachine * The state machine * @param topicInfix * @param rootCtx * The root context * @param evaluator * The expression evaluator * @param dispatcher */ private void initialize(final SCXML stateMachine, String idSuffix, final Context rootCtx, final Evaluator evaluator, EventDispatcher dispatcher, final ErrorReporter errorReporter) { engine = new SCXMLExecutor(evaluator, dispatcher, new SimpleErrorReporter()); engine.setStateMachine(stateMachine); engine.setSuperStep(true); engine.setRootContext(rootCtx); engine.addListener(stateMachine, new EntryListener()); engine.registerInvokerClass("scxml", SimpleSCXMLInvoker.class); // engine.registerInvokerClass("grounding", GroundingInvoker.class); // setId(stateMachine.getId()); String topicId = stateMachine.getId() + idSuffix; setId(topicId); EventHandler handler = new EventHandler() { @Override public void handleEvent(Event event) { if (event instanceof SCXMLEventFiredEvent) { // logInfo( "Scxml event 'SCXMLEventFiredEvent' received!" // ); fireEvent(((SCXMLEventFiredEvent) event).getEvent(), null); } } }; serviceRegs.add(SCXMLEngineActivator.registerEventHandler(handler, SCXMLEventFiredEvent.getTopic(topicId))); handlers.add(handler); // One event handler to listen for macro/micro step instructions handler = new EventHandler() { @Override public void handleEvent(Event event) { // logInfo( "Scxml event 'SCXMLMacroMicroStepEvent' received!" // ); engine.setSuperStep(SCXMLMacroMicroStepEvent.isMacroStepEvent(event)); String ev = ((SCXMLMacroMicroStepEvent) event).getEvent(); if (ev == null) { resume(); } else { fireEvent(ev, null); } } }; serviceRegs.add(SCXMLEngineActivator.registerEventHandler(handler, SCXMLMacroMicroStepEvent.getTopic(topicId, SCXMLMacroMicroStepEvent.TOPIC_SUFFIX_MACRO))); serviceRegs.add(SCXMLEngineActivator.registerEventHandler(handler, SCXMLMacroMicroStepEvent.getTopic(topicId, SCXMLMacroMicroStepEvent.TOPIC_SUFFIX_MICRO))); handlers.add(handler); // a handler for the transition cond evaluation/change events handler = new EventHandler() { public Transition findTransition(SCXMLTransitionEvent ev) { String stateId = ev.getStateId(); for (TransitionTarget tt : engine.getCurrentStatus().getAllStates()) { if (tt.getId().equals(stateId)) { try { // the state is found, now take a look at the // transitions return tt.getTransitionsList().get(ev.getTransPos()); } catch (IndexOutOfBoundsException e) { logError(e); } } } return null; } @Override public void handleEvent(Event event) { if (SCXMLTransitionEvent.isEvalTransitionCondEvent(event)) { // logInfo( "Scxml event 'SCXMLTransitionEvent' received!" // ); SCXMLTransitionEvent ev = (SCXMLTransitionEvent) event; Transition t = findTransition(ev); if (t != null) { try { String cond = t.getCond(); boolean evalResult = engine.getEvaluator() .evalCond(engine.getSCInstance().getContext(t.getParent()), cond); // now send the complete current state Map<String, Map<String, List<Object[]>>> currentState = getAvailableEventsStates(); for (Map<String, List<Object[]>> evVal : currentState.values()) { for (List<Object[]> stateVal : evVal.values()) { for (Object[] values : stateVal) { if (values[0] instanceof Integer && values[1].equals(cond)) { // set the evaluation result values[2] = evalResult ? 1 : 0; } } } } // logInfo( "Send 'Active states'" ); SCXMLEngineActivator.sendActiveStates(id, getActiveStates(), getAllActiveStates()); // logInfo( "Send 'Scxml state'" ); SCXMLEngineActivator.sendScxmlState(id, State.IDLE, currentState); } catch (SCXMLExpressionException e) { logError(e); } } } else if (SCXMLChangeTransitionCondEvent.isChangeTransitionCondEvent(event)) { // logInfo( // "Scxml event 'SCXMLChangeTransitionCondEvent' received!" // ); SCXMLChangeTransitionCondEvent ev = (SCXMLChangeTransitionCondEvent) event; Transition t = findTransition(ev); if (t != null) { t.setCond(ev.getNewCond()); } } } }; serviceRegs.add(SCXMLEngineActivator.registerEventHandler(handler, SCXMLTransitionEvent.getTopic(topicId, SCXMLTransitionEvent.Sort.COND))); handlers.add(handler); // a handler for the change of data values handler = new EventHandler() { @Override public void handleEvent(Event event) { if (event instanceof SCXMLChangeDataValueEvent) { // logInfo( // "Scxml event 'SCXMLChangeDataValueEvent' received!" ); SCXMLChangeDataValueEvent ev = (SCXMLChangeDataValueEvent) event; String stateId = ev.getStateId(); for (TransitionTarget tt : engine.getCurrentStatus().getAllStates()) { if (tt.getId().equals(stateId)) { try { // here comes a 'silent' change of the content, // i.e. there is no event 'dataId.change' sent Context ctxt = engine.getSCInstance().getContext(tt); Object result = engine.getEvaluator().eval(ctxt, ev.getValueScript()); String dataId = ev.getDataId(); ctxt.set(dataId, result); // now send the complete current state Map<String, Map<String, List<Object[]>>> currentState = getAvailableEventsStates(); for (Map<String, List<Object[]>> val : currentState.values()) { for (List<Object[]> state : val.values()) { for (Object[] values : state) { if (values[0].equals(dataId)) { // indicate that the value // changed values[2] = true; } } } } // logInfo( "Send 'Active states'" ); SCXMLEngineActivator.sendActiveStates(id, getActiveStates(), getAllActiveStates()); // logInfo( "Send 'Scxml state'" ); SCXMLEngineActivator.sendScxmlState(id, State.IDLE, currentState); return; } catch (SCXMLExpressionException e) { e.printStackTrace(); } } } } } }; serviceRegs.add( SCXMLEngineActivator.registerEventHandler(handler, SCXMLChangeDataValueEvent.getTopic(topicId))); handlers.add(handler); }
From source file:org.dishevelled.piccolo.identify.StateMachineSupport.java
/** * Create a new state machine support class to be delegated to * by the specified delegator with the specified state machine. * * @param delegator object delegating to this state machine support * class, must not be null/*w ww . j a v a 2 s .c om*/ * @param stateMachine state machine for this support class, must * not be null */ StateMachineSupport(final Object delegator, final SCXML stateMachine) { if (delegator == null) { throw new IllegalArgumentException("delegator must not be null"); } if (stateMachine == null) { throw new IllegalArgumentException("stateMachine must not be null"); } this.delegator = delegator; Evaluator evaluator = new JexlEvaluator(); EventDispatcher dispatcher = new SimpleDispatcher(); ErrorReporter errorReporter = new NoopErrorReporter(); Context rootContext = new JexlContext(); SCXMLListener listener = new SCXMLListener() { @Override public void onEntry(final TransitionTarget entered) { invoke(entered.getId()); } @Override public void onExit(final TransitionTarget exited) { // empty } @Override public void onTransition(final TransitionTarget to, final TransitionTarget from, final Transition transition) { // empty } }; executor = new SCXMLExecutor(evaluator, dispatcher, errorReporter); executor.setStateMachine(stateMachine); executor.setSuperStep(false); executor.setRootContext(rootContext); executor.addListener(stateMachine, listener); try { executor.go(); } catch (ModelException e) { // ignore } }