Example usage for org.apache.commons.scxml SCXMLExecutor SCXMLExecutor

List of usage examples for org.apache.commons.scxml SCXMLExecutor SCXMLExecutor

Introduction

In this page you can find the example usage for org.apache.commons.scxml SCXMLExecutor SCXMLExecutor.

Prototype

public SCXMLExecutor(final Evaluator expEvaluator, final EventDispatcher evtDisp, final ErrorReporter errRep) 

Source Link

Document

Constructor.

Usage

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
    }
}