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/05/27 18:27:57 UTC
svn commit: r948882 - in /commons/sandbox/gsoc/2010/scxml-js/trunk: build.js
build.sh src/scxml/cgf/SCXMLCompiler.js
src/scxml/cgf/js/AbstractStatechartGenerator.js
test/kitchen_sink/doc/KitchenSink.svg
test/kitchen_sink/doc_performance/KitchenSink.svg
Author: jbeard
Date: Thu May 27 16:27:56 2010
New Revision: 948882
URL: http://svn.apache.org/viewvc?rev=948882&view=rev
Log:
Fixed a bug in which transitions which originate in states in parallel regions and target states outside of those parallel regions were not using dynamic exit behaviour. Also, did quite a bit of refactoring to make names clearer. Deleted KitchenSink.svg from documentation, as these were not the correct files.
Removed:
commons/sandbox/gsoc/2010/scxml-js/trunk/test/kitchen_sink/doc/KitchenSink.svg
commons/sandbox/gsoc/2010/scxml-js/trunk/test/kitchen_sink/doc_performance/KitchenSink.svg
Modified:
commons/sandbox/gsoc/2010/scxml-js/trunk/build.js
commons/sandbox/gsoc/2010/scxml-js/trunk/build.sh
commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/SCXMLCompiler.js
commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/js/AbstractStatechartGenerator.js
Modified: commons/sandbox/gsoc/2010/scxml-js/trunk/build.js
URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/trunk/build.js?rev=948882&r1=948881&r2=948882&view=diff
==============================================================================
--- commons/sandbox/gsoc/2010/scxml-js/trunk/build.js (original)
+++ commons/sandbox/gsoc/2010/scxml-js/trunk/build.js Thu May 27 16:27:56 2010
@@ -43,7 +43,7 @@ require.def("build",
//FIXME: we need to be given the absolute path so as not to hardcode it
//rootUrl : "file:///C:/Users/Jacob%20Beard/workspace/comp-621/m1/",
- rootUrl : "http://localhost:8080/",
+ rootUrl : "http://localhost:8081/",
// timeout for running tests
timeout : 10000
@@ -54,8 +54,8 @@ require.def("build",
//enums
//we keep backward links of these
var backends = {
- "switch" : true,
- "table" : true,
+ // "switch" : true,
+ // "table" : true,
"state" : true
}
@@ -70,14 +70,16 @@ require.def("build",
//paths to all of the SCXML files we want to compile
var scxmlTests = {
- KitchenSink :"test/kitchen_sink/KitchenSink_performance.xml"
+ KitchenSink :"test/kitchen_sink/KitchenSink.xml",
+ KitchenSink_performance :"test/kitchen_sink/KitchenSink_performance.xml",
+ // KitchenSink_executableContent :"test/kitchen_sink/KitchenSink_executableContent.xml"
}
var performanceTestScripts = [
{
path : "test/kitchen_sink/scripts/performanceTest.js",
- scxmlTest : scxmlTests.KitchenSink //back-link
+ scxmlTest : scxmlTests.KitchenSink_performance //back-link
}
]
@@ -86,7 +88,13 @@ require.def("build",
{
path : "test/kitchen_sink/scripts/unitTest.js",
scxmlTest : scxmlTests.KitchenSink //back-link
+ },
+ /*
+ {
+ path : "test/kitchen_sink/scripts/unitTest_executableContent.js",
+ scxmlTest : scxmlTests.KitchenSink_executableContent //back-link
}
+ */
]
//gets populated at run-time
Modified: commons/sandbox/gsoc/2010/scxml-js/trunk/build.sh
URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/trunk/build.sh?rev=948882&r1=948881&r2=948882&view=diff
==============================================================================
--- commons/sandbox/gsoc/2010/scxml-js/trunk/build.sh (original)
+++ commons/sandbox/gsoc/2010/scxml-js/trunk/build.sh Thu May 27 16:27:56 2010
@@ -1,4 +1,4 @@
#!/bin/sh
dn=`dirname $0`
abspath=`cd $dn; pwd`
-java -cp ./lib/java/js.jar:./lib/test-java/selenium-java-client-driver.jar org.mozilla.javascript.tools.debugger.Main -debug runner.js $abspath build $*
+java -cp ./lib/java/js.jar:./lib/test-java/selenium-java-client-driver.jar org.mozilla.javascript.tools.shell.Main -debug runner.js $abspath build $*
Modified: commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/SCXMLCompiler.js
URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/SCXMLCompiler.js?rev=948882&r1=948881&r2=948882&view=diff
==============================================================================
--- commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/SCXMLCompiler.js (original)
+++ commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/SCXMLCompiler.js Thu May 27 16:27:56 2010
@@ -182,6 +182,9 @@ require.def("src/scxml/cgf/SCXMLCompiler
log : options.log
}
+ conf.stateTagsHash = stateTagsHash;
+ conf.stateTagsArray = stateTagsArray;
+
conf.basicStates = conf.allStates.(stateTagsArray.every(
function(s){
return descendants(s).length() == 0
@@ -194,10 +197,16 @@ require.def("src/scxml/cgf/SCXMLCompiler
conf.parallelRegions = conf.parallels.state;
- conf.basicParallelStates = conf.parallelRegions..*.(localName() in stateTagsHash).(stateTagsArray.every(
+
+ /*
+ conf.statesDescendedFromParallelRegions = conf.parallelRegions..*.(localName() in stateTagsHash);
+
+ conf.basicStatesDescendedFromParallelRegions = conf.statesDescendedFromParallelRegions.(stateTagsArray.every(
function(s){
return descendants(s).length() == 0
}));
+ */
+
conf.parallelsAndDescendantStates = conf.parallels + conf.parallels..*.(localName() in stateTagsHash);
@@ -317,7 +326,7 @@ require.def("src/scxml/cgf/SCXMLCompiler
sc = js_beautify(sc.toString().replace(/^\s+/, ''),{});
}
- //print(scxml);
+ //print(conf.scxml);
if(options.verbose) print(sc);
//TODO: write to specified file
Modified: commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/js/AbstractStatechartGenerator.js
URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/js/AbstractStatechartGenerator.js?rev=948882&r1=948881&r2=948882&view=diff
==============================================================================
--- commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/js/AbstractStatechartGenerator.js (original)
+++ commons/sandbox/gsoc/2010/scxml-js/trunk/src/scxml/cgf/js/AbstractStatechartGenerator.js Thu May 27 16:27:56 2010
@@ -51,6 +51,9 @@ require.def("src/scxml/cgf/js/AbstractSt
{self.genContextHooks()}
+ //initialization script
+ {conf.scxml.script.toString()}
+
//initialization method
{self.genInitialization()}
@@ -234,7 +237,7 @@ require.def("src/scxml/cgf/js/AbstractSt
{conf.log ?
'console.log("entering ' + stateName + '");' :
"" }
- {self.genSend(state.onentry.send)}
+ {util.foreach(state.onentry.children(),self.genExecutableContent)}
}
this.exitAction = function(){
@@ -245,6 +248,8 @@ require.def("src/scxml/cgf/js/AbstractSt
{hasHistoryState ?
"this.historyState.lastConfiguration = currentConfiguration.slice();" :
""}
+
+ {util.foreach(state.onexit.children(),self.genExecutableContent)}
}
{self.genStateHooks(state)}
@@ -256,6 +261,121 @@ require.def("src/scxml/cgf/js/AbstractSt
</>;
}
+ self.genExecutableContent = function(executableNode){
+ switch(executableNode.localName()){
+ //base profile
+ case "if":
+ return self.genIfNode(executableNode);
+ case "raise":
+ //TODO
+ break;
+ case "log":
+ return self.genLog(executableNode);
+ //script module
+ case "script":
+ return executableNode.toString();
+ //external communications module
+ case "send":
+ return self.genSend(executableNode);
+ case "cancel":
+ //TODO
+ return "";
+ case "invoke":
+ //TODO
+ return "";
+ case "finalize":
+ //TODO
+ return "";
+ //data module
+ case "datamodel":
+ //TODO
+ return "";
+ case "data":
+ //TODO
+ return "";
+ case "assign":
+ //TODO
+ return "";
+ case "validate":
+ //TODO
+ return "";
+ case "param":
+ //TODO
+ return "";
+ default:
+ //TODO: write to err
+ return "\/\/compiler:" + executableNode.localName() + " not recognized\n";
+ }
+ }
+
+ self.genLog = function(logNode){
+ var label = logNode.@label.toString();
+ var expression = logNode.@expr.toString();
+
+ return "console.log('" + label + " : ' " +
+ (expression.length ? " + " + expression : "")
+ + ");";
+
+ }
+
+ self.genIfNode = function(ifNode){
+
+ var toReturn = "";
+
+ //break him up into partitions
+ var ifBlock = {
+ cond : ifNode.@cond,
+ statements : []
+ };
+ var elseIfBlocks = [];
+ var elseBlock = null;
+
+ var ifNodeChildren = ifNode.children();
+
+ var currentPartition = ifBlock;
+
+ for(var i = 0; i < ifNodeChildren.length(); i++){
+ var node = ifNodeChildren[i];
+
+ switch(node.localName()){
+ case "elseif":
+ currentPartition = {
+ cond : node.@cond,
+ statements : []
+ };
+ elseIfBlocks.push(currentPartition);
+ break;
+ case "else":
+ currentPartition = {
+ cond : node.@cond,
+ statements : []
+ };
+ elseBlock.push(currentPartition);
+ break;
+ default:
+ currentPartition.statements.push(node);
+ }
+ }
+
+ function genIfBlockCode(type,block){
+ return <>
+ {type} ({block.cond}) {
+ {block.statements.map(self.genExecutableContent).join("\n")}
+ }
+ </>
+
+ }
+
+ toReturn += genIfBlockCode("if",ifBlock);
+ toReturn += elseIfBlocks.map(function(elseIfBlock){
+ return genIfBlockCode("else if",elseIfBlock);
+ });
+ if(elseBlock){
+ toReturn += genIfBlockCode("else",elseBlock);
+ }
+
+ return toReturn;
+ }
self.genAbstractStateTriggerDispatcher = function(t){
return <>
@@ -273,14 +393,15 @@ require.def("src/scxml/cgf/js/AbstractSt
</>;
};
- function TransitionParams(isBasic,isHistory,isParallelSubstate,isDefaultTransition){
+ /*
+ function TransitionParams(isBasic,isHistory,isParallelSubstateAndTransitionDoesNotExitParallelRegion,isDefaultTransition){
this.isBasic = isBasic;
this.isHistory = isHistory;
- this.isParallelSubstate = isParallelSubstate;
+ this.isParallelSubstateAndTransitionDoesNotExitParallelRegion = isParallelSubstateAndTransitionDoesNotExitParallelRegion;
this.isDefaultTransition = isDefaultTransition;
}
+ */
- //FIXME: how do we apply multiply arguments?
self.genStateTriggerDispatcher = function(state,transition){
//so, this will vary depending on whether he is a basic state in a non-parallel region, a non-basic state, or a history state.
//so, we do a check, and then delegate to the proper method
@@ -289,30 +410,39 @@ require.def("src/scxml/cgf/js/AbstractSt
var toReturn;
var targetId = transition.msdl::targets.msdl::target.msdl::targetState[0].toString();
var transitionTarget = conf.allStates.(@id == targetId);
- var isDefaultTransition = transition.@event.length() == 0;
- //generate exit action
- var transitionParams;
- if(state.localName() == "history"){
- transitionParams = new TransitionParams(true,true,false,isDefaultTransition);
- }else if(conf.basicParallelStates.contains(state) && conf.basicParallelStates.contains(transitionTarget)){
- //is basic, and not a descendant of a parallel state
- transitionParams = new TransitionParams(true,false,true,isDefaultTransition);
- }
- else if(conf.basicStates.contains(state)){
- //is basic, and not a descendant of a parallel state
- transitionParams = new TransitionParams(true,false,false,isDefaultTransition);
- }
- else{
- //is some kind of compound
- transitionParams = new TransitionParams(false,false,false,isDefaultTransition);
- }
+
+ var transitionParams = {};
+
+ transitionParams.isDefaultTransition = (transition.@event.length() == 0);
+
+ transitionParams.isInitial = (state.localName() == "initial");
+
+ //is he a history state?
+ transitionParams.isHistory = (state.localName() == "history");
+
+ //conf.statesDescendedFromParallelRegions.contains(transitionTarget))
+ //conf.statesDescendedFromParallelRegions.contains(state) &&
+
+ //TODO: get his corresponding parallel region, and check if target state is a descendant of the parallel region
+ //is basic, and is a descendant of a parallel state
+
+ transitionParams.isParallelSubstate = conf.parallelRegions..*.contains(state);
+
+ //we use these funky-looking variables to avoid namespace collisions in the below query
+ var $s = state, $t = transitionTarget;
+ transitionParams.isParallelSubstateAndTransitionDoesNotExitParallelRegion =
+ conf.parallelRegions.(
+ descendants($s.localName()).contains($s) &&
+ descendants($t.localName()).contains($t)).length();
+
+ //is he a basic state
+ transitionParams.isBasic = conf.basicStates.contains(state);
//set whether he is preempted
transitionParams.isPreempted =
conf.parallelsAndDescendantStates.contains(state) &&
!conf.parallelsAndDescendantStates.contains(transitionTarget);
-
toReturn = self.genTriggerDispatcherContext(transitionParams,state,transition);
return toReturn;
@@ -345,7 +475,8 @@ require.def("src/scxml/cgf/js/AbstractSt
'console.log("return to last deep configuration");' :
'console.log("return to last shallow configuration");') :
""}
- {self.genSend(t.send)}
+
+ {util.foreach(t.children().(namespace()==t.namespace()),self.genExecutableContent)}
var historyState = {self.genHistoryTriggerDispatcherHistoryStateReference(s)};
@@ -360,10 +491,9 @@ require.def("src/scxml/cgf/js/AbstractSt
"currentConfiguration = " + self.genHistoryTriggerDispatcherCurrentConfigurationAssignmentRHS() + ";"}
}else{
- {self.genTriggerDispatcherContents(new TransitionParams(params.isBasic,true,false,true),s,t)}
+ {self.genTriggerDispatcherContents(params,s,t)}
}
</>
-
}
//these get overridden
@@ -432,13 +562,16 @@ require.def("src/scxml/cgf/js/AbstractSt
"" }
//exit states
- {params.isBasic ?
+ { params.isInitial || params.isHistory ||
+ (params.isBasic &&
+ (!params.isParallelSubstate ||
+ params.isParallelSubstateAndTransitionDoesNotExitParallelRegion)) ?
util.foreach(t.msdl::exitpath
.msdl::state,function(stateToExit){return stateToExit + ".exitAction();"}) :
self.genNonBasicTriggerDispatcherExitBlock(t) }
//transition action
- {self.genSend(t.send)}
+ {util.foreach(t.children().(namespace()==t.namespace()),self.genExecutableContent)}
//enter states
{util.foreach(t.msdl::targets
@@ -447,7 +580,7 @@ require.def("src/scxml/cgf/js/AbstractSt
.msdl::state,function(stateToExit){return stateToExit + ".enterAction();"})}
//update configuration
- {params.isParallelSubstate ?
+ {params.isParallelSubstateAndTransitionDoesNotExitParallelRegion ?
self.genParallelSubstateConfigurationSetString(s,t) :
self.genNonParallelSubstateConfigurationSetString(s,t) }