Vistas

Mymobileweb-scxml

De MorfeoWiki

Tabla de contenidos

Propuesta de adopción de SCXML en MyMobileWeb

Introducción

Actualmente el control del flujo de ejecución en MyMobileWeb se realiza mediante la provisión de manejadores de eventos que siguen una jerarquía determinada por las OPs y presentaciones. Se necesita un mecanismo declarativo que permita de una manera flexible modelar el control de flujo sin necesidad de escribir código Java.

Utilización de SCXML

Para resolver el problema anterior se propone una sintaxis basada en SCXML , un estándar W3C en desarrollo que permite la definición de máquinas de estados. SCXML se utilizará como sigue:

  • Habrá un gran estado principal que modela toda la aplicación
  • Cada OP se modelará como un subestado con tantos subestados como presentaciones tenga dicha OP
  • Siempre se cumplirá: "Máquina de estados del flujo en el estado X ===> El usuario está visualizando la presentación X"
  • Los eventos ocasionados por los usuarios dispararán las transiciones entre los estados
  • Habrá transiciones definidas a nivel global, como por ejemplo, la que salta al inicio de la aplicación
  • Las acciones se disparán al activarse una transición o al entrar en un determinado estado. Habrá un conjunto de etiquetas que modelarán las acciones MyMobileWeb (mostrar presentacion, invocar OA, etc)
  • Existirá una acción especial que permitirá la ejecución de código arbitrario especificado por el programador, de cara a disponer de la maxima flexibilidad
  • Para realizar la implementación se podrá utilizar la librería CommonsSCXML de Apache

Ventajas

  • El modelado mediante máquina de estados es un buen paso hacia la multimodalidad
  • Se evita depender en mecanismos de modelado de flujo propietarios, como es el caso de Struts
  • Los desarrolladores podrán beneficiarse de la existencia herramientas SCXML que aparezcan en el mercado
  • La herramienta gráfica de definición de flujo en un futuro generará los ficheros SCXML
  • Los propios controles visuales de MyMobileWeb podrán utilizar la misma aproximación
  • SCXML es bastante flexible

Desventajas

  • SCXML es "work in progress"
  • Las implementaciones pueden ser todavia ineficientes o poco maduras

Ejemplo


<?xml version="1.0" encoding="UTF-8"?>

<scxml xmlns="http://www.w3.org/2005/07/SCXML" version="1.0"
               xmlns:mymw="http://morfeo-project.org/mymobileweb" initial="GlobalState">

<!-- This the global state --> 
<state id="GlobalState">
	<initial>
		<transition target="InitialMenu" />
	</initial>

	<!-- These are global transitions -->
	<transition event="lhome.DOMActivate" target="InitialMenu" />
	<!-- How to specify the 'back' in a flexible manner ? -->
	<transition event="error.*" target="ErrorPage" />		

	<!-- InitialMenu OP -->
	<state id="InitialMenu">
		<initial id="InitialMenu_InitOP">
			<transition target="menu" />
		</initial>
		
		<state id="menu">
			<onentry>
				<mymw:navigate presentation="menu" />
			</onentry>
			<transition event="menu1.DOMActivate" 
                            condition="${menuoption eq 'findps'}" 
                             target="SearchPS" />
			<transition event="menu1.DOMActivate" 
                              condition="${menuoption eq 'searchclients'}" 
                                       target="SearchClients" />					
			<!-- ... -->
		</state>	
	</state>

	<!-- SearchPS OP -->
	<state id="SearchPS">
		<initial id="SearchPS_InitOP">
			<transition target="query">
				<mymw:executeOA idOA="PSTypes" />
			</transition>
		</initial>	
		
		<state id="query">
			<onentry>
				<mymw:navigate presentation="query" />
			</onentry>
			<transition event="cconsult.DOMActivate" target="pslist">
				<mymw:executeOA idOA="PSSearch" />
			</transition>
			<transition event="linkEnterprise.DOMActivate" target="company" />
		</state>
		
		<state id="pslist">
			<onentry>
				<mymw:navigate presentation="pslist" />
			</onentry>		
			<!-- Add more transitions here -->
		</state>
		
		<state id="company">
			<onentry>
				<mymw:navigate presentation="company" />
			</onentry>
			<transition event="csearchenter.DOMActivate" target="complist">			
				<mymw:executeOA idOA="CompanySearch" />
			</transition>
		</state>
		
		<state id="complist">
			<onentry>
				<mymw:navigate presentation="complist" />
			</onentry>
			<transition event="listComp.DOMActivate" target="pslist">
				<mymw:executeOA idOA="CompanySelection" />
			</transition>
		</state>
	</state>
	
	<!-- -Add more states (OPs)  here -->
	<!-- There will an action mymw:custom method="com.example.MyClass.doActions" that will 
                                    allow to invoke custom logic -->
	
	<!-- A generic error state -->
	<state id="ErrorPage">
		<onentry>
			<mymw:showMessage message="MyErrors" />
		</onentry>
	</state>

	<!-- The final state -->
	<final id="exit">
		<onentry>
			<mymw:logout />
		</onentry>
	</final>		

</state>

</scxml>

Información Adicional

El proyecto Apache Shale utiliza la misma aproximación