Parcourir la source

#10 Handle transitions without target gracefully. Runtime SGraphBuilder now ignores dangling transitions and validator checks for such transitions.

terfloth@itemis.de il y a 14 ans
Parent
commit
999afd7249

+ 7 - 0
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/util/SGraphValidator.java

@@ -60,6 +60,9 @@ public class SGraphValidator extends EObjectValidator {
 	public static final String ISSUE_INITIAL_ENTRY_WITH_IN_TRANS = "Initial entry should have no incoming transition.";
 	public static final String ISSUE_INITIAL_ENTRY_WITHOUT_OUT_TRANS = "Initial entry should have a single outgoing transition";
 	public final static String ISSUE_ENTRY_WITH_MULTIPLE_OUT_TRANS = "Entries must not have more than one outgoing transition";
+	public static final String ISSUE_OUTGOING_TRANSITION_WITHOUT_TARGET = "!! Vertex contains outgoing transitions without target !!";
+
+	
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated
@@ -255,6 +258,10 @@ public class SGraphValidator extends EObjectValidator {
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		
+		for (Transition tran : vertex.getOutgoingTransitions()) {
+			if (tran.getTarget() == null) warning(vertex, diagnostics, ISSUE_OUTGOING_TRANSITION_WITHOUT_TARGET);
+		}
+		
 		if ((vertex.getOutgoingTransitions().size() > 0) && (vertex instanceof FinalState)) {
 			return warning(vertex, diagnostics, ISSUE_FINAL_STATE_OUTGOING_TRANSITION);
 		}

+ 5 - 0
plugins/org.yakindu.sct.simulation.runtime/src/org/yakindu/sct/simulation/runtime/sgraph/builder/SGraphBuilder.java

@@ -249,6 +249,7 @@ public class SGraphBuilder extends Function implements ISGraphExecutionBuilder {
 		return null;
 	}
 
+	
 	@FunctionMethod("")
 	public Object build(RTStatechart tParent, Transition transition) {
 		RTNode fromNode = (RTNode) tParent.getElementByAlias(transition
@@ -256,6 +257,9 @@ public class SGraphBuilder extends Function implements ISGraphExecutionBuilder {
 		RTNode toNode = (RTNode) tParent.getElementByAlias(transition
 				.getTarget());
 
+		if ( fromNode == null || toNode == null ) return null;  // >>>>>>>>> exit here on false precondition
+		
+		
 		RTTimeEvent timeTrigger = null;
 		Set<RTSignalEvent> signalTriggers = new HashSet<RTSignalEvent>();
 		RTGuard guard = null;
@@ -314,6 +318,7 @@ public class SGraphBuilder extends Function implements ISGraphExecutionBuilder {
 		RTTransition tTrans = new RTTransition(id, transition.getPriority(),
 				rtTrigger, action, fromNode, toNode);
 		tParent.defineAlias(transition, tTrans);
+		
 		return tTrans;
 	}