1 
  2 /**
  3  * Module for Extended SCION impl.
  4  * 
  5  * @class mmir.env.statemachine.engine.extended
  6  */	
  7 define(['dictionary', 'stringExtension'], function(Dictionary) {
  8 
  9 	/**
 10 	 * @param {Engine} _scion
 11 	 * 			the SCION engine instance
 12 	 * 
 13 	 * @return {ExtendedEngine}
 14 	 * 			the extended SCION engine instance
 15 	 * 
 16 	 * @memberOf mmir.env.statemachine.engine.extended
 17 	 */
 18 	var extend = function (_scion) {
 19 
 20 		/*
 21 		 * if (testbed._util) return testbed._util;
 22 		 */
 23 
 24 		/** @memberOf mmir.env.statemachine.engine.extended.private  */
 25 		var _states = [];
 26 		/** @memberOf mmir.env.statemachine.engine.extended.private  */
 27 		var _transitions = new Dictionary();
 28 		/** @memberOf mmir.env.statemachine.engine.extended.private  */
 29 		var _events = new Dictionary();
 30 		
 31 
 32 		(function() {
 33 			
 34 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 35 			var events = [];
 36 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 37 			var transitions = {};
 38 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 39 			var states = _scion.model.states;
 40 			
 41 			
 42 			//temporary variables:
 43 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 44 			var n; 
 45 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 46 			var stateObj;
 47 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 48 			var transitionObjects;
 49 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 50 			var m;
 51 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 52 			var ev;
 53 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 54 			var targets;
 55 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 56 			var targetObject;
 57 			/** @memberOf mmir.env.statemachine.engine.extended.private  */
 58 			var t;
 59 
 60 			// crawl all states, events and transitions
 61 			for (n = 0; n < states.length; n++) {
 62 
 63 				stateObj = states[n];
 64 
 65 				var id = stateObj.id;
 66 				if (!id.startsWith('$')){
 67 					_states.push(id);
 68 				}
 69 
 70 				transitionObjects = stateObj.transitions;
 71 				for (m = 0; m < transitionObjects.length; m++) {
 72 					
 73 					targets = transitionObjects[m].targets;
 74 					ev = transitionObjects[m].events;
 75 					events = events.concat(ev);
 76 					
 77 					if (targets) {
 78 						for (t = 0; t < targets.length; t++) {
 79 							
 80 							targetObject = targets[t];
 81 							if (typeof transitions[ev] === 'undefined') {
 82 								transitions[ev] = targetObject.id;
 83 							}
 84 							else {
 85 								var tmp = transitions[ev];
 86 								
 87 								if (typeof tmp === 'string') {
 88 									var a = new Array();
 89 									a.push(targetObject.id);
 90 								}
 91 								else if (tmp instanceof Array) {
 92 									transitions[ev].push(targetObject[ev]);
 93 								}
 94 							}
 95 						}
 96 					}
 97 					else {
 98 						transitions[ev] = stateObj.id;
 99 					}
100 				}
101 
102 				_transitions.put(stateObj.id, transitions);
103 				transitions = {};
104 
105 				_events.put(stateObj.id, events);
106 				events = [];
107 			}
108 
109 		})();
110 
111 		/** @class ExtendedEngineImpl  */
112 		return {
113 			/** @scope ExtendedEngineImpl  */
114 			
115 			/** @memberOf ExtendedEngineImpl  */
116 			_scion : _scion,
117 
118 			_states : _states,
119 
120 			_events : _events,
121 
122 			_transitions : _transitions,
123 
124 			start : function() {
125 				this._scion.start();
126 			},
127 
128 			ignoreScript : function() {
129 				this._scion.opts.retrace = true;
130 			},
131 
132 			evalScript : function() {
133 				this._scion.opts.retrace = false;
134 			},
135 
136 			gen : function(event, data) {
137 				this._scion.gen(event, data);
138 			},
139 
140 			getStates : function() {
141 				return this._scion.getConfiguration();
142 			},
143 
144 			getActiveStates : function() {
145 				return this._scion.getFullConfiguration();
146 			},
147 
148 			getEvents : function() {
149 				var i, events = [], states = this._scion.getConfiguration();
150 				for (i = 0; i < states.length; i++) {
151 					events = events.concat(this._events.get(states[i]));
152 				}
153 				return events;
154 			},
155 
156 			getActiveEvents : function() {
157 				
158 				var i, events = [], states = this._scion.getFullConfiguration();
159 				
160 				for (i = 0; i < states.length; i++) {
161 					events = events.concat(this._events.get(states[i]));
162 				}
163 				
164 				return events;
165 			},
166 
167 			getTransitions : function() {
168 				
169 				var i, t, e, transitions = {}, states = this._scion.getConfiguration();
170 
171 				for (i = 0; i < states.length; i++) {
172 					
173 					t = this._transitions.get(states[i]);
174 					
175 					for (e in t) {
176 						transitions[e] = t[e];
177 					}
178 				}
179 				
180 				return transitions;
181 			},
182 
183 			getActiveTransitions : function() {
184 				
185 				var i, t, e, transitions = {}, states = this._scion.getFullConfiguration();
186 
187 				for (i = 0; i < states.length; i++) {
188 					
189 					t = this._transitions.get(states[i]);
190 					
191 					for (e in t) {
192 						transitions[e] = t[e];
193 					}
194 				}
195 				
196 				return transitions;
197 			}
198 
199 		};//END: return {...
200 		
201 	};//END: extend = function(_scion) {...
202 	
203 	return extend;
204 		
205 });//END: define(...
206