You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by jb...@apache.org on 2010/06/12 21:40:12 UTC

svn commit: r954101 - /commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl

Author: jbeard
Date: Sat Jun 12 19:40:12 2010
New Revision: 954101

URL: http://svn.apache.org/viewvc?rev=954101&view=rev
Log:
Intermediate check-in.

Added:
    commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl   (with props)

Added: commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl
URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl?rev=954101&view=auto
==============================================================================
--- commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl (added)
+++ commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl Sat Jun 12 19:40:12 2010
@@ -0,0 +1,272 @@
+<?xml version="1.0"?>
+<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" 
+	xmlns:s="http://www.w3.org/2005/07/scxml"
+	xmlns:c="http://msdl.cs.mcgill.ca/"
+	version="1.0">
+
+	<param name="defaultEventLiteral" select="'$default'"/>
+	<param name="currentConfigurationExpression" 
+		select="'currentConfiguration.map(function(s){return STATE_INT_ID_TO_OBJECT_MAP[s]})'"/>
+	
+	<param name="genHistoryTriggerDispatcherCurrentConfigurationAssignmentRHS"
+		select="'newConfiguration.map(function(sObj){return sObj.id})'"/>
+	<param name="genHistoryTriggerDispatcherInnerForEachStateReference"
+		select="'STATE_INT_ID_TO_OBJECT_MAP[state]'"/>
+	<param name="genNonBasicTriggerDispatcherExitBlockIteratorExpression"
+		select="'currentConfiguration.map(function(state){return STATE_INT_ID_TO_OBJECT_MAP[state]})'"/>
+
+
+
+	<template name="genContextHooks">
+		//enumeration of states int id's
+		<for-each select="$basicStates">
+			var <value-of select="@c:enumId"/> = <value-of select="@c:stateNum"/>;
+		</for-each>
+
+		//map from states int id's to objects
+		var STATE_INT_ID_TO_OBJECT_MAP = 
+		<for-each select="$basicStates>
+			<value-of select="@id"/> <if test="not(position() = last())"> , </if>
+		</for-each>;
+
+		//tag each state object with an int id to map from object to id
+		//only needed for history
+		<for-each select="$basicStates>
+			<value-of select="@id"/>.id = <value-of select="@c:stateNum"/>;
+		</for-each>
+
+		//enumeration of triggers
+		<for-each select="$eventsEnum">
+			var <value-of select="c:name"/> = <value-of select="c:id"/>;
+		</for-each>
+
+		//expose them as a convenient interface as part of the API
+		<call-template name="genTriggerExternalObject"/>
+
+		//needed for debugging
+		{self.genTriggerIdToNameMap()}
+
+		//transition functions
+		{util.foreach(conf.transitions,function(transition){return self.genStateTriggerDispatcher(transition.parent(),transition)})}
+
+		{self.genEnumeratedHooks()}
+	</template>
+
+	<template name="genTriggerExternalObject"> 
+			this.TRIGGERS = { 
+				<for-each select="$eventsEnum">
+					<value-of select="c:name"/> : + <value-of select="c:name"/>
+					<if test="not(position() = last())> , </if>
+				</for-each>
+			};
+	</template>
+
+
+	<template name="genTriggerIdToNameMap">
+		var TRIGGER_ID_TO_NAME_MAP = [
+			<for-each select="$eventsEnum">
+				'<value-of select="c:name"/>' 
+				<if test="not(position() = last())> , </if>
+			</for-each>
+		];
+	</template>
+
+	<template name="genTriggerIdToNameMap">
+		var TRIGGER_ID_TO_NAME_MAP = [
+			<for-each select="$eventsEnum">
+				'<value-of select="c:name"/>' 
+				<if test="not(position() = last())"> , </if>
+			</for-each>
+		];
+	</template>
+
+	<!-- foreach basicState in set of basic states sorted by stateNum
+		find default (eventless) transitions for that state 
+		foreach event in set of events sorted by event id
+			find transition that originates at that state and has that event -->
+	<template name="genStateTransitionTable">
+		var STATE_TRANSITION_TABLE = [ 
+
+			<for-each select="$basicStates">
+				<sort select="@c:stateNum"/>
+
+				<variable name="currentState" select="."/>
+			
+				<!-- get the default transitions for this state -->
+				<variable name="defaultTransitions"	
+					select="s:transition[not(@event)]"/>
+
+				<!-- FIXME: figure out proper comma usage -->
+				<!--generate stuff for default transitions-->
+				<for-each select="$defaultTransitions">
+					<!-- generate code here -->
+					$nt
+				</for-each>
+
+				<for-each select="$eventsEnum">
+					<sort select="c:id"/>	
+
+					<variable name="currentEvent" select="."/>
+				
+					<!--get the corresponding transition-->
+					<variable name="correspondingTransitions" 
+						select="$currentState/s:transition[@event = $currentEvent]"/>
+
+					
+					<for-each select="$correspondingTransitions">
+						<!-- TODO: generate code here... -->
+					</for-each>
+					
+
+				</for-each>
+			</for-each>
+			
+			self.transitionTable.map(function(row){
+				return '[' +row.map(function(action){
+				if(action){
+					return action.toString();
+				}
+				else return "$nt";
+			}).join(',') +']\n';
+		}).join(',') + ']';
+	</template>
+
+	<template name="genStateHooks"/>
+	<template name="genExternalTriggerDispatcher"/>
+	<template name="genParallelSubstateConfigurationSetString"/>
+	<template name="genNonParallelSubstateConfigurationSetString"/>
+	<template name="genInitialization"/>
+	<template name="genTriggerDispatcherContext"/>
+
+<!--
+
+				//this should be overrridden by subclasses
+				self.genEnumeratedHooks = function(){
+					return "";
+				}
+
+				//@override
+				self.genTriggerDispatcherContext = function (params,s,t){
+					return <>
+						var {t.@msdl::tName} = function()&#x7B;
+							{params.isHistory ? 
+								self.genHistoryTriggerDispatcher(params,s,t) : 
+								self.genTriggerDispatcherContents(params,s,t) }
+						&#x7D;
+					</>
+				}
+
+
+				//enumeration of triggers
+				self.genTriggerIntEnum = function(){
+					return "";
+				}
+
+				self.genStateTransitionTable = function(){
+					return 'var STATE_TRANSITION_TABLE = [' + self.transitionTable.map(function(row){
+						return '[' +row.map(function(action){
+							if(action){
+								return action.toString();
+							}
+							else return "$nt";
+						}).join(',') +']\n';
+					}).join(',') + ']';
+				}
+
+				self.genExternalTriggerDispatcher = function(t){
+					return <>
+						this.{t.@event} = function()&#x7B;
+							if(isInStableState)&#x7B;
+								runToCompletion({t.@event});
+							&#x7D;else&#x7B;
+								return undefined;
+							&#x7D;
+						&#x7D;
+					</>;
+				}
+
+				self.genNonParallelSubstateConfigurationSetString = function(s,t){
+					return <>
+								currentConfiguration = [{util.foreach(t.msdl::targets
+																.msdl::target
+																.msdl::targetState,function(s){
+																	return conf.allStates.(@id == s.toString()).msdl::enumId.toString() + ","}).slice(0,-1)}]; 
+					</>
+				}
+
+				self.genParallelSubstateConfigurationSetString = function(s,t){
+					return <>
+								currentConfiguration.splice(currentConfiguration.indexOf({s.msdl::enumId.toString()}),1,
+										{util.foreach(t.msdl::targets
+													.msdl::target
+													.msdl::targetState,function(s){
+														return conf.allStates.(@id == s.toString()).msdl::enumId.toString() + ","}).slice(0,-1)}); 
+					</>
+				}
+
+
+				self.genInitialization = function(){
+					//we just need to know what the initial state is
+					var initialStateName = conf.allStates.(@id == conf.
+											scxml.
+											initial.
+											transition.
+											msdl::targets.
+											msdl::target.
+											msdl::targetState.
+											toString()).msdl::enumId.toString();
+
+					return <>
+						this.initialize = function()&#x7B;
+							currentConfiguration = [{initialStateName}];
+							runToCompletion();
+							mainLoop();
+						&#x7D;
+					</>;
+				}
+
+
+				self.genSend = function(send){
+					var toReturn="";
+
+					if(send.length()){
+						var sendEvent = send.@event.toString();
+						var sendDelay = parseInt(send.@delay.toString());	//fixme: not sure what the units are
+
+						if(sendDelay){
+							//set timeout
+							toReturn =  <>
+							window.setTimeout(function()&#x7B;
+								self.GEN({sendEvent});
+							&#x7D;,{sendDelay*1000});
+								</>
+						}else{
+							//just add the event to the outer queue
+							toReturn = <>
+								innerEventQueue.push({sendEvent});
+								</>
+						}
+					}
+
+					return toReturn;
+				}
+
+				self.genHistoryTriggerDispatcherCurrentConfigurationAssignmentRHS = function(){
+					return "newConfiguration.map(function(sObj){return sObj.id})";
+				}
+
+				self.genHistoryTriggerDispatcherHistoryStateReference = function(s){
+					return s.@id
+				}
+
+				self.genHistoryTriggerDispatcherInnerForEachStateReference = function(){
+					return "STATE_INT_ID_TO_OBJECT_MAP[state]";
+				}
+
+				self.genNonBasicTriggerDispatcherExitBlockIteratorExpression = function(){
+					return "currentConfiguration.map(function(state){return STATE_INT_ID_TO_OBJECT_MAP[state]} )";	
+				}
+-->
+</stylesheet>
+
+

Propchange: commons/sandbox/gsoc/2010/scxml-js/trunk/test/xslt/AbstractEnumeratedStatechartGenerator.xsl
------------------------------------------------------------------------------
    svn:eol-style = native