Example usage for org.apache.commons.scxml.model SCXML getId

List of usage examples for org.apache.commons.scxml.model SCXML getId

Introduction

In this page you can find the example usage for org.apache.commons.scxml.model SCXML getId.

Prototype

public String getId() 

Source Link

Document

Get the name for this state machine.

Usage

From source file:de.dfki.iui.mmds.scxml.engine.impl.SCXMLEngineImpl.java

/**
 * Instantiate and initialize the underlying executor instance.
 * /*from w ww  . jav a 2s  .c o m*/
 * @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);
}