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(){
+ {params.isHistory ?
+ self.genHistoryTriggerDispatcher(params,s,t) :
+ self.genTriggerDispatcherContents(params,s,t) }
+ }
+ </>
+ }
+
+
+ //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(){
+ if(isInStableState){
+ runToCompletion({t.@event});
+ }else{
+ return undefined;
+ }
+ }
+ </>;
+ }
+
+ 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(){
+ currentConfiguration = [{initialStateName}];
+ runToCompletion();
+ mainLoop();
+ }
+ </>;
+ }
+
+
+ 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(){
+ self.GEN({sendEvent});
+ },{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