/**
* 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;
}
}