Просмотр исходного кода

Fixed validation of a states incoming transitions.

markus.muehlbrandt@gmail.com 13 лет назад
Родитель
Сommit
fbde5a9192

+ 21 - 17
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/SGraphJavaValidator.java

@@ -14,7 +14,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
@@ -52,28 +51,33 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 	public static final String ISSUE_SUBMACHINE_UNRESOLVABLE = "Referenced Substatemachine '%s'does not exist!";
 
 	@Check(CheckType.FAST)
-	public void vertexNotReachable(Vertex vertex) {
-		if (vertex instanceof State) {
-			TreeIterator<EObject> eAllContents = vertex.eAllContents();
-			while (eAllContents.hasNext()) {
-				EObject next = eAllContents.next();
-				if (next instanceof State) {
-					EList<Transition> incomingTransitions = ((org.yakindu.sct.model.sgraph.State) next) // State
-							.getIncomingTransitions();
-					for (Transition transition : incomingTransitions) {
-						if (EcoreUtil
-								.isAncestor(vertex, transition.getSource())) {
-							error(ISSUE_NODE_NOT_REACHABLE, vertex, null, -1);
+	public void vertextNotReachable(Vertex vertex) {
+		if (!(vertex instanceof Entry)) {
+			int incomingTransitions = 0;
+			incomingTransitions += vertex.getIncomingTransitions().size();
+
+			// in context of a state it is sufficient if a sub state is targeted by
+			// an external transition
+			if (vertex instanceof org.yakindu.sct.model.sgraph.State) {
+				TreeIterator<EObject> eAllContents = vertex.eAllContents();
+				while (eAllContents.hasNext()) {
+					EObject next = eAllContents.next();
+					if (next instanceof org.yakindu.sct.model.sgraph.State) {
+						for (Transition transition : ((org.yakindu.sct.model.sgraph.State) next)
+								.getIncomingTransitions()) {
+							if (!EcoreUtil.isAncestor(vertex,
+									transition.getSource())) {
+								incomingTransitions++;
+							}
 						}
 					}
 				}
 			}
 
-		} else if (vertex.getIncomingTransitions().size() == 0
-				&& !(vertex instanceof Entry)) {
-			error(ISSUE_NODE_NOT_REACHABLE, vertex, null, -1);
+			if (incomingTransitions == 0) {
+				error(ISSUE_NODE_NOT_REACHABLE, vertex, null, -1);
+			}
 		}
-
 	}
 
 	@Check(CheckType.FAST)