SCXML : State Chart XML

Engine

Introduction

La classe SCXMLExecutor permet de gérer la machine d'états Java.

Principe d'utilisation

Pour créer une machine d'état, il faut la construire avec trois paramètres. Le premier paramètre est un Evaluator. Cette interface permet de traiter les expressions dans le fichier SCXML, comme par exemple les conditions de transition. Apache met à notre disposition une implémentation de cette interface : JexlEvaluator, qui est un autre projet Apache. Le deuxième paramètre est un EventDispatcher. Cette interface permet de gérer les évènements envoyés à la machine d'états. Apache met à notre disposition une implémentation de cette interface : SimpleDispatcher. Le troisième et dernier argument est un ErrorReporter. Cette interface permet de gérer les erreurs liées à l'éxecution de la machine d'états. Apache met à notre disposition une implémentation de cette interface : SimpleErrorReporter qui se contente de logguer les éventuelles erreurs sur la console.

Une fois notre machine créée, il faut lui attribuer notre objet SCXML (qui représente le diagramme). Pour cela, il faut utiliser la méthode setStateMachine avec en paramètre notre objet.

Une fois le schéma chargé, il suffit juste de lancer la machine avec la méthode go.

Il est toutefois possible d'ajouter des listeners à la machine, pour observer ce qu'il se passe, avec la méthode addListener qui prend en paramètre un objet SCXMLListener.

Pour plus d'informations sur cette classe, je vous invite à lire sa javadoc ou à consulter le site officiel d'Apache disponible dans la rubrique des liens.

Code

			//import org.apache.commons.scxml.Context;
			//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.SCXMLListener;
			//import org.apache.commons.scxml.model.SCXML;
			//import org.apache.commons.scxml.model.ModelException;

			SCXMLExecutor exec = null;
			try {
				exec = new SCXMLExecutor(<Evaluator>,
						   <EventDispatcher>, <ErrorReporter>);
				exec.setStateMachine(<SCXML>);
				exec.addListener(<SCXML>, <SCXMLListener>);
				exec.setRootContext(<Context>);
				exec.go();
			} catch (ModelException me) {
				// Executor initialization failed, because the
				// state machine specified has inconsistencies
			}