Browse Source

#184 : add validation to ensure entry of top level does not have an name

Johannes Dicks 9 years ago
parent
commit
96a62ddedd

+ 18 - 1
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -128,7 +128,7 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 	private ResourceDescriptionsProvider resourceDescriptionsProvider;
 	@Inject(optional = true)
 	@Named("domainId")
-	private String domainID = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral(); 
+	private String domainID = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 
 	@Check
 	public void checkExpression(VariableDefinition expression) {
@@ -484,6 +484,23 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 			}
 		}
 	}
+	@Check(CheckType.FAST)
+	public void checkTopLevelEntriesDoesNotHaveAName(final Entry entry) {
+		Region parentRegion = entry.getParentRegion();
+		EObject eContainer = parentRegion.eContainer();
+	
+		boolean isTopLevelRegionEntry = eContainer instanceof Statechart;
+
+		//1. check if is toplevel
+		if (isTopLevelRegionEntry) {
+			boolean isDefaultEntry = STextValidationModelUtils.isDefault(entry);
+			//2. check if is default entry
+			if (!isDefaultEntry) {
+					error("Entry in top level region must not have a name.", entry,
+							SGraphPackage.Literals.ENTRY__KIND,-1);
+			}
+		}
+	}
 
 	@Check(CheckType.FAST)
 	public void checkOperationArguments_FeatureCall(final FeatureCall call) {

+ 272 - 272
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextValidationModelUtils.java

@@ -1,272 +1,272 @@
-/**
- * Copyright (c) 2013 itemis AG and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 	itemis AG - initial API and implementation
- * 
- */
-package org.yakindu.sct.model.stext.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.yakindu.base.base.NamedElement;
-import org.yakindu.sct.model.sgraph.Entry;
-import org.yakindu.sct.model.sgraph.Exit;
-import org.yakindu.sct.model.sgraph.ReactionProperty;
-import org.yakindu.sct.model.sgraph.Region;
-import org.yakindu.sct.model.sgraph.Transition;
-import org.yakindu.sct.model.stext.stext.EntryPointSpec;
-import org.yakindu.sct.model.stext.stext.ExitPointSpec;
-
-public final class STextValidationModelUtils {
-
-	private STextValidationModelUtils() {
-	}
-
-	/**
-	 * Sorts the given elements in transition without and with
-	 * {@link EntryPointSpec}s
-	 * 
-	 * @param elements
-	 *            list of transitions to sort
-	 * @return an array with the sorted elements. The first index contains a
-	 *         list of the transitions without {@link EntryPointSpec}s. The
-	 *         second index contains a list of the transitions with
-	 *         {@link EntryPointSpec}s.
-	 */
-	public static List<Transition>[] getEntrySpecSortedTransitions(
-			List<Transition> elements) {
-		@SuppressWarnings("unchecked")
-		final List<Transition>[] transitions = new ArrayList[2];
-		// first list contains Transitions without entry spec
-		transitions[0] = new ArrayList<Transition>();
-		// second list contains Transitions with entry spec
-		transitions[1] = new ArrayList<Transition>();
-		for (Transition transition : elements) {
-			boolean hasEntrySpec = false;
-			for (ReactionProperty property : transition.getProperties()) {
-				if (property instanceof EntryPointSpec) {
-					transitions[1].add(transition);
-					hasEntrySpec = true;
-					break;
-				}
-			}
-			if (!hasEntrySpec) {
-				transitions[0].add(transition);
-			}
-		}
-		return transitions;
-	}
-
-	/**
-	 * Sorts the given elements in transition without and with
-	 * {@link ExitPointSpec}s
-	 * 
-	 * @param elements
-	 *            - list of transitions to sort
-	 * @return an array with the sorted elements. The first index contains a
-	 *         list of the transitions without {@link ExitPointSpec}s. The
-	 *         second index contains a list of the transitions with
-	 *         {@link ExitPointSpec}s.
-	 */
-	public static List<Transition>[] getExitSpecSortedTransitions(
-			List<Transition> elements) {
-		@SuppressWarnings("unchecked")
-		final List<Transition>[] transitions = new ArrayList[2];
-		// first list contains Transitions without exit spec
-		transitions[0] = new ArrayList<Transition>();
-		// second list contains Transitions with exit spec
-		transitions[1] = new ArrayList<Transition>();
-		for (Transition transition : elements) {
-			boolean hasExitSpec = false;
-			for (ReactionProperty property : transition.getProperties()) {
-				if (property instanceof ExitPointSpec) {
-					transitions[1].add(transition);
-					hasExitSpec = true;
-					break;
-				}
-			}
-			if (!hasExitSpec) {
-				transitions[0].add(transition);
-			}
-		}
-		return transitions;
-	}
-
-	/**
-	 * If a {@link Region} contains no 'default' named {@link entry} it is added
-	 * as key to a map with a list of all entries of the region.
-	 * 
-	 * @param elements
-	 *            - a list with {@link Region} elements.
-	 * @return a map with a region (key) which contains no default {@link entry}
-	 *         and a list of all {@link entry} elements of the {@link Region}
-	 *         (value).
-	 */
-	public static Map<Region, List<Entry>> getRegionsWithoutDefaultEntry(
-			List<Region> elements) {
-		Map<Region, List<Entry>> regions = new HashMap<Region, List<Entry>>();
-		for (Region region : elements) {
-			boolean hasDefaultEntry = false;
-			final List<Entry> entries = getEntries(region.eContents());
-			for (Entry entry : entries) {
-				if (isDefault(entry)) {
-					hasDefaultEntry = true;
-					break;
-				}
-			}
-			if (!hasDefaultEntry) {
-				regions.put(region, entries);
-			}
-		}
-		return regions;
-	}
-
-	/**
-	 * If a {@link Region} contains no 'default' named {@link exit} it is added
-	 * as key to a map with a list of all exits of the region.
-	 * 
-	 * @param elements
-	 *            - a list with {@link Region} elements.
-	 * @return a map with a region (key) which contains no default {@link exit}
-	 *         and a list of all {@link exit} elements of the {@link Region}
-	 *         (value).
-	 */
-	public static Map<Region, List<Exit>> getRegionsWithoutDefaultExit(
-			List<Region> elements) {
-		Map<Region, List<Exit>> regions = new HashMap<Region, List<Exit>>();
-		for (Region region : elements) {
-			boolean hasDefaultExit = false;
-			final List<Exit> exits = getExits(region.eContents());
-			if (!exits.isEmpty()) {
-				for (Exit exit : exits) {
-					if (isDefault(exit)) {
-						hasDefaultExit = true;
-						break;
-					}
-				}
-			} else {
-				hasDefaultExit = true;
-			}
-
-			if (!hasDefaultExit) {
-				regions.put(region, exits);
-			}
-		}
-		return regions;
-	}
-
-	/**
-	 * Checks if the name of the given element matches the requirements to be a
-	 * 'default' element.
-	 * 
-	 * @param element
-	 *            - the {@link NamedElement}
-	 * @return {@code true} if the name is null, empty or equals 'default'
-	 *         (ignoring case).
-	 */
-	public static boolean isDefault(final NamedElement element) {
-		return element.getName() == null
-				|| (element.getName() != null && (element.getName().isEmpty() || element
-						.getName().equalsIgnoreCase("default")));
-	}
-
-	/**
-	 * Validates if the a {@link Transition} has an {@link ExitPointSpec} with
-	 * the given name.
-	 * 
-	 * @param transition
-	 *            - the transition to check
-	 * @param name
-	 *            - the name to check
-	 * @return {@code true} if the transition contains an ExitPointSpec with the
-	 *         name. Otherwise {@code false}.
-	 */
-	public static boolean isNamedExitTransition(Transition transition,
-			String name) {
-
-		boolean isNamedExitTransition = false;
-
-		Iterator<ReactionProperty> propertyIt = transition.getProperties()
-				.iterator();
-
-		while (propertyIt.hasNext() && !isNamedExitTransition) {
-
-			ReactionProperty property = propertyIt.next();
-
-			if (property instanceof ExitPointSpec) {
-
-				isNamedExitTransition = name.equals(((ExitPointSpec) property)
-						.getExitpoint());
-			}
-		}
-
-		return isNamedExitTransition;
-	}
-
-	public static boolean isDefaultExitTransition(Transition transition) {
-		boolean isDefault = false;
-		List<ExitPointSpec> exits = getExitPointSpecs(transition
-				.getProperties());
-		if (!exits.isEmpty()) {
-			for (ExitPointSpec exit : exits) {
-				if (exit.getExitpoint().equalsIgnoreCase("default")) {
-					isDefault = true;
-				}
-			}
-		} else {
-			isDefault = true;
-		}
-
-		return isDefault;
-	}
-
-	/**
-	 * Filters the given list of {@link ReactionProperty} to return only a list
-	 * of {@link ExitPointSpec}.
-	 * 
-	 * @param elements
-	 * 			- list of ReactionProperties
-	 * @return
-	 * 		A list of ExitPointSpecs.
-	 */
-	public static List<ExitPointSpec> getExitPointSpecs(
-			List<ReactionProperty> elements) {
-		List<ExitPointSpec> exits = new ArrayList<ExitPointSpec>();
-		for (ReactionProperty element : elements) {
-			if (element instanceof ExitPointSpec) {
-				exits.add((ExitPointSpec) element);
-			}
-		}
-		return exits;
-	}
-
-	public static List<Entry> getEntries(List<EObject> elements) {
-		List<Entry> entries = new ArrayList<Entry>();
-		for (EObject element : elements) {
-			if (element instanceof Entry) {
-				entries.add((Entry) element);
-			}
-		}
-		return entries;
-	}
-
-	public static List<Exit> getExits(List<EObject> elements) {
-		List<Exit> exits = new ArrayList<Exit>();
-		for (EObject element : elements) {
-			if (element instanceof Exit) {
-				exits.add((Exit) element);
-			}
-		}
-		return exits;
-	}
-}
+/**
+ * Copyright (c) 2013 itemis AG and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * 	itemis AG - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.stext.validation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EObject;
+import org.yakindu.base.base.NamedElement;
+import org.yakindu.sct.model.sgraph.Entry;
+import org.yakindu.sct.model.sgraph.Exit;
+import org.yakindu.sct.model.sgraph.ReactionProperty;
+import org.yakindu.sct.model.sgraph.Region;
+import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.stext.stext.EntryPointSpec;
+import org.yakindu.sct.model.stext.stext.ExitPointSpec;
+
+public final class STextValidationModelUtils {
+
+	private STextValidationModelUtils() {
+	}
+
+	/**
+	 * Sorts the given elements in transition without and with
+	 * {@link EntryPointSpec}s
+	 * 
+	 * @param elements
+	 *            list of transitions to sort
+	 * @return an array with the sorted elements. The first index contains a
+	 *         list of the transitions without {@link EntryPointSpec}s. The
+	 *         second index contains a list of the transitions with
+	 *         {@link EntryPointSpec}s.
+	 */
+	public static List<Transition>[] getEntrySpecSortedTransitions(
+			List<Transition> elements) {
+		@SuppressWarnings("unchecked")
+		final List<Transition>[] transitions = new ArrayList[2];
+		// first list contains Transitions without entry spec
+		transitions[0] = new ArrayList<Transition>();
+		// second list contains Transitions with entry spec
+		transitions[1] = new ArrayList<Transition>();
+		for (Transition transition : elements) {
+			boolean hasEntrySpec = false;
+			for (ReactionProperty property : transition.getProperties()) {
+				if (property instanceof EntryPointSpec) {
+					transitions[1].add(transition);
+					hasEntrySpec = true;
+					break;
+				}
+			}
+			if (!hasEntrySpec) {
+				transitions[0].add(transition);
+			}
+		}
+		return transitions;
+	}
+
+	/**
+	 * Sorts the given elements in transition without and with
+	 * {@link ExitPointSpec}s
+	 * 
+	 * @param elements
+	 *            - list of transitions to sort
+	 * @return an array with the sorted elements. The first index contains a
+	 *         list of the transitions without {@link ExitPointSpec}s. The
+	 *         second index contains a list of the transitions with
+	 *         {@link ExitPointSpec}s.
+	 */
+	public static List<Transition>[] getExitSpecSortedTransitions(
+			List<Transition> elements) {
+		@SuppressWarnings("unchecked")
+		final List<Transition>[] transitions = new ArrayList[2];
+		// first list contains Transitions without exit spec
+		transitions[0] = new ArrayList<Transition>();
+		// second list contains Transitions with exit spec
+		transitions[1] = new ArrayList<Transition>();
+		for (Transition transition : elements) {
+			boolean hasExitSpec = false;
+			for (ReactionProperty property : transition.getProperties()) {
+				if (property instanceof ExitPointSpec) {
+					transitions[1].add(transition);
+					hasExitSpec = true;
+					break;
+				}
+			}
+			if (!hasExitSpec) {
+				transitions[0].add(transition);
+			}
+		}
+		return transitions;
+	}
+
+	/**
+	 * If a {@link Region} contains no 'default' named {@link entry} it is added
+	 * as key to a map with a list of all entries of the region.
+	 * 
+	 * @param elements
+	 *            - a list with {@link Region} elements.
+	 * @return a map with a region (key) which contains no default {@link entry}
+	 *         and a list of all {@link entry} elements of the {@link Region}
+	 *         (value).
+	 */
+	public static Map<Region, List<Entry>> getRegionsWithoutDefaultEntry(
+			List<Region> elements) {
+		Map<Region, List<Entry>> regions = new HashMap<Region, List<Entry>>();
+		for (Region region : elements) {
+			boolean hasDefaultEntry = false;
+			final List<Entry> entries = getEntries(region.eContents());
+			for (Entry entry : entries) {
+				if (isDefault(entry)) {
+					hasDefaultEntry = true;
+					break;
+				}
+			}
+			if (!hasDefaultEntry) {
+				regions.put(region, entries);
+			}
+		}
+		return regions;
+	}
+
+	/**
+	 * If a {@link Region} contains no 'default' named {@link exit} it is added
+	 * as key to a map with a list of all exits of the region.
+	 * 
+	 * @param elements
+	 *            - a list with {@link Region} elements.
+	 * @return a map with a region (key) which contains no default {@link exit}
+	 *         and a list of all {@link exit} elements of the {@link Region}
+	 *         (value).
+	 */
+	public static Map<Region, List<Exit>> getRegionsWithoutDefaultExit(
+			List<Region> elements) {
+		Map<Region, List<Exit>> regions = new HashMap<Region, List<Exit>>();
+		for (Region region : elements) {
+			boolean hasDefaultExit = false;
+			final List<Exit> exits = getExits(region.eContents());
+			if (!exits.isEmpty()) {
+				for (Exit exit : exits) {
+					if (isDefault(exit)) {
+						hasDefaultExit = true;
+						break;
+					}
+				}
+			} else {
+				hasDefaultExit = true;
+			}
+
+			if (!hasDefaultExit) {
+				regions.put(region, exits);
+			}
+		}
+		return regions;
+	}
+
+	/**
+	 * Checks if the name of the given element matches the requirements to be a
+	 * 'default' element.
+	 * 
+	 * @param element
+	 *            - the {@link NamedElement}
+	 * @return {@code true} if the name is null, empty or equals 'default'
+	 *         (ignoring case).
+	 */
+	public static boolean isDefault(final NamedElement element) {
+		return element.getName() == null
+				|| (element.getName() != null && (element.getName().isEmpty() || element
+						.getName().equalsIgnoreCase("default")));
+	}
+
+	/**
+	 * Validates if the a {@link Transition} has an {@link ExitPointSpec} with
+	 * the given name.
+	 * 
+	 * @param transition
+	 *            - the transition to check
+	 * @param name
+	 *            - the name to check
+	 * @return {@code true} if the transition contains an ExitPointSpec with the
+	 *         name. Otherwise {@code false}.
+	 */
+	public static boolean isNamedExitTransition(Transition transition,
+			String name) {
+
+		boolean isNamedExitTransition = false;
+
+		Iterator<ReactionProperty> propertyIt = transition.getProperties()
+				.iterator();
+
+		while (propertyIt.hasNext() && !isNamedExitTransition) {
+
+			ReactionProperty property = propertyIt.next();
+
+			if (property instanceof ExitPointSpec) {
+
+				isNamedExitTransition = name.equals(((ExitPointSpec) property)
+						.getExitpoint());
+			}
+		}
+
+		return isNamedExitTransition;
+	}
+
+	public static boolean isDefaultExitTransition(Transition transition) {
+		boolean isDefault = false;
+		List<ExitPointSpec> exits = getExitPointSpecs(transition
+				.getProperties());
+		if (!exits.isEmpty()) {
+			for (ExitPointSpec exit : exits) {
+				if (exit.getExitpoint().equalsIgnoreCase("default")) {
+					isDefault = true;
+				}
+			}
+		} else {
+			isDefault = true;
+		}
+
+		return isDefault;
+	}
+
+	/**
+	 * Filters the given list of {@link ReactionProperty} to return only a list
+	 * of {@link ExitPointSpec}.
+	 * 
+	 * @param elements
+	 * 			- list of ReactionProperties
+	 * @return
+	 * 		A list of ExitPointSpecs.
+	 */
+	public static List<ExitPointSpec> getExitPointSpecs(
+			List<ReactionProperty> elements) {
+		List<ExitPointSpec> exits = new ArrayList<ExitPointSpec>();
+		for (ReactionProperty element : elements) {
+			if (element instanceof ExitPointSpec) {
+				exits.add((ExitPointSpec) element);
+			}
+		}
+		return exits;
+	}
+
+	public static List<Entry> getEntries(List<?> elements) {
+		List<Entry> entries = new ArrayList<Entry>();
+		for (Object element : elements) {
+			if (element instanceof Entry) {
+				entries.add((Entry) element); 
+			}
+		}
+		return entries;
+	}
+
+	public static List<Exit> getExits(List<EObject> elements) {
+		List<Exit> exits = new ArrayList<Exit>();
+		for (EObject element : elements) {
+			if (element instanceof Exit) {
+				exits.add((Exit) element);
+			}
+		}
+		return exits;
+	}
+}