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}) &#x7B;
+								{block.statements.map(self.genExecutableContent).join("\n")} 
+							&#x7D;
+						</>
+
+					}
+
+					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() + ";"}
 							
 						&#x7D;else&#x7B;
-							{self.genTriggerDispatcherContents(new TransitionParams(params.isBasic,true,false,true),s,t)}
+							{self.genTriggerDispatcherContents(params,s,t)}
 						&#x7D;
 					</>
-
 				}
 
 				//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) }