aboutsummaryrefslogtreecommitdiffstats
path: root/rba.tool.editor/src/rba/tool/editor/validation
diff options
context:
space:
mode:
Diffstat (limited to 'rba.tool.editor/src/rba/tool/editor/validation')
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/CircularContainmentValidationHelper.xtend294
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/ContentAllocatableListValidationHelper.xtend105
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/RBADiagnostician.java22
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidatorProvider.xtend25
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/RBAModelValidator.xtend194
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/UniqueNameValidationHelper.xtend211
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentOperatorValidator.xtend7
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentValidator.xtend59
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveContentsValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveStateValidator.xtend32
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatableSetValidator.xtend59
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatedContentValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AndOperatorValidator.xtend35
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AreaSetValidator.xtend47
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/AreaValidator.xtend74
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ComparisonAndOperatorValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/CompositeAreaValidator.xtend26
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ConstraintValidator.xtend27
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ContentSetValidator.xtend59
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ContentStateValidator.xtend26
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValidator.xtend20
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValueValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayValidator.xtend91
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayingContentValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/EqualToOperatorValidatior.xtend42
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ExistsOperatorValidator.xtend48
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/FixedPositionLayoutValidator.xtend25
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ForAllOperatorValidator.xtend58
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/GetAllocatablesValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/GetContentsListValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/GetPropertyValidator.xtend60
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/GreaterThanOperatorValidator.xtend40
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeEarlierThanValidator.xtend51
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeLaterThanValidator.xtend51
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/HideLowerPriorityValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/HorizontalLayoutValidator.xtend25
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IfStatementValidator.xtend44
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ImpliesOperatorValidator.xtend35
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IntegerPropertyValidator.xtend17
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsActiveValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsAllocatedToValidator.xtend48
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsAttenuatedValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsCanceledValidator.xtend37
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedDisplayValidator.xtend32
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedOutputValidator.xtend32
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedValidator.xtend31
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisappearedValidator.xtend37
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisplayedOnValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsEqualToOperatorValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanEqualOperatorValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanOperatorValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsHiddenValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanEqualOperatorValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanOperatorValidator.xtend36
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsMutedValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsOnValidator.xtend32
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedOnValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsSoundingValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedSoundToValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedToValidator.xtend48
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedViewToValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsTypeOfValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/IsVisibleValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/LambdaExpressionValidator.xtend25
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/LetStatementValidator.xtend35
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/LowerThanOperatorValidator.xtend40
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/MaxOperatorValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/MinOperatorValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/MuchGreaterThanOperatorValidator.xtend40
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/MuteLowerPriorityValidator.xtend39
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/NamedElementValidator.xtend60
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/NotOperatorValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareNotValidator.xtend15
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareValidator.xtend71
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/OffSceneValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/OffsetValidator.xtend64
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/OnSceneValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/OrOperatorValidator.xtend35
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/OutputtingSoundValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/PackageValidator.xtend31
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/PlusOperatorValidator.xtend47
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/PositionContainerValidator.xtend74
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ProjectValidator.xtend34
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SceneValidator.xtend40
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SelectOperatorValidator.xtend33
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend106
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SetPropertyValidator.xtend83
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SizeOperatorValidator.xtend37
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SizeValidator.xtend28
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentSetValidator.xtend70
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentValidator.xtend86
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/StateValueValidator.xtend28
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ThatOfOperatorValidator.xtend69
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ValidatorUtils.xtend109
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/VerticalLayoutValidator.xtend25
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentSetValidator.xtend70
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentValidator.xtend91
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneSetValidator.xtend47
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneValidator.xtend69
101 files changed, 4936 insertions, 0 deletions
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/CircularContainmentValidationHelper.xtend b/rba.tool.editor/src/rba/tool/editor/validation/CircularContainmentValidationHelper.xtend
new file mode 100644
index 0000000..ba4205a
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/CircularContainmentValidationHelper.xtend
@@ -0,0 +1,294 @@
+package rba.tool.editor.validation
+
+import com.google.common.collect.Maps
+import com.google.common.collect.Sets
+import com.google.inject.Inject
+import java.util.LinkedHashSet
+import java.util.Map
+import java.util.Set
+import org.eclipse.emf.ecore.EClass
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EStructuralFeature
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.emf.ecore.resource.ResourceSet
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.xtext.naming.QualifiedName
+import org.eclipse.xtext.resource.IEObjectDescription
+import org.eclipse.xtext.resource.IResourceServiceProvider
+import org.eclipse.xtext.resource.impl.EObjectDescriptionLookUp
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider
+import org.eclipse.xtext.service.OperationCanceledManager
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.ValidationMessageAcceptor
+import org.eclipse.xtext.xbase.lib.Functions.Function1
+import rba.core.AbstractAllocatable
+import rba.core.AbstractContent
+import rba.core.AllocatableSet
+import rba.core.ContentSet
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.model.manager.ResourceManager
+
+class CircularContainmentValidationHelper {
+
+ private final static Function1<? super IEObjectDescription, Boolean> containmentPredicate = [ d |
+ d.EObjectOrProxy instanceof AbstractAllocatable || d.EObjectOrProxy instanceof AbstractContent
+ ];
+
+ private final static Function1<? super EObject, Boolean> containerPredicate = [ eObject |
+ eObject instanceof AllocatableSet || eObject instanceof ContentSet
+ ];
+
+ @Inject
+ private IResourceServiceProvider.Registry resourceServiceProviderRegistry = IResourceServiceProvider.Registry.INSTANCE;
+
+ @Inject
+ private ResourceDescriptionsProvider resourceDescriptionsProvider;
+
+ @Inject
+ private OperationCanceledManager operationCanceledManager = new OperationCanceledManager();
+
+ private String CIRCULAR_CONTAINMENT_DETECTE = Messages.CIRCULAR_CONTAINMENT_DETECTE;
+
+ def public void checkCircularContainment(Resource resource, CancelIndicator cancelIndicator, ValidationMessageAcceptor acceptor) {
+ val resourceServiceProvider = resourceServiceProviderRegistry.getResourceServiceProvider(resource.getURI());
+ if (resourceServiceProvider === null) {
+ return;
+ }
+
+ val clusterToNames = Maps.newHashMap();
+ val resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resource.resourceSet);
+ var descriptionLookUp = new EObjectDescriptionLookUp(resourceDescriptions.exportedObjects.filter(containmentPredicate).toList);
+
+ val descriptions = getAllObjectDescriptions(resource, descriptionLookUp);
+ val currentIter = descriptions.iterator();
+ if (!currentIter.hasNext()) {
+ return;
+ }
+
+ initDescriptionForCircularContainment(resource.resourceSet, descriptionLookUp, clusterToNames, acceptor);
+
+ while (currentIter.hasNext()) {
+ val objectDescription = currentIter.next();
+ checkDescriptionForCircularContainment(resource.resourceSet, descriptionLookUp, objectDescription, clusterToNames, acceptor);
+ operationCanceledManager.checkCanceled(cancelIndicator);
+ }
+ }
+
+ def private Iterable<IEObjectDescription> getAllObjectDescriptions(Resource resource, EObjectDescriptionLookUp descriptionLookUp) {
+ val allObjectDescriptions = resource.allContents.toIterable.filter(containerPredicate).map(o|findEObjectDescription(o, descriptionLookUp));
+ return allObjectDescriptions;
+ }
+
+ def protected void initDescriptionForCircularContainment(ResourceSet resourceSet, EObjectDescriptionLookUp descriptionLookUp,
+ Map<EClass, Map<QualifiedName, Set<IEObjectDescription>>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ initDescriptionForAllocatableSet(resourceSet, descriptionLookUp, clusterTypeToName, acceptor);
+ initDescriptionForContentSet(resourceSet, descriptionLookUp, clusterTypeToName, acceptor);
+ }
+
+ def protected void initDescriptionForAllocatableSet(ResourceSet resourceSet, EObjectDescriptionLookUp descriptionLookUp,
+ Map<EClass, Map<QualifiedName, Set<IEObjectDescription>>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ val allocatableSetDescriptionsMap = Maps.newHashMap();
+ clusterTypeToName.put(RBACorePackage.Literals.ALLOCATABLE_SET, allocatableSetDescriptionsMap);
+
+ ResourceManager.INSTANCE.getRbaAreaSets(resourceSet).forEach [ areaSet |
+ if (!areaSet.target.isEmpty) {
+ val IEObjectDescription eObjectDescription = findEObjectDescription(areaSet, descriptionLookUp);
+ if (eObjectDescription !== null) {
+ val targets = Sets.newLinkedHashSet();
+ var IEObjectDescription targetDescription;
+ for (target : areaSet.target) {
+ targetDescription = findEObjectDescription(target, descriptionLookUp);
+ if (targetDescription !== null) {
+ targets.add(targetDescription);
+ }
+ }
+ allocatableSetDescriptionsMap.put(eObjectDescription.qualifiedName, targets);
+ }
+ }
+ ];
+ ResourceManager.INSTANCE.getRbaZoneSets(resourceSet).forEach [ zoneSet |
+ if (!zoneSet.target.isEmpty) {
+ val IEObjectDescription eObjectDescription = findEObjectDescription(zoneSet, descriptionLookUp);
+ if (eObjectDescription !== null) {
+ val targets = Sets.newLinkedHashSet();
+ var IEObjectDescription targetDescription;
+ for (target : zoneSet.target) {
+ targetDescription = findEObjectDescription(target, descriptionLookUp);
+ if (targetDescription !== null) {
+ targets.add(targetDescription);
+ }
+ }
+ allocatableSetDescriptionsMap.put(eObjectDescription.qualifiedName, targets);
+ }
+ }
+ ];
+ }
+
+ def protected void initDescriptionForContentSet(ResourceSet resourceSet, EObjectDescriptionLookUp descriptionLookUp,
+ Map<EClass, Map<QualifiedName, Set<IEObjectDescription>>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ val allocatableSetDescriptionsMap = Maps.newHashMap();
+ clusterTypeToName.put(RBACorePackage.Literals.CONTENT_SET, allocatableSetDescriptionsMap);
+
+ ResourceManager.INSTANCE.getRbaViewContentSets(resourceSet).forEach [ viewContentSet |
+ if (!viewContentSet.target.isEmpty) {
+ val IEObjectDescription eObjectDescription = findEObjectDescription(viewContentSet, descriptionLookUp);
+ if (eObjectDescription !== null) {
+ val targets = Sets.newLinkedHashSet();
+ var IEObjectDescription targetDescription;
+ for (target : viewContentSet.target) {
+ targetDescription = findEObjectDescription(target, descriptionLookUp);
+ if (targetDescription !== null) {
+ targets.add(targetDescription);
+ }
+ }
+ allocatableSetDescriptionsMap.put(eObjectDescription.qualifiedName, targets);
+ }
+ }
+ ];
+ ResourceManager.INSTANCE.getRbaSoundContentSets(resourceSet).forEach [ soundContentSet |
+ if (!soundContentSet.target.isEmpty) {
+ val IEObjectDescription eObjectDescription = findEObjectDescription(soundContentSet, descriptionLookUp);
+ if (eObjectDescription !== null) {
+ val targets = Sets.newLinkedHashSet();
+ var IEObjectDescription targetDescription;
+ for (target : soundContentSet.target) {
+ targetDescription = findEObjectDescription(target, descriptionLookUp);
+ if (targetDescription !== null) {
+ targets.add(targetDescription);
+ }
+ }
+ allocatableSetDescriptionsMap.put(eObjectDescription.qualifiedName, targets);
+ }
+ }
+ ];
+ }
+
+ def private IEObjectDescription findEObjectDescription(EObject eObject, EObjectDescriptionLookUp descriptionLookUp) {
+ val candidates = descriptionLookUp.getExportedObjectsByObject(eObject);
+ if (!candidates.isEmpty) {
+ return candidates.get(0);
+ }
+ return null;
+ }
+
+ def protected void checkDescriptionForCircularContainment(ResourceSet resourceSet, EObjectDescriptionLookUp descriptionLookUp, IEObjectDescription description,
+ Map<EClass, Map<QualifiedName, Set<IEObjectDescription>>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ val object = description.getEObjectOrProxy();
+ val eClass = object.eClass();
+ val qualifiedName = description.getName();
+ val clusterType = getAssociatedClusterType(eClass);
+ if (clusterType === null) {
+ return;
+ }
+
+ val nameToDescription = clusterTypeToName.get(clusterType);
+ if (nameToDescription.containsKey(qualifiedName)) {
+ val targetsDescription = nameToDescription.get(qualifiedName);
+
+ val filtedTargets = targetsDescription.filter(d|!description.qualifiedName.equals(d.qualifiedName) && nameToDescription.containsKey(d.qualifiedName));
+ for (target : filtedTargets) {
+ val index = filtedTargets.toList.indexOf(target);
+ val cycleConsistsElement = Sets.newLinkedHashSet(#[target.qualifiedName.toString]);
+ checkCircularContainment(resourceSet, description, target, nameToDescription, cycleConsistsElement, acceptor, index);
+ }
+ }
+ }
+
+ def protected void checkCircularContainment(ResourceSet resourceSet, IEObjectDescription rootDescription, IEObjectDescription description,
+ Map<QualifiedName, Set<IEObjectDescription>> nameToDescription, LinkedHashSet<String> cycleConsistsElement, ValidationMessageAcceptor acceptor, int index) {
+ val targetsDescription = nameToDescription.get(description.qualifiedName);
+ val filtedTargets = targetsDescription.filter(d|!description.qualifiedName.equals(d.qualifiedName) && nameToDescription.containsKey(d.qualifiedName));
+ if (filtedTargets === null) {
+ return;
+ }
+
+ for (target : filtedTargets.filter(d|d.qualifiedName.equals(rootDescription.qualifiedName))) {
+ createCircularContainmentError(resourceSet, rootDescription, index, acceptor, appendCycleConsists(cycleConsistsElement, target.qualifiedName.toString()));
+ }
+
+ for (target : filtedTargets.filter(d|!d.qualifiedName.equals(rootDescription.qualifiedName))) {
+ val subCycleConsistsElement = Sets.newLinkedHashSet(cycleConsistsElement);
+ if (!subCycleConsistsElement.add(target.qualifiedName.toString())) {
+ return;
+ }
+
+ checkCircularContainment(resourceSet, rootDescription, target, nameToDescription, subCycleConsistsElement, acceptor, index);
+ }
+ }
+
+ def protected void createCircularContainmentError(ResourceSet resourceSet, IEObjectDescription description, int index, ValidationMessageAcceptor acceptor,
+ LinkedHashSet<String> cycleConsists) {
+ var object = description.getEObjectOrProxy();
+ if (object.eIsProxy) {
+ object = EcoreUtil2.resolve(object, resourceSet);
+ if (object.eIsProxy) {
+ return;
+ }
+ }
+
+ val feature = getContainmentFeature(object);
+ if (feature !== null) {
+ acceptor.acceptError(getCircularContainmentErrorMessage(description, cycleConsists), object, feature, index, getErrorCode());
+ }
+ }
+
+ def private LinkedHashSet<String> appendCycleConsists(LinkedHashSet<String> cycleConsists, String... args) {
+ val LinkedHashSet<String> newCycleConsists = Sets.newLinkedHashSet(cycleConsists);
+ if (args !== null && args.length > 0) {
+ newCycleConsists.addAll(args);
+ }
+ return newCycleConsists;
+ }
+
+ def String getCircularContainmentErrorMessage(IEObjectDescription description, LinkedHashSet<String> cycleConsists) {
+ val qualifiedName = description.getQualifiedName().toString();
+ val shortName = String.valueOf(if (qualifiedName !== null && qualifiedName !== "") qualifiedName else "<unnamed>");
+ return String.format(CIRCULAR_CONTAINMENT_DETECTE, shortName, cycleConsists.toString());
+ }
+
+ def protected boolean isContainerInformationHelpful(IEObjectDescription description, EObject container, String containerTypeLabel, EStructuralFeature containerNameFeature) {
+ return containerTypeLabel !== null && containerNameFeature !== null;
+ }
+
+ def protected boolean isContainerInformationHelpful(IEObjectDescription description, String shortName) {
+ return true;
+ }
+
+ def protected EObject getContainerForErrorMessage(EObject object) {
+ return object.eContainer();
+ }
+
+ def protected String getTypeLabel(EClass eClass) {
+ return eClass.getName();
+ }
+
+ def protected EStructuralFeature getContainmentFeature(EObject object) {
+ switch (object) {
+ AllocatableSet:
+ return RBACorePackage.Literals.ALLOCATABLE_SET__TARGET
+ ContentSet:
+ return RBACorePackage.Literals.CONTENT_SET__TARGET
+ default:
+ return null
+ }
+ }
+
+ def protected EClass getAssociatedClusterType(EClass eClass) {
+ val superTypes = eClass.getESuperTypes();
+ if (superTypes.isEmpty()) {
+ return null;
+ }
+ if (superTypes.contains(RBACorePackage.Literals.ALLOCATABLE_SET)) {
+ return RBACorePackage.Literals.ALLOCATABLE_SET;
+ }
+ if (superTypes.contains(RBACorePackage.Literals.CONTENT_SET)) {
+ return RBACorePackage.Literals.CONTENT_SET;
+ }
+ return null;
+ }
+
+ def protected String getErrorCode() {
+ return null;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/ContentAllocatableListValidationHelper.xtend b/rba.tool.editor/src/rba/tool/editor/validation/ContentAllocatableListValidationHelper.xtend
new file mode 100644
index 0000000..d9f1911
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/ContentAllocatableListValidationHelper.xtend
@@ -0,0 +1,105 @@
+package rba.tool.editor.validation
+
+import com.google.inject.Inject
+import org.eclipse.emf.common.util.URI
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EStructuralFeature
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
+import org.eclipse.xtext.resource.IResourceServiceProvider
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider
+import org.eclipse.xtext.service.OperationCanceledManager
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.ValidationMessageAcceptor
+import rba.core.AbstractContent
+import rba.core.RBACorePackage
+import rba.sound.SoundContent
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.resource.IRBAModelResourceLoader
+import rba.view.ViewContent
+
+class ContentAllocatableListValidationHelper {
+
+ @Inject
+ private IResourceServiceProvider.Registry resourceServiceProviderRegistry = IResourceServiceProvider.Registry.INSTANCE;
+
+ @Inject
+ private ResourceDescriptionsProvider resourceDescriptionsProvider;
+
+ @Inject
+ private IRBAModelResourceLoader resourceLoader;
+
+ @Inject
+ private ResourceSetImpl resourceSet;
+
+ @Inject
+ private OperationCanceledManager operationCanceledManager = new OperationCanceledManager();
+
+ private String CONTENT_ALLOCATABLE_SIZE = Messages.CONTENT_ALLOCATABLE_SIZE;
+
+ private String SOUND_ALLOCATABLE_SIZE = Messages.SOUND_ALLOCATABLE_SIZE;
+
+ def public void checkCrossReferenceEmpty(Resource resource, CancelIndicator cancelIndicator, ValidationMessageAcceptor acceptor) {
+ val resourceServiceProvider = resourceServiceProviderRegistry.getResourceServiceProvider(resource.getURI());
+ if (resourceServiceProvider === null) {
+ return;
+ }
+
+ demandGetResources(resource.getURI());
+ if (resourceSet === null) {
+ return;
+ }
+
+ val loadedResource = resourceSet.getResource(resource.getURI(), false);
+ if (loadedResource !== null) {
+ checkForAbstractContent_getAllocatableList(loadedResource, cancelIndicator, acceptor);
+ }
+ }
+
+ def private void demandGetResources(URI uri) {
+ if (!resourceSet.resources.isEmpty()) {
+ resourceSet.resources.clear();
+ }
+
+ val projectName = if (uri.segmentCount > 2) URI.decode(uri.segment(1)) else "";
+ val resourceDescriptions = resourceDescriptionsProvider.createResourceDescriptions();
+ val URIs = resourceDescriptions.allResourceDescriptions.map(d|d.URI).filter(u|projectName.equals(if (u.segmentCount > 2) URI.decode(u.segment(1)) else null));
+ resourceLoader.loadAndResolveResource(resourceSet, URIs, null);
+ }
+
+ def protected void checkForAbstractContent_getAllocatableList(Resource resource, CancelIndicator cancelIndicator, ValidationMessageAcceptor acceptor) {
+ resource.allContents.toIterable.filter(ViewContent).forEach [ viewContent |
+ if (viewContent.allocatableList.isEmpty) {
+ val feature = getContainmentFeature(viewContent);
+ if (feature !== null) {
+ acceptor.acceptError(String.format(CONTENT_ALLOCATABLE_SIZE, viewContent.name), viewContent, feature, ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
+ getErrorCode());
+ }
+ }
+ operationCanceledManager.checkCanceled(cancelIndicator);
+ ];
+ resource.allContents.toIterable.filter(SoundContent).forEach [ soundContent |
+ if (soundContent.allocatableList.isEmpty) {
+ val feature = getContainmentFeature(soundContent);
+ if (feature !== null) {
+ acceptor.acceptError(String.format(SOUND_ALLOCATABLE_SIZE, soundContent.name), soundContent, feature, ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
+ getErrorCode());
+ }
+ }
+ operationCanceledManager.checkCanceled(cancelIndicator);
+ ];
+ }
+
+ def protected EStructuralFeature getContainmentFeature(EObject object) {
+ switch (object) {
+ AbstractContent:
+ return RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE
+ default:
+ return null
+ }
+ }
+
+ def protected String getErrorCode() {
+ return null;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/RBADiagnostician.java b/rba.tool.editor/src/rba/tool/editor/validation/RBADiagnostician.java
new file mode 100644
index 0000000..de1685e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/RBADiagnostician.java
@@ -0,0 +1,22 @@
+package rba.tool.editor.validation;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.Diagnostician;
+
+import rba.core.NamedElement;
+import rba.core.RBACorePackage;
+
+public class RBADiagnostician extends Diagnostician {
+
+ @Override
+ public String getObjectLabel(EObject eObject) {
+
+ EClass eClass = eObject.eClass();
+ if (RBACorePackage.Literals.NAMED_ELEMENT.isSuperTypeOf(eClass)) {
+ return ((NamedElement)eObject).getName();
+ } else {
+ return eClass.getName();
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidator.xtend
new file mode 100644
index 0000000..d9c71d8
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation
+
+import java.util.Map
+import org.eclipse.emf.common.util.DiagnosticChain
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.emf.ecore.util.EObjectValidator
+import org.eclipse.xtext.validation.CompositeEValidator
+
+class RBAModelCompositeEValidator extends CompositeEValidator {
+
+ override protected initDefaults() {
+ if (isUseEObjectValidator()) {
+ this.addValidator(new EObjectValidator() {
+ override validate_EveryProxyResolves(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ // don't check, we have our own implementation, which creates nicer messages
+ return true;
+ }
+
+ override validate_NoCircularContainment(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ // don't check
+ return true;
+ }
+
+ override validate_EveryBidirectionalReferenceIsPaired(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ // don't check
+ return true;
+ }
+
+ override validate_BidirectionalReferenceIsPaired(EObject eObject, EReference eReference, EReference eOpposite, DiagnosticChain diagnostics,
+ Map<Object, Object> context) {
+ // don't check
+ return true;
+ }
+ });
+ }
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidatorProvider.xtend b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidatorProvider.xtend
new file mode 100644
index 0000000..c6cfd32
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelCompositeEValidatorProvider.xtend
@@ -0,0 +1,25 @@
+package rba.tool.editor.validation
+
+import com.google.inject.Inject
+import com.google.inject.Provider
+import org.eclipse.xtext.service.OperationCanceledManager
+import org.eclipse.xtext.validation.CompositeEValidator
+import org.eclipse.xtext.validation.CompositeEValidator.EValidatorEqualitySupport
+import org.eclipse.xtext.xbase.lib.util.ReflectExtensions
+
+class RBAModelCompositeEValidatorProvider implements Provider<CompositeEValidator> {
+
+ @Inject extension ReflectExtensions;
+
+ @Inject private Provider<EValidatorEqualitySupport> equalitySupportProvider;
+
+ @Inject private OperationCanceledManager operationCanceledManager;
+
+ override get() {
+ val CompositeEValidator compositeValidator = new RBAModelCompositeEValidator()
+ compositeValidator.equalitySupportProvider = equalitySupportProvider;
+ compositeValidator.set("operationCanceledManager", operationCanceledManager)
+ return compositeValidator;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/RBAModelValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelValidator.xtend
new file mode 100644
index 0000000..ea1f815
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/RBAModelValidator.xtend
@@ -0,0 +1,194 @@
+/*
+ * generated by Xtext 2.12.0
+ */
+package rba.tool.editor.validation
+
+import org.eclipse.xtext.validation.ComposedChecks
+import rba.tool.editor.validation.validators.AllocatedContentValidator
+import rba.tool.editor.validation.validators.AndOperatorValidator
+import rba.tool.editor.validation.validators.AreaSetValidator
+import rba.tool.editor.validation.validators.AreaValidator
+import rba.tool.editor.validation.validators.ComparisonAndOperatorValidator
+import rba.tool.editor.validation.validators.CompositeAreaValidator
+import rba.tool.editor.validation.validators.ConstraintValidator
+import rba.tool.editor.validation.validators.ContentStateValidator
+import rba.tool.editor.validation.validators.ContentValueValidator
+import rba.tool.editor.validation.validators.DisplayValidator
+import rba.tool.editor.validation.validators.DisplayingContentValidator
+import rba.tool.editor.validation.validators.EqualToOperatorValidatior
+import rba.tool.editor.validation.validators.ExistsOperatorValidator
+import rba.tool.editor.validation.validators.FixedPositionLayoutValidator
+import rba.tool.editor.validation.validators.ForAllOperatorValidator
+import rba.tool.editor.validation.validators.GetAllocatablesValidator
+import rba.tool.editor.validation.validators.GetContentsListValidator
+import rba.tool.editor.validation.validators.GetPropertyValidator
+import rba.tool.editor.validation.validators.GreaterThanOperatorValidator
+import rba.tool.editor.validation.validators.HasComeEarlierThanValidator
+import rba.tool.editor.validation.validators.HasComeLaterThanValidator
+import rba.tool.editor.validation.validators.HorizontalLayoutValidator
+import rba.tool.editor.validation.validators.IfStatementValidator
+import rba.tool.editor.validation.validators.ImpliesOperatorValidator
+import rba.tool.editor.validation.validators.IntegerPropertyValidator
+import rba.tool.editor.validation.validators.IsActiveValidator
+import rba.tool.editor.validation.validators.IsAttenuatedValidator
+import rba.tool.editor.validation.validators.IsCanceledValidator
+import rba.tool.editor.validation.validators.IsDisappearedValidator
+import rba.tool.editor.validation.validators.IsEqualToOperatorValidator
+import rba.tool.editor.validation.validators.IsGreaterThanEqualOperatorValidator
+import rba.tool.editor.validation.validators.IsGreaterThanOperatorValidator
+import rba.tool.editor.validation.validators.IsHiddenValidator
+import rba.tool.editor.validation.validators.IsLowerThanEqualOperatorValidator
+import rba.tool.editor.validation.validators.IsLowerThanOperatorValidator
+import rba.tool.editor.validation.validators.IsMutedValidator
+import rba.tool.editor.validation.validators.IsOnValidator
+import rba.tool.editor.validation.validators.IsOutputtedValidator
+import rba.tool.editor.validation.validators.IsSoundingValidator
+import rba.tool.editor.validation.validators.IsVisibleValidator
+import rba.tool.editor.validation.validators.LambdaExpressionValidator
+import rba.tool.editor.validation.validators.LowerThanOperatorValidator
+import rba.tool.editor.validation.validators.MuchGreaterThanOperatorValidator
+import rba.tool.editor.validation.validators.NamedElementValidator
+import rba.tool.editor.validation.validators.NotOperatorValidator
+import rba.tool.editor.validation.validators.ObjectCompareValidator
+import rba.tool.editor.validation.validators.OffSceneValidator
+import rba.tool.editor.validation.validators.OffsetValidator
+import rba.tool.editor.validation.validators.OnSceneValidator
+import rba.tool.editor.validation.validators.OrOperatorValidator
+import rba.tool.editor.validation.validators.OutputtingSoundValidator
+import rba.tool.editor.validation.validators.PackageValidator
+import rba.tool.editor.validation.validators.PlusOperatorValidator
+import rba.tool.editor.validation.validators.PositionContainerValidator
+import rba.tool.editor.validation.validators.SceneValidator
+import rba.tool.editor.validation.validators.SetOfOperatorValidator
+import rba.tool.editor.validation.validators.SetPropertyValidator
+import rba.tool.editor.validation.validators.SoundContentSetValidator
+import rba.tool.editor.validation.validators.SoundContentValidator
+import rba.tool.editor.validation.validators.StateValueValidator
+import rba.tool.editor.validation.validators.ThatOfOperatorValidator
+import rba.tool.editor.validation.validators.VerticalLayoutValidator
+import rba.tool.editor.validation.validators.ViewContentSetValidator
+import rba.tool.editor.validation.validators.ViewContentValidator
+import rba.tool.editor.validation.validators.ZoneSetValidator
+import rba.tool.editor.validation.validators.ObjectCompareNotValidator
+import rba.tool.editor.validation.validators.IsAllocatedToValidator
+import rba.tool.editor.validation.validators.IsChangedValidator
+import rba.tool.editor.validation.validators.IsTranslatedToValidator
+import rba.tool.editor.validation.validators.IsDisplayedOnValidator
+import rba.tool.editor.validation.validators.IsChangedDisplayValidator
+import rba.tool.editor.validation.validators.IsTranslatedViewToValidator
+import rba.tool.editor.validation.validators.IsOutputtedOnValidator
+import rba.tool.editor.validation.validators.IsChangedOutputValidator
+import rba.tool.editor.validation.validators.IsTranslatedSoundToValidator
+import rba.tool.editor.validation.validators.HideLowerPriorityValidator
+import rba.tool.editor.validation.validators.MuteLowerPriorityValidator
+import rba.tool.editor.validation.validators.MinOperatorValidator
+import rba.tool.editor.validation.validators.MaxOperatorValidator
+import rba.tool.editor.validation.validators.SelectOperatorValidator
+import rba.tool.editor.validation.validators.IsTypeOfValidator
+import rba.tool.editor.validation.validators.SizeOperatorValidator
+import rba.tool.editor.validation.validators.ActiveStateValidator
+import rba.tool.editor.validation.validators.ZoneValidator
+import rba.tool.editor.validation.validators.ProjectValidator
+import rba.tool.editor.validation.validators.ContentValidator
+import rba.tool.editor.validation.validators.ActiveContentsValidator
+import rba.tool.editor.validation.validators.LetStatementValidator
+import rba.tool.editor.validation.validators.SizeValidator
+
+/**
+ * This class contains custom validation rules.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+@ComposedChecks(validators=#[
+ NamedElementValidator,
+ IfStatementValidator,
+ PackageValidator,
+ DisplayValidator,
+ CompositeAreaValidator,
+ FixedPositionLayoutValidator,
+ PositionContainerValidator,
+ AreaValidator,
+ VerticalLayoutValidator,
+ HorizontalLayoutValidator,
+ ViewContentValidator,
+ ContentStateValidator,
+ ComparisonAndOperatorValidator,
+ ConstraintValidator,
+ ThatOfOperatorValidator,
+ EqualToOperatorValidatior,
+ GreaterThanOperatorValidator,
+ MuchGreaterThanOperatorValidator,
+ LowerThanOperatorValidator,
+ PlusOperatorValidator,
+ AndOperatorValidator,
+ OrOperatorValidator,
+ ImpliesOperatorValidator,
+ NotOperatorValidator,
+ ObjectCompareValidator,
+ DisplayingContentValidator,
+ GetContentsListValidator,
+ IsActiveValidator,
+ IsVisibleValidator,
+ GetAllocatablesValidator,
+ LambdaExpressionValidator,
+ ForAllOperatorValidator,
+ ExistsOperatorValidator,
+ IsEqualToOperatorValidator,
+ IsGreaterThanOperatorValidator,
+ IsGreaterThanEqualOperatorValidator,
+ IsLowerThanOperatorValidator,
+ IsLowerThanEqualOperatorValidator,
+ IsHiddenValidator,
+ ContentValueValidator,
+ SetOfOperatorValidator,
+ IsOnValidator,
+ IsDisappearedValidator,
+ IsCanceledValidator,
+ OffsetValidator,
+ AreaSetValidator,
+ ViewContentSetValidator,
+ SoundContentSetValidator,
+ AllocatedContentValidator,
+ OnSceneValidator,
+ OffSceneValidator,
+ SetPropertyValidator,
+ GetPropertyValidator,
+ SceneValidator,
+ IntegerPropertyValidator,
+ SoundContentValidator,
+ ContentValidator,
+ ZoneSetValidator,
+ IsSoundingValidator,
+ IsOutputtedValidator,
+ IsMutedValidator,
+ IsAttenuatedValidator,
+ OutputtingSoundValidator,
+ HasComeEarlierThanValidator,
+ HasComeLaterThanValidator,
+ StateValueValidator,
+ ObjectCompareNotValidator,
+ IsAllocatedToValidator,
+ IsChangedValidator,
+ IsTranslatedToValidator,
+ IsDisplayedOnValidator,
+ IsChangedDisplayValidator,
+ IsTranslatedViewToValidator,
+ IsOutputtedOnValidator,
+ IsChangedOutputValidator,
+ IsTranslatedSoundToValidator,
+ HideLowerPriorityValidator,
+ MuteLowerPriorityValidator,
+ ActiveContentsValidator,
+ MinOperatorValidator,
+ MaxOperatorValidator,
+ SelectOperatorValidator,
+ IsTypeOfValidator,
+ SizeOperatorValidator,
+ ActiveStateValidator,
+ ZoneValidator,
+ ProjectValidator,
+ LetStatementValidator,
+ SizeValidator
+])
+class RBAModelValidator extends AbstractRBAModelValidator {
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/UniqueNameValidationHelper.xtend b/rba.tool.editor/src/rba/tool/editor/validation/UniqueNameValidationHelper.xtend
new file mode 100644
index 0000000..dc5ef18
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/UniqueNameValidationHelper.xtend
@@ -0,0 +1,211 @@
+package rba.tool.editor.validation
+
+import com.google.common.collect.Maps
+import com.google.inject.Inject
+import java.util.Map
+import org.eclipse.emf.ecore.EClass
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EStructuralFeature
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.naming.QualifiedName
+import org.eclipse.xtext.resource.IEObjectDescription
+import org.eclipse.xtext.resource.IResourceDescriptionsProvider
+import org.eclipse.xtext.resource.IResourceServiceProvider
+import org.eclipse.xtext.service.OperationCanceledManager
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.util.SimpleAttributeResolver
+import org.eclipse.xtext.validation.ValidationMessageAcceptor
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.rbaEditorModel.RbaEditorModelPackage
+import java.util.List
+import java.util.Arrays
+import rba.core.impl.ProjectImpl
+
+class UniqueNameValidationHelper {
+
+ @Inject
+ private IResourceServiceProvider.Registry resourceServiceProviderRegistry = IResourceServiceProvider.Registry.INSTANCE;
+
+ @Inject
+ private IResourceDescriptionsProvider resourceDescriptionsProvider;
+
+ @Inject
+ private OperationCanceledManager operationCanceledManager = new OperationCanceledManager();
+
+ private static final List<String> RESTRICTED_NAMES = Arrays.asList(
+ "AnyAreasOfContent",
+ "AnyContentsOfArea",
+ "NullExpression"
+ );
+
+ private String NAMEDELEMENT_NAME_DUPLICATE = Messages.NAMEDELEMENT_NAME_DUPLICATE;
+
+ def public void checkUniqueNames(Resource resource, CancelIndicator cancelIndicator, ValidationMessageAcceptor acceptor) {
+ val resourceServiceProvider = resourceServiceProviderRegistry.getResourceServiceProvider(resource.getURI());
+ if(resourceServiceProvider === null) {
+ return;
+ }
+
+ val manager = resourceServiceProvider.getResourceDescriptionManager();
+ if(manager !== null) {
+ val description = manager.getResourceDescription(resource);
+ if(description !== null) {
+ val descriptions = description.getExportedObjects();
+ val currentIter = descriptions.iterator();
+ if(!currentIter.hasNext()) {
+ return;
+ }
+ val clusterToNames = Maps.newHashMap();
+
+ val containerManager = resourceServiceProvider.getContainerManager();
+ val resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resource.getResourceSet());
+ for (container : containerManager.getVisibleContainers(description, resourceDescriptions)) {
+ val siblingsResourceDescriptions = container.resourceDescriptions.filter(r|r.URI.toString !== description.URI.toString);
+ val siblingsObjectDescriptions = siblingsResourceDescriptions.map(srd|srd.exportedObjects.filter[obj|
+ obj.EClass !== RBACorePackage.Literals.TAG && obj.EClass !== RbaEditorModelPackage.Literals.CTAG
+ ]).flatten;
+ for (siblingsObjectDescription : siblingsObjectDescriptions) {
+ initDescriptionForDuplicatedName(siblingsObjectDescription, clusterToNames, acceptor);
+ }
+ }
+
+ while(currentIter.hasNext()) {
+ val objectDescription = currentIter.next();
+ checkDescriptionForDuplicatedName(objectDescription, clusterToNames, acceptor);
+ operationCanceledManager.checkCanceled(cancelIndicator);
+ }
+ }
+ }
+ }
+
+ def protected void initDescriptionForDuplicatedName(IEObjectDescription description, Map<EClass, Map<QualifiedName, IEObjectDescription>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ val object = description.getEObjectOrProxy();
+ val eClass = object.eClass();
+ val qualifiedName = description.getName();
+ val clusterType = getAssociatedClusterType(eClass);
+ if(clusterType === null) {
+ return;
+ }
+
+ val nameToDescription = clusterTypeToName.get(clusterType);
+ if(nameToDescription === null) {
+ val newNameToDescription = Maps.newHashMap();
+ newNameToDescription.put(qualifiedName, description);
+ clusterTypeToName.put(clusterType, newNameToDescription);
+ } else if(!nameToDescription.containsKey(qualifiedName)) {
+ nameToDescription.put(qualifiedName, description);
+ }
+ }
+
+ def protected void checkDescriptionForDuplicatedName(IEObjectDescription description, Map<EClass, Map<QualifiedName, IEObjectDescription>> clusterTypeToName, ValidationMessageAcceptor acceptor) {
+ val object = description.getEObjectOrProxy();
+ val eClass = object.eClass();
+ if(eClass === RBACorePackage.Literals.VARIABLE) {
+ return;
+ }
+
+ if(eClass === RBACorePackage.Literals.TAG || eClass === RbaEditorModelPackage.Literals.CTAG) {
+ return;
+ }
+
+ val qualifiedName = description.getName();
+ val clusterType = getAssociatedClusterType(eClass);
+ if(clusterType === null) {
+ return;
+ }
+
+ val nameToDescription = clusterTypeToName.get(clusterType);
+ if(nameToDescription === null) {
+ val newNameToDescription = Maps.newHashMap();
+ newNameToDescription.put(qualifiedName, description);
+ clusterTypeToName.put(clusterType, newNameToDescription);
+ } else {
+ if(nameToDescription.containsKey(qualifiedName)) {
+ val prevDescription = nameToDescription.get(qualifiedName);
+
+ if(prevDescription !== null && !(prevDescription.getEObjectOrProxy() instanceof ProjectImpl)) {
+ createDuplicateNameError(prevDescription, clusterType, acceptor);
+ nameToDescription.put(qualifiedName, null);
+ }
+ createDuplicateNameError(description, clusterType, acceptor);
+ } else if(isNamingRestricted(qualifiedName)){
+ createNamingRestrictionError(description, clusterType, acceptor, qualifiedName)
+ } else {
+ nameToDescription.put(qualifiedName, description);
+ }
+ }
+ }
+
+ def protected void createDuplicateNameError(IEObjectDescription description, EClass clusterType, ValidationMessageAcceptor acceptor) {
+ val object = description.getEObjectOrProxy();
+ if(object.eIsProxy) {
+ return;
+ }
+
+ val feature = getNameFeature(object);
+ acceptor.acceptError(getDuplicateNameErrorMessage(description), object, feature, ValidationMessageAcceptor.INSIGNIFICANT_INDEX, getErrorCode());
+ }
+
+ def String getDuplicateNameErrorMessage(IEObjectDescription description) {
+ val qualifiedName = description.getQualifiedName().toString();
+ val shortName = String.valueOf(if(qualifiedName !== null && qualifiedName !== "") qualifiedName else "<unnamed>");
+ return String.format(NAMEDELEMENT_NAME_DUPLICATE, shortName);
+ }
+
+ def protected boolean isContainerInformationHelpful(IEObjectDescription description, EObject container, String containerTypeLabel, EStructuralFeature containerNameFeature) {
+ return containerTypeLabel !== null && containerNameFeature !== null;
+ }
+
+ def protected boolean isContainerInformationHelpful(IEObjectDescription description, String shortName) {
+ return true;
+ }
+
+ def protected EObject getContainerForErrorMessage(EObject object) {
+ return object.eContainer();
+ }
+
+ def protected String getTypeLabel(EClass eClass) {
+ return eClass.getName();
+ }
+
+ def protected EStructuralFeature getNameFeature(EObject object) {
+ return SimpleAttributeResolver.NAME_RESOLVER.getAttribute(object);
+ }
+
+ def protected EClass getAssociatedClusterType(EClass eClass) {
+ val superTypes = eClass.getESuperTypes();
+ if(superTypes.isEmpty()) {
+ return null;
+ }
+ if(superTypes.contains(RBACorePackage.Literals.NAMED_ELEMENT)) {
+ return RBACorePackage.Literals.NAMED_ELEMENT;
+ }
+ return getAssociatedClusterType(superTypes.get(0));
+ }
+
+ def protected String getErrorCode() {
+ return null;
+ }
+
+ def protected boolean isNamingRestricted(QualifiedName qualifiedName){
+ if ( qualifiedName.getSegments().size() > 0 ) {
+ val i = qualifiedName.getSegments().size() - 1;
+ if( RESTRICTED_NAMES.contains(qualifiedName.getSegments().get(i).toString) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ def protected void createNamingRestrictionError(IEObjectDescription description, EClass clusterType,
+ ValidationMessageAcceptor acceptor, QualifiedName qualifiedName) {
+ val object = description.getEObjectOrProxy();
+ if (object.eIsProxy) {
+ return;
+ }
+ val feature = getNameFeature(object);
+ val errorMessage = String.format(Messages.NAME_RESTRICTION, object.eClass.name, qualifiedName.toString)
+ acceptor.acceptError(errorMessage, object, feature, ValidationMessageAcceptor.INSIGNIFICANT_INDEX,getErrorCode());
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentOperatorValidator.xtend
new file mode 100644
index 0000000..7ed88f3
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentOperatorValidator.xtend
@@ -0,0 +1,7 @@
+package rba.tool.editor.validation.validators
+
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+abstract class AbstractContentOperatorValidator extends AbstractRBAModelValidator {
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentValidator.xtend
new file mode 100644
index 0000000..3fc2a1a
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AbstractContentValidator.xtend
@@ -0,0 +1,59 @@
+package rba.tool.editor.validation.validators
+
+import com.google.common.collect.Sets
+import com.google.inject.Inject
+import java.util.Set
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.CancelableDiagnostician
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AbstractContent
+import rba.tool.editor.util.RBAModelEditorToolUtil
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.tool.editor.validation.ContentAllocatableListValidationHelper
+
+abstract class AbstractContentValidator extends AbstractRBAModelValidator {
+
+ @Inject private ContentAllocatableListValidationHelper helper;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def public void checkCircularContainment(AbstractContent abstractContent) {
+ val context = getContext();
+ val resource = abstractContent.eResource();
+ if(resource === null) {
+ return;
+ }
+
+ if(context !== null) {
+ var Object contextValue;
+ if(context.containsKey(resource)) {
+ contextValue = context.get(resource);
+ }
+ if(!(contextValue instanceof Set<?>)) {
+ context.put(resource, Sets.newHashSet());
+ }
+ if(RBAModelEditorToolUtil.isValidated((contextValue), this)) {
+ return; // resource was already validated
+ }
+
+ (contextValue as Set).add(this);
+ docheckCrossReferenceEmpty(resource, context.get(CancelableDiagnostician.CANCEL_INDICATOR) as CancelIndicator);
+ return;
+ }
+ docheckCrossReferenceEmpty(resource, null);
+ }
+
+ def public void docheckCrossReferenceEmpty(Resource resource, CancelIndicator cancelIndicator) {
+ helper.checkCrossReferenceEmpty(resource, cancelIndicator, this);
+ }
+
+ override protected checkIsFromCurrentlyCheckedResource(EObject object) {
+ // do nothing
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveContentsValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveContentsValidator.xtend
new file mode 100644
index 0000000..e250efa
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveContentsValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ActiveContents
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+
+class ActiveContentsValidator extends AbstractRBAModelValidator {
+
+ private String OPERAND_SIZE_ONE = Messages.OPERAND_SIZE_ONE;
+ private String FIRST_OPERAND_MUST_ALLOCATABLE = Messages.FIRST_OPERAND_MUST_ALLOCATABLE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkActivateContent(ActiveContents op) {
+ if (op.operand.size != 1) {
+ error(String.format(OPERAND_SIZE_ONE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var firstOperand = op.operand.get(0)
+ if (firstOperand.type != ExpressionType::AREA && firstOperand.type != ExpressionType::ZONE) {
+ error(String.format(FIRST_OPERAND_MUST_ALLOCATABLE, op.symbol),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveStateValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveStateValidator.xtend
new file mode 100644
index 0000000..4522163
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ActiveStateValidator.xtend
@@ -0,0 +1,32 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+import rba.core.ActiveState
+
+class ActiveStateValidator extends AbstractRBAModelValidator {
+
+ private String OPERAND_SIZE_ONE = Messages.OPERAND_SIZE_ONE;
+ private String FIRST_OPERAND_MUST_CONTENT = Messages.FIRST_OPERAND_MUST_CONTENT;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkActiveState(ActiveState op) {
+ if (op.operand.size < 1) {
+ error(String.format(OPERAND_SIZE_ONE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if (operand.type != ExpressionType.CONTENT && operand.type != ExpressionType.SOUND) {
+ error(String.format(FIRST_OPERAND_MUST_CONTENT, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatableSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatableSetValidator.xtend
new file mode 100644
index 0000000..d408d23
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatableSetValidator.xtend
@@ -0,0 +1,59 @@
+package rba.tool.editor.validation.validators
+
+import com.google.common.collect.Sets
+import com.google.inject.Inject
+import java.util.Set
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.CancelableDiagnostician
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AllocatableSet
+import rba.tool.editor.util.RBAModelEditorToolUtil
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.tool.editor.validation.CircularContainmentValidationHelper
+
+abstract class AllocatableSetValidator extends AbstractRBAModelValidator {
+
+ @Inject private CircularContainmentValidationHelper helper;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def public void checkCircularContainment(AllocatableSet allocatableSet) {
+ val context = getContext();
+ val resource = allocatableSet.eResource();
+ if (resource === null) {
+ return;
+ }
+
+ if (context !== null) {
+ var Object contextValue;
+ if (context.containsKey(resource)) {
+ contextValue = context.get(resource);
+ }
+ if (!(contextValue instanceof Set<?>)) {
+ context.put(resource, Sets.newHashSet());
+ }
+ if (RBAModelEditorToolUtil.isValidated((contextValue), this)) {
+ return; // resource was already validated
+ }
+
+ (contextValue as Set).add(this);
+ doCheckCircularContainment(resource, context.get(CancelableDiagnostician.CANCEL_INDICATOR) as CancelIndicator);
+ return;
+ }
+ doCheckCircularContainment(resource, null);
+ }
+
+ def public void doCheckCircularContainment(Resource resource, CancelIndicator cancelIndicator) {
+ helper.checkCircularContainment(resource, cancelIndicator, this);
+ }
+
+ override protected checkIsFromCurrentlyCheckedResource(EObject object) {
+ // do nothing
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatedContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatedContentValidator.xtend
new file mode 100644
index 0000000..5e07e8e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AllocatedContentValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AllocatedContent
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class AllocatedContentValidator extends AbstractRBAModelValidator {
+
+ private String ALLOCATEDCONTENT_TYPE = Messages.ALLOCATEDCONTENT_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkAllocatedContent(AllocatedContent allocatedContent) {
+ for (operand : allocatedContent.operand) {
+ switch (operand.type) {
+ case ExpressionType.AREA,
+ case ExpressionType.SET_OF_AREA,
+ case ExpressionType.ZONE,
+ case ExpressionType.SET_OF_ZONE: {
+ return;
+ }
+ default: {
+ error(ALLOCATEDCONTENT_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AndOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AndOperatorValidator.xtend
new file mode 100644
index 0000000..8bea0d5
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AndOperatorValidator.xtend
@@ -0,0 +1,35 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AndOperator
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class AndOperatorValidator extends AbstractRBAModelValidator {
+
+ private String AND_OPERAND_SIZE = Messages.AND_OPERAND_SIZE;
+
+ private String AND_OPERAND_TYPE = Messages.AND_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkAndOperator(AndOperator andOperator) {
+ if (andOperator.operand.size < 2) {
+ error(AND_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < andOperator.operand.size; i++) {
+ var operand = andOperator.operand.get(i)
+ if (operand.type != ExpressionType.BOOLEAN) {
+ error(AND_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaSetValidator.xtend
new file mode 100644
index 0000000..b87dcb6
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaSetValidator.xtend
@@ -0,0 +1,47 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import rba.core.AbstractAllocatable
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.view.Area
+import rba.view.AreaSet
+
+class AreaSetValidator extends AllocatableSetValidator {
+
+ private String AREASET_TARGET_SIZE = Messages.AREASET_TARGET_SIZE;
+
+ private String AREASET_TARGET_INVALID_TYPE = Messages.AREASET_TARGET_INVALID_TYPE;
+
+ private String AREASET_TARGET_INCLUDE_SELF = Messages.AREASET_TARGET_INCLUDE_SELF;
+
+ private String AREASET_TARGET_DUPLICATE = Messages.AREASET_TARGET_DUPLICATE;
+
+ @Check(NORMAL)
+ def checkContent(AreaSet areaSet) {
+ if (areaSet.target.size === 0) {
+ warning(String.format(AREASET_TARGET_SIZE, areaSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET);
+ }
+
+ if (areaSet.target.contains(areaSet)) {
+ error(String.format(AREASET_TARGET_INCLUDE_SELF, areaSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, areaSet.target.indexOf(areaSet));
+ return;
+ }
+
+ var hash = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < areaSet.target.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = areaSet.target.get(index);
+ if (!(abstractAllocatable instanceof Area || abstractAllocatable instanceof AreaSet)) {
+ error(String.format(AREASET_TARGET_INVALID_TYPE, areaSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, index);
+ return;
+ }
+ if (hash.contains(abstractAllocatable)) {
+ error(String.format(AREASET_TARGET_DUPLICATE, areaSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, index);
+ return;
+ } else {
+ hash.add(abstractAllocatable)
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaValidator.xtend
new file mode 100644
index 0000000..9df27ec
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/AreaValidator.xtend
@@ -0,0 +1,74 @@
+package rba.tool.editor.validation.validators
+
+import java.util.function.Consumer
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.rbaEditorModel.CTag
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.Area
+import rba.view.RBAViewPackage
+
+class AreaValidator extends AbstractRBAModelValidator {
+
+
+ private String AREA_VISIBILITY_TYPE = Messages.AREA_VISIBILITY_TYPE;
+
+ private String AREA_ZORDER_TYPE = Messages.AREA_ZORDER_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ private Consumer<String> errorToName = [msg|error(msg, RBACorePackage.Literals.NAMED_ELEMENT__NAME, 0)];
+
+ @Check(NORMAL)
+ def checkArea(Area area) {
+// for (var index = 0; index < area.tags.size; index.operator_plusPlus()) {
+// val Tag tag = area.tags.get(index);
+// if (!tag.stereotype.targetModelName.equals(Area.simpleName)) {
+// error(String.format(TARGET_MODEL_NAME_MISMATCH, Area.simpleName, tag.stereotype.targetModelName), RBACorePackage.Literals.TAG__STEREOTYPE);
+// return;
+// }
+// }
+ }
+
+ @Check(NORMAL)
+ def check0RequiredFields(Area area) {
+// println(this.class.simpleName)
+ val tags = area.tags;
+
+ if(tags.isNullOrEmpty || !tags.filter(CTag).isEmpty) {
+ if(!doRequiredFieldsCheck(area)) return;
+ }
+ }
+
+ def protected doRequiredFieldsCheck(Area area) {
+ var passed = false;
+ passed = ValidatorUtils.mustHaveVisibility(area, errorToName)
+ if(!passed) {
+ return false;
+ }
+ if(area.visibility.type != ExpressionType.VALUE) {
+ error(String.format(AREA_VISIBILITY_TYPE, area.name), RBACorePackage.Literals.ALLOCATABLE__VISIBILITY);
+ return false;
+ }
+ passed = ValidatorUtils.mustHaveZorder(area, errorToName);
+ if(!passed) {
+ return false;
+ }
+ if(area.zorder.type != ExpressionType.VALUE) {
+ error(String.format(AREA_ZORDER_TYPE, area.name), RBAViewPackage.Literals.AREA__ZORDER);
+ return false;
+ }
+ passed = ValidatorUtils.mustHaveLeastOneSize(area, errorToName);
+ if(!passed) {
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ComparisonAndOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ComparisonAndOperatorValidator.xtend
new file mode 100644
index 0000000..945ce88
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ComparisonAndOperatorValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ComparisonAnd
+import rba.core.ComparisonOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ComparisonAndOperatorValidator extends AbstractRBAModelValidator {
+
+ private String COMPARISONAND_OPERAND_SIZE = Messages.COMPARISONAND_OPERAND_SIZE;
+
+ private String COMPARISONAND_OPERAND_TYPE = Messages.COMPARISONAND_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(FAST)
+ def checkComparisonOperatorFast(ComparisonAnd comparisonAnd) {
+ if (comparisonAnd.operand.size < 2) {
+ error(COMPARISONAND_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ @Check(NORMAL)
+ def checkComparisonOperatorNormal(ComparisonAnd comparisonAnd) {
+ for (operand : comparisonAnd.operand) {
+ if (operand instanceof ComparisonOperator) {
+ } else {
+ error(COMPARISONAND_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/CompositeAreaValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/CompositeAreaValidator.xtend
new file mode 100644
index 0000000..03a9d5b
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/CompositeAreaValidator.xtend
@@ -0,0 +1,26 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.CompositeArea
+import rba.view.RBAViewPackage
+
+class CompositeAreaValidator extends AbstractRBAModelValidator {
+
+ private String COMPOSITE_AREA_CHECK = Messages.COMPOSITE_AREA_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkCompositeArea(CompositeArea compositeArea) {
+ if (compositeArea.layout === null) {
+ error(String.format(COMPOSITE_AREA_CHECK, compositeArea.name),
+ RBAViewPackage.Literals.COMPOSITE_AREA__LAYOUT);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ConstraintValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ConstraintValidator.xtend
new file mode 100644
index 0000000..1625897
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ConstraintValidator.xtend
@@ -0,0 +1,27 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.Constraint
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ConstraintValidator extends AbstractRBAModelValidator {
+
+ private String CONSTRAINT_EXPRESSION_TYPE = Messages.CONSTRAINT_EXPRESSION_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkConstraint(Constraint constraint) {
+ if (constraint.expression.type !== ExpressionType.BOOLEAN) {
+ error(CONSTRAINT_EXPRESSION_TYPE, RBACorePackage.Literals.ABSTRACT_CONSTRAINT__EXPRESSION);
+ return;
+ }
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentSetValidator.xtend
new file mode 100644
index 0000000..701e445
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentSetValidator.xtend
@@ -0,0 +1,59 @@
+package rba.tool.editor.validation.validators
+
+import com.google.common.collect.Sets
+import com.google.inject.Inject
+import java.util.Set
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.CancelableDiagnostician
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ContentSet
+import rba.tool.editor.util.RBAModelEditorToolUtil
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.tool.editor.validation.CircularContainmentValidationHelper
+
+abstract class ContentSetValidator extends AbstractRBAModelValidator {
+
+ @Inject private CircularContainmentValidationHelper helper;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def public void checkCircularContainment(ContentSet contentSet) {
+ val context = getContext();
+ val resource = contentSet.eResource();
+ if (resource === null) {
+ return;
+ }
+
+ if (context !== null) {
+ var Object contextValue;
+ if (context.containsKey(resource)) {
+ contextValue = context.get(resource);
+ }
+ if (!(contextValue instanceof Set<?>)) {
+ context.put(resource, Sets.newHashSet());
+ }
+ if (RBAModelEditorToolUtil.isValidated((contextValue), this)) {
+ return; // resource was already validated
+ }
+
+ (contextValue as Set).add(this);
+ doCheckCircularContainment(resource, context.get(CancelableDiagnostician.CANCEL_INDICATOR) as CancelIndicator);
+ return;
+ }
+ doCheckCircularContainment(resource, null);
+ }
+
+ def public void doCheckCircularContainment(Resource resource, CancelIndicator cancelIndicator) {
+ helper.checkCircularContainment(resource, cancelIndicator, this);
+ }
+
+ override protected checkIsFromCurrentlyCheckedResource(EObject object) {
+ // do nothing
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentStateValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentStateValidator.xtend
new file mode 100644
index 0000000..2dd45a3
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentStateValidator.xtend
@@ -0,0 +1,26 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ContentState
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ContentStateValidator extends AbstractRBAModelValidator {
+
+ private String CONTENTSTATE_TYPE = Messages.CONTENTSTATE_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkContentState(ContentState contentState) {
+ if (contentState.value.type != ExpressionType.VALUE) {
+ error(String.format(CONTENTSTATE_TYPE, contentState.name), RBACorePackage.Literals.CONTENT_STATE__VALUE)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValidator.xtend
new file mode 100644
index 0000000..885698e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValidator.xtend
@@ -0,0 +1,20 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.Content
+
+class ContentValidator extends AbstractRBAModelValidator {
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkContent(Content content) {
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValueValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValueValidator.xtend
new file mode 100644
index 0000000..fc97945
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ContentValueValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ContentValue
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ContentValueValidator extends AbstractRBAModelValidator {
+
+ private String CONTENTVALUE_SIZE = Messages.CONTENTVALUE_SIZE;
+
+ private String CONTENTVALUE_TYPE = Messages.CONTENTVALUE_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkContentValue(ContentValue contentValue) {
+ if (contentValue.operand.size > 1) {
+ error(CONTENTVALUE_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : contentValue.operand) {
+ if (operand.type != ExpressionType.AREA && operand.type != ExpressionType.ZONE) {
+ error(CONTENTVALUE_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayValidator.xtend
new file mode 100644
index 0000000..5e7225d
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayValidator.xtend
@@ -0,0 +1,91 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import java.util.Set
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.AlignedLayout
+import rba.view.Area
+import rba.view.CompositeArea
+import rba.view.Display
+import rba.view.FixedPositionLayout
+import rba.view.PositionContainer
+import rba.view.RBAViewPackage
+import rba.view.Size
+import rba.view.SizeIdentifier
+import rba.view.SizeReference
+
+class DisplayValidator extends AbstractRBAModelValidator {
+
+ private String DISPLAY_AREA_SIZE_CHECK = Messages.DISPLAY_AREA_SIZE_CHECK
+
+ private String DISPLAY_ROOT_CHECK = Messages.DISPLAY_ROOT_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkDisplay(Display display) {
+ if (display.root === null) {
+ error(String.format(DISPLAY_ROOT_CHECK, display.name), RBAViewPackage.Literals.DISPLAY__ROOT);
+ return;
+ }
+ var size = display.size as SizeIdentifier
+ var displaySize = getSize(size);
+ var displayWidth = displaySize.width
+ var displayHeight = displaySize.height
+
+ if (display.root !== null && display.root.eContainer !== null) {
+ var Set<Area> areaList = new HashSet
+ getAreas(display.root, areaList)
+ for (a : areaList) {
+ var area = a as Area
+ for (sizeIdentifier : area.size) {
+ var areaSize = getSize(sizeIdentifier)
+ var areaWidth = areaSize.width
+ var areaHeight = areaSize.height
+
+ if (areaWidth > displayWidth || areaHeight > displayHeight) {
+ warning(String.format(DISPLAY_AREA_SIZE_CHECK, display.name), RBAViewPackage.Literals.DISPLAY__ROOT)
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ // get all areas from display
+ def void getAreas(CompositeArea compositeArea, Set<Area> areaList) {
+ if (compositeArea !== null) {
+ var layout = compositeArea.layout
+ if (layout instanceof AlignedLayout) {
+ var aliginedLayout = layout as AlignedLayout
+ for (subArea : aliginedLayout.subarea) {
+ areaList.addAll(subArea);
+ }
+ } else if (layout instanceof FixedPositionLayout) {
+ var fixedPositionLayout = layout as FixedPositionLayout
+ var positions = fixedPositionLayout.subAreaPosition
+ for (position : positions) {
+ if (position instanceof PositionContainer) {
+ var pos = position as PositionContainer
+ areaList.add(pos.area);
+ }
+ }
+ }
+ }
+ }
+
+ // get Size from SizeIdentifier
+ def Size getSize(SizeIdentifier size) {
+ if (size instanceof Size) {
+ return size as Size
+ } else if (size instanceof SizeReference) {
+ var sizeRef = size as SizeReference
+ return sizeRef.size as Size
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayingContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayingContentValidator.xtend
new file mode 100644
index 0000000..9b2cac6
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/DisplayingContentValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.DisplayingContent
+
+class DisplayingContentValidator extends AbstractRBAModelValidator {
+
+ private String DISPLAYINGCONTENT_SIZE = Messages.DISPLAYINGCONTENT_SIZE;
+
+ private String DISPLAYINGCONTENT_TYPE = Messages.DISPLAYINGCONTENT_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkDisplayingContent(DisplayingContent displayingContent) {
+ if (displayingContent.operand.size > 1) {
+ error(DISPLAYINGCONTENT_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : displayingContent.operand) {
+ if (operand.type != ExpressionType.AREA) {
+ error(DISPLAYINGCONTENT_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/EqualToOperatorValidatior.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/EqualToOperatorValidatior.xtend
new file mode 100644
index 0000000..0786662
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/EqualToOperatorValidatior.xtend
@@ -0,0 +1,42 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.EqualToOperator
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class EqualToOperatorValidatior extends AbstractRBAModelValidator {
+
+ private String EQUALTO_OPERAND_SIZE_NULL = Messages.EQUALTO_OPERAND_SIZE_NULL;
+
+ private String EQUALTO_OPERAND_SIZE = Messages.EQUALTO_OPERAND_SIZE;
+
+ private String EQUALTO_OPERAND_TYPE = Messages.EQUALTO_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkEqualToOperator(EqualToOperator equalToOperator) {
+
+ if (equalToOperator.operand.size == 0) {
+ error(EQUALTO_OPERAND_SIZE_NULL, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ if (equalToOperator.operand.size != 1) {
+ error(EQUALTO_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ for (operand : equalToOperator.operand) {
+ if (operand.type != ExpressionType.VALUE) {
+ error(EQUALTO_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ExistsOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ExistsOperatorValidator.xtend
new file mode 100644
index 0000000..ea86433
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ExistsOperatorValidator.xtend
@@ -0,0 +1,48 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExistsOperator
+import rba.core.Expression
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.core.SetOfOperator
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ExistsOperatorValidator extends AbstractRBAModelValidator {
+
+ private String EXISTS_OPERAND_SIZE = Messages.EXISTS_OPERAND_SIZE;
+
+ private String EXISTS_OPERAND_TYPE = Messages.EXISTS_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkExistsOperator(ExistsOperator existsOperator) {
+ if (existsOperator.operand.size > 1) {
+ error(EXISTS_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand = existsOperator.operand.get(0)
+ if (operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA &&
+ operand.type != ExpressionType.SET_OF_ZONE && operand.type != ExpressionType.SET_OF_SOUND &&
+ isInvalidSetOfOperator(operand)) {
+ error(EXISTS_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ // check whether operator is SetOfOperator and operand type is not type of Area,Content,Zone,Sound or Animation
+ def isInvalidSetOfOperator(Expression operand) {
+ if (operand instanceof SetOfOperator) {
+ if (operand.type == ExpressionType.AREA || operand.type == ExpressionType.CONTENT ||
+ operand.type == ExpressionType.ZONE || operand.type == ExpressionType.SOUND) {
+ return false
+ }
+ }
+ return true
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/FixedPositionLayoutValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/FixedPositionLayoutValidator.xtend
new file mode 100644
index 0000000..718f135
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/FixedPositionLayoutValidator.xtend
@@ -0,0 +1,25 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.FixedPositionLayout
+import rba.view.RBAViewPackage
+
+class FixedPositionLayoutValidator extends AbstractRBAModelValidator {
+
+ private String FIXEDPOSITION_LAYOUT_CHECK = Messages.FIXEDPOSITION_LAYOUT_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkFixedPositionLayout(FixedPositionLayout fixedPositionLayout) {
+ if (fixedPositionLayout.subAreaPosition.size == 0) {
+ error(FIXEDPOSITION_LAYOUT_CHECK, RBAViewPackage.Literals.FIXED_POSITION_LAYOUT__SUB_AREA_POSITION);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ForAllOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ForAllOperatorValidator.xtend
new file mode 100644
index 0000000..2e05f33
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ForAllOperatorValidator.xtend
@@ -0,0 +1,58 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.Expression
+import rba.core.ExpressionType
+import rba.core.ForAllOperator
+import rba.core.RBACorePackage
+import rba.core.SetOfOperator
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ForAllOperatorValidator extends AbstractRBAModelValidator {
+
+ private String FORALL_OPERAND_SIZE = Messages.FORALL_OPERAND_SIZE;
+
+ private String FORALL_OPERAND_TYPE = Messages.FORALL_OPERAND_TYPE;
+
+ private String FORALL_LAMBDA_TYPE = Messages.FORALL_LAMBDA_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkForAllOperator(ForAllOperator forAllOperator) {
+ if (forAllOperator.operand.size > 1) {
+ error(FORALL_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand = forAllOperator.operand.get(0)
+
+ if (operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA &&
+ operand.type != ExpressionType.SET_OF_SOUND && operand.type != ExpressionType.SET_OF_ZONE &&
+ isInvalidSetOfOperator(operand)) {
+ error(FORALL_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+
+ var bodytext = forAllOperator.lambda.bodyText;
+ if (bodytext.type != ExpressionType.BOOLEAN) {
+ error(FORALL_LAMBDA_TYPE, RBACorePackage.Literals.LAMBDA_EXPRESSION__BODY_TEXT)
+ return;
+ }
+
+ }
+
+ //check whether operator is SetOfOperator and operand type is not type of Area,Content,Zone,Sound or Animation
+ def isInvalidSetOfOperator(Expression operand) {
+ if (operand instanceof SetOfOperator) {
+ if (operand.type == ExpressionType.AREA || operand.type == ExpressionType.CONTENT ||
+ operand.type == ExpressionType.ZONE || operand.type == ExpressionType.SOUND) {
+ return false
+ }
+ }
+ return true
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/GetAllocatablesValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetAllocatablesValidator.xtend
new file mode 100644
index 0000000..a31f2f8
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetAllocatablesValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.GetAllocatables
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class GetAllocatablesValidator extends AbstractRBAModelValidator {
+
+ private String GETALLOCATABLES_SIZE = Messages.GETALLOCATABLES_SIZE;
+
+ private String GETALLOCATABLES_TYPE = Messages.GETALLOCATABLES_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkGetAllocatable(GetAllocatables getAllocatable) {
+ if (getAllocatable.operand.size > 1) {
+ error(GETALLOCATABLES_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : getAllocatable.operand) {
+ if (operand.type != ExpressionType.CONTENT && operand.type != ExpressionType.SOUND) {
+ error(GETALLOCATABLES_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/GetContentsListValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetContentsListValidator.xtend
new file mode 100644
index 0000000..9912496
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetContentsListValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.GetContentsList
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class GetContentsListValidator extends AbstractRBAModelValidator {
+
+ private String GETCONTENTSLIST_SIZE = Messages.GETCONTENTSLIST_SIZE;
+
+ private String GETCONTENTSLIST_TYPE = Messages.GETCONTENTSLIST_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkGetContentsList(GetContentsList getContentsList) {
+ if (getContentsList.operand.size > 1) {
+ error(GETCONTENTSLIST_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : getContentsList.operand) {
+ if (operand.type != ExpressionType.AREA && operand.type != ExpressionType.ZONE) {
+ error(GETCONTENTSLIST_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/GetPropertyValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetPropertyValidator.xtend
new file mode 100644
index 0000000..e21fbd7
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/GetPropertyValidator.xtend
@@ -0,0 +1,60 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.GetProperty
+import rba.core.IntegerProperty
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.Scene
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+
+class GetPropertyValidator extends AbstractRBAModelValidator {
+
+ private String GETPROPERTY_OPERAND_SIZE_CHECK = Messages.GETPROPERTY_OPERAND_SIZE_CHECK;
+
+ private String GETPROPERTY_OPERAND_TYPE_CHECK = Messages.GETPROPERTY_OPERAND_TYPE_CHECK;
+
+ private String GETPROPERTY_OPERAND_ISGLOBALSCENE = Messages.GETPROPERTY_OPERAND_ISGLOBALSCENE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkGetProperty(GetProperty getProperty) {
+ if (getProperty.operand.size > 1) {
+ error(GETPROPERTY_OPERAND_SIZE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand = getProperty.operand.get(0)
+ if (operand.type != ExpressionType.PROPERTY) {
+ error(GETPROPERTY_OPERAND_TYPE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (operand instanceof ObjectReference) {
+ var parent = isParentScene(operand.refObject)
+ if (parent !== null) {
+ var scene = parent as Scene
+ if (!scene.global) {
+ error(GETPROPERTY_OPERAND_ISGLOBALSCENE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ } else {
+ }
+ }
+ }
+
+ def EObject isParentScene(EObject object) {
+ if (object instanceof Scene) {
+ return object as Scene;
+ }
+ if (object instanceof IntegerProperty) {
+ return isParentScene(object.owner)
+ }
+ return null;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/GreaterThanOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/GreaterThanOperatorValidator.xtend
new file mode 100644
index 0000000..81adc96
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/GreaterThanOperatorValidator.xtend
@@ -0,0 +1,40 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.GreaterThanOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class GreaterThanOperatorValidator extends AbstractRBAModelValidator {
+
+ private String GREATERTHAN_OPERAND_SIZE_NULL = Messages.GREATERTHAN_OPERAND_SIZE_NULL;
+
+ private String GREATERTHAN_OPERAND_SIZE = Messages.GREATERTHAN_OPERAND_SIZE;
+
+ private String GREATERTHAN_OPERAND_TYPE = Messages.GREATERTHAN_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkGreaterThanOperator(GreaterThanOperator greaterThanOperator) {
+ if (greaterThanOperator.operand.size === 0) {
+ error(GREATERTHAN_OPERAND_SIZE_NULL, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ if (greaterThanOperator.operand.size != 1) {
+ error(GREATERTHAN_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ for (operand : greaterThanOperator.operand) {
+ if (operand.type != ExpressionType.VALUE) {
+ error(GREATERTHAN_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeEarlierThanValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeEarlierThanValidator.xtend
new file mode 100644
index 0000000..16a8c34
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeEarlierThanValidator.xtend
@@ -0,0 +1,51 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.HasComeEarlierThan
+import rba.core.PreviousModifier
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class HasComeEarlierThanValidator extends AbstractRBAModelValidator {
+
+ private static final String TargetOperatorName = HasComeEarlierThan.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkContentValue(HasComeEarlierThan hasComeEarlierThan) {
+ if (hasComeEarlierThan.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var firstOperand = hasComeEarlierThan.operand.get(0)
+ if (firstOperand.type != ExpressionType::CONTENT && firstOperand.type != ExpressionType::SOUND) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_CONTENT, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var argument = hasComeEarlierThan.operand.get(1)
+ if (argument.type != ExpressionType::CONTENT && argument.type != ExpressionType::SOUND) {
+ error(String.format(Messages.ARGUMENT_MUST_CONTENT, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ if (firstOperand instanceof PreviousModifier) {
+ error(String.format(Messages.OPERAND_CANNOT_USE_PRE, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (argument instanceof PreviousModifier) {
+ error(String.format(Messages.ARGUMENT_CANNOT_USE_PRE, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeLaterThanValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeLaterThanValidator.xtend
new file mode 100644
index 0000000..3d2d449
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/HasComeLaterThanValidator.xtend
@@ -0,0 +1,51 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.HasComeLaterThan
+import rba.core.PreviousModifier
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class HasComeLaterThanValidator extends AbstractRBAModelValidator {
+
+ private static final String TargetOperatorName = HasComeLaterThan.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkContentValue(HasComeLaterThan hasComeLaterThan) {
+ if (hasComeLaterThan.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var firstOperand = hasComeLaterThan.operand.get(0)
+ if (firstOperand.type != ExpressionType::CONTENT && firstOperand.type != ExpressionType::SOUND) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_CONTENT, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var argument = hasComeLaterThan.operand.get(1)
+ if (argument.type != ExpressionType::CONTENT && argument.type != ExpressionType::SOUND) {
+ error(String.format(Messages.ARGUMENT_MUST_CONTENT, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ if (firstOperand instanceof PreviousModifier) {
+ error(String.format(Messages.OPERAND_CANNOT_USE_PRE, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (argument instanceof PreviousModifier) {
+ error(String.format(Messages.ARGUMENT_CANNOT_USE_PRE, TargetOperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/HideLowerPriorityValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/HideLowerPriorityValidator.xtend
new file mode 100644
index 0000000..294558c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/HideLowerPriorityValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.HideLowerPriority
+
+class HideLowerPriorityValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = HideLowerPriority.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkHideLowerPriority(HideLowerPriority hideLowerPriority) {
+ if (hideLowerPriority.operand.size != 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstArgument = hideLowerPriority.operand.get(0)
+ if (firstArgument.type != ExpressionType::AREA) {
+ error(String.format(Messages.ARGUMENT_MUST_AREA, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var secondArgument = hideLowerPriority.operand.get(1)
+ if (secondArgument.type != ExpressionType::AREA) {
+ error(String.format(Messages.ARGUMENT_MUST_AREA, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/HorizontalLayoutValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/HorizontalLayoutValidator.xtend
new file mode 100644
index 0000000..e16e33b
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/HorizontalLayoutValidator.xtend
@@ -0,0 +1,25 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.HorizontalLayout
+import rba.view.RBAViewPackage
+
+class HorizontalLayoutValidator extends AbstractRBAModelValidator {
+
+ private String HORIZONTAL_LAYOUT_CHECK = Messages.HORIZONTAL_LAYOUT_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkHorizontalLayout(HorizontalLayout horizontalLayout) {
+ if (horizontalLayout.subarea.size == 0) {
+ warning(HORIZONTAL_LAYOUT_CHECK, RBAViewPackage.Literals.ALIGNED_LAYOUT__SUBAREA);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IfStatementValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IfStatementValidator.xtend
new file mode 100644
index 0000000..2eefb6b
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IfStatementValidator.xtend
@@ -0,0 +1,44 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IfStatement
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+/**
+ * This class contains custom validation rules.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+class IfStatementValidator extends AbstractRBAModelValidator {
+
+ private String CONDITION_BOOLEAN_TYPE_CHECK = Messages.CONDITION_BOOLEAN_TYPE_CHECK;
+
+ private String CONDITION_TPYE_EQUAL_CHECK = Messages.CONDITION_TPYE_EQUAL_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIfStatement(IfStatement ifStatement) {
+ if (ifStatement.condition.type !== ExpressionType.BOOLEAN) {
+ error(CONDITION_BOOLEAN_TYPE_CHECK, RBACorePackage.Literals.IF_STATEMENT__CONDITION);
+ return;
+ }
+ if (!isExpressionTypeEquals(ifStatement.thenExpression.type, ifStatement.elseExpression.type)) {
+ error(CONDITION_TPYE_EQUAL_CHECK, RBACorePackage.Literals.IF_STATEMENT__ELSE_EXPRESSION);
+ return;
+ }
+ }
+
+ def boolean isExpressionTypeEquals(ExpressionType type1, ExpressionType type2) {
+ if (type1 === type2) {
+ return true;
+ }
+ return false
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ImpliesOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ImpliesOperatorValidator.xtend
new file mode 100644
index 0000000..c625ce2
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ImpliesOperatorValidator.xtend
@@ -0,0 +1,35 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.ImpliesOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ImpliesOperatorValidator extends AbstractRBAModelValidator {
+
+ private String IMPLIES_OPERAND_SIZE = Messages.IMPLIES_OPERAND_SIZE;
+
+ private String IMPLIES_OPERAND_TYPE = Messages.IMPLIES_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkImpliesOperator(ImpliesOperator impliesOperator) {
+ if (impliesOperator.operand.size < 2) {
+ error(IMPLIES_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < impliesOperator.operand.size; i++) {
+ var operand = impliesOperator.operand.get(i)
+ if (operand.type != ExpressionType.BOOLEAN) {
+ error(IMPLIES_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IntegerPropertyValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IntegerPropertyValidator.xtend
new file mode 100644
index 0000000..4e3fbfd
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IntegerPropertyValidator.xtend
@@ -0,0 +1,17 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.IntegerProperty
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IntegerPropertyValidator extends AbstractRBAModelValidator {
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkRequiredValue(IntegerProperty property) {
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsActiveValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsActiveValidator.xtend
new file mode 100644
index 0000000..3d552d4
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsActiveValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsActive
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsActiveValidator extends AbstractRBAModelValidator {
+
+ private String ISACTIVE_SIZE = Messages.ISACTIVE_SIZE;
+
+ private String ISACTIVE_TYPE = Messages.ISACTIVE_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsActive(IsActive isActive) {
+ if (isActive.operand.size > 1) {
+ error(ISACTIVE_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : isActive.operand) {
+ if (operand.type != ExpressionType.CONTENT && operand.type != ExpressionType.SOUND) {
+ error(ISACTIVE_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAllocatedToValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAllocatedToValidator.xtend
new file mode 100644
index 0000000..e2d63cb
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAllocatedToValidator.xtend
@@ -0,0 +1,48 @@
+package rba.tool.editor.validation.validators
+
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.IsAllocatedTo
+import rba.tool.editor.messages.Messages
+import rba.core.RBACorePackage
+import rba.core.ExpressionType
+import org.eclipse.xtext.validation.Check
+
+class IsAllocatedToValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsAllocatedTo.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsAllocatedTo(IsAllocatedTo isAllocatedTo) {
+ if (isAllocatedTo.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isAllocatedTo.operand.get(0)
+ if (firstOperand.type != ExpressionType::CONTENT && firstOperand.type != ExpressionType::SOUND) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_CONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isAllocatedTo.operand.get(1)
+ if (argument.type != ExpressionType::AREA && argument.type != ExpressionType::ZONE) {
+ error(String.format(Messages.ARGUMENT_MUST_ALLOCATABLE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+
+ if ((firstOperand.type == ExpressionType::CONTENT && argument.type == ExpressionType::ZONE) ||
+ (firstOperand.type == ExpressionType::SOUND && argument.type == ExpressionType::AREA ) ||
+ (argument.type == ExpressionType::ZONE ) ||
+ (firstOperand.type == ExpressionType::SOUND )) {
+ error(String.format(Messages.COMBINATION_OPERAND_ARGUMENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAttenuatedValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAttenuatedValidator.xtend
new file mode 100644
index 0000000..cbdd194
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsAttenuatedValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsAttenuated
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsAttenuatedValidator extends AbstractRBAModelValidator {
+
+ private String ISATTENUATED_SIZE = Messages.ISATTENUATED_SIZE;
+
+ private String ISATTENUATED_TYPE = Messages.ISATTENUATED_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(IsAttenuated isAttenuated) {
+ if (isAttenuated.operand.size > 1) {
+ error(ISATTENUATED_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ for (operand : isAttenuated.operand) {
+ if (operand.type != ExpressionType.ZONE) {
+ error(ISATTENUATED_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsCanceledValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsCanceledValidator.xtend
new file mode 100644
index 0000000..daf29bf
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsCanceledValidator.xtend
@@ -0,0 +1,37 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsCanceled
+import rba.core.PreviousModifier
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+
+class IsCanceledValidator extends AbstractContentOperatorValidator {
+ private String ISCANCELED_OPERAND_SIZE = Messages.ISCANCELED_OPERAND_SIZE;
+
+ private String ISCANCELED_OPERAND_0_TYPE = Messages.ISCANCELED_OPERAND_0_TYPE;
+
+ private String ISCANCELED_OPERAND_0_CHECK = Messages.ISCANCELED_OPERAND_0_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsCanceledOperator(IsCanceled isCanceled) {
+ if (isCanceled.operand.size > 1) {
+ error(ISCANCELED_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (isCanceled.operand.get(0).type != ExpressionType.CONTENT && isCanceled.operand.get(0).type != ExpressionType.SOUND) {
+ error(ISCANCELED_OPERAND_0_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (isCanceled.operand.get(0) instanceof PreviousModifier) {
+ error(ISCANCELED_OPERAND_0_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedDisplayValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedDisplayValidator.xtend
new file mode 100644
index 0000000..55bd12e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedDisplayValidator.xtend
@@ -0,0 +1,32 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.IsChangedDisplay
+import rba.core.ExpressionType
+
+class IsChangedDisplayValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsChangedDisplay.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsChangedDisplay(IsChangedDisplay isChangedDisplay) {
+ if (isChangedDisplay.operand.size > 1) {
+ error(String.format(Messages.OPERAND_SIZE_ONE, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isChangedDisplay.operand.get(0)
+ if (firstOperand.type != ExpressionType::AREA) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_AREA, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedOutputValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedOutputValidator.xtend
new file mode 100644
index 0000000..4186e33
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedOutputValidator.xtend
@@ -0,0 +1,32 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsChangedOutput
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsChangedOutputValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsChangedOutput.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsChangedOutput(IsChangedOutput isChangedOutput) {
+ if (isChangedOutput.operand.size > 1) {
+ error(String.format(Messages.OPERAND_SIZE_ONE, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isChangedOutput.operand.get(0)
+ if (firstOperand.type != ExpressionType::ZONE) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_ZONE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedValidator.xtend
new file mode 100644
index 0000000..d807fcc
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsChangedValidator.xtend
@@ -0,0 +1,31 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.IsChanged
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+
+class IsChangedValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsChanged.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsChanged(IsChanged isChanged) {
+ if (isChanged.operand.size > 1) {
+ error(String.format(Messages.OPERAND_SIZE_ONE, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ }
+
+ var firstOperand = isChanged.operand.get(0)
+ if (firstOperand.type != ExpressionType::AREA && firstOperand.type != ExpressionType::ZONE) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_ALLOCATABLE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisappearedValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisappearedValidator.xtend
new file mode 100644
index 0000000..c303c04
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisappearedValidator.xtend
@@ -0,0 +1,37 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsDisappeared
+import rba.core.PreviousModifier
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+
+class IsDisappearedValidator extends AbstractContentOperatorValidator {
+ private String ISDISAPPEARED_OPERAND_SIZE = Messages.ISDISAPPEARED_OPERAND_SIZE;
+
+ private String ISDISAPPEARED_OPERAND_0_TYPE = Messages.ISDISAPPEARED_OPERAND_0_TYPE;
+
+ private String ISDISAPPEARED_OPERAND_0_CHECK = Messages.ISDISAPPEARED_OPERAND_0_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsDisappearedOperator(IsDisappeared isDisappeared) {
+ if (isDisappeared.operand.size > 1) {
+ error(ISDISAPPEARED_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (isDisappeared.operand.get(0).type != ExpressionType.CONTENT && isDisappeared.operand.get(0).type != ExpressionType.SOUND) {
+ error(ISDISAPPEARED_OPERAND_0_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (isDisappeared.operand.get(0) instanceof PreviousModifier) {
+ error(ISDISAPPEARED_OPERAND_0_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisplayedOnValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisplayedOnValidator.xtend
new file mode 100644
index 0000000..fd46da8
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsDisplayedOnValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.IsDisplayedOn
+
+class IsDisplayedOnValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsDisplayedOn.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsDisplayedOn(IsDisplayedOn isDisplayedOn) {
+ if (isDisplayedOn.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isDisplayedOn.operand.get(0)
+ if (firstOperand.type != ExpressionType::CONTENT) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_VIEWCONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isDisplayedOn.operand.get(1)
+ if (argument.type != ExpressionType::AREA) {
+ error(String.format(Messages.ARGUMENT_MUST_AREA, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsEqualToOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsEqualToOperatorValidator.xtend
new file mode 100644
index 0000000..25549f3
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsEqualToOperatorValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsEqualToOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsEqualToOperatorValidator extends AbstractRBAModelValidator {
+
+ private String ISEQUALTO_OPERAND_SIZE = Messages.ISEQUALTO_OPERAND_SIZE;
+
+ private String ISEQUALTO_OPERAND_TYPE = Messages.ISEQUALTO_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsEqualToOperator(IsEqualToOperator isEqualToOperator) {
+ if (isEqualToOperator.operand.size < 2) {
+ error(ISEQUALTO_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < isEqualToOperator.operand.size; i++) {
+ var operand = isEqualToOperator.operand.get(i)
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(ISEQUALTO_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanEqualOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanEqualOperatorValidator.xtend
new file mode 100644
index 0000000..52caef5
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanEqualOperatorValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsGreaterThanEqualOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsGreaterThanEqualOperatorValidator extends AbstractRBAModelValidator {
+
+ private String ISGREATERTHANEQUAL_OPERAND_SIZE = Messages.ISGREATERTHANEQUAL_OPERAND_SIZE;
+
+ private String ISGREATERTHANEQUAL_OPERAND_TYPE = Messages.ISGREATERTHANEQUAL_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsGreaterThanEqualOperator(IsGreaterThanEqualOperator isGreaterThanEqualOperator) {
+ if (isGreaterThanEqualOperator.operand.size < 2) {
+ error(ISGREATERTHANEQUAL_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < isGreaterThanEqualOperator.operand.size; i++) {
+ var operand = isGreaterThanEqualOperator.operand.get(i)
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(ISGREATERTHANEQUAL_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanOperatorValidator.xtend
new file mode 100644
index 0000000..e018fd0
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsGreaterThanOperatorValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsGreaterThanOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsGreaterThanOperatorValidator extends AbstractRBAModelValidator {
+
+ private String ISGREATERTHAN_OPERAND_SIZE = Messages.ISGREATERTHAN_OPERAND_SIZE;
+
+ private String ISGREATERTHAN_OPERAND_TYPE = Messages.ISGREATERTHAN_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsGreaterThanOperator(IsGreaterThanOperator isGreaterThanOperator) {
+ if (isGreaterThanOperator.operand.size < 2) {
+ error(ISGREATERTHAN_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < isGreaterThanOperator.operand.size; i++) {
+ var operand = isGreaterThanOperator.operand.get(i)
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(ISGREATERTHAN_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsHiddenValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsHiddenValidator.xtend
new file mode 100644
index 0000000..979fee6
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsHiddenValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.IsHidden
+
+class IsHiddenValidator extends AbstractRBAModelValidator {
+
+ private String ISHIDDEN_SIZE = Messages.ISHIDDEN_SIZE;
+
+ private String ISHIDDEN_TYPE = Messages.ISHIDDEN_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(IsHidden IsHidden) {
+ if (IsHidden.operand.size > 1) {
+ error(ISHIDDEN_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : IsHidden.operand) {
+ if (operand.type != ExpressionType.AREA) {
+ error(ISHIDDEN_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanEqualOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanEqualOperatorValidator.xtend
new file mode 100644
index 0000000..efd3de4
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanEqualOperatorValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsLowerThanEqualOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsLowerThanEqualOperatorValidator extends AbstractRBAModelValidator {
+
+ private String ISLOWERTHANEQUAL_OPERAND_SIZE = Messages.ISLOWERTHANEQUAL_OPERAND_SIZE;
+
+ private String ISLOWERTHANEQUAL_OPERAND_TYPE = Messages.ISLOWERTHANEQUAL_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsLowerThanEqualOperator(IsLowerThanEqualOperator isLowerThanEqualOperator) {
+ if (isLowerThanEqualOperator.operand.size < 2) {
+ error(ISLOWERTHANEQUAL_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < isLowerThanEqualOperator.operand.size; i++) {
+ var operand = isLowerThanEqualOperator.operand.get(i)
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(ISLOWERTHANEQUAL_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanOperatorValidator.xtend
new file mode 100644
index 0000000..af1b6f4
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsLowerThanOperatorValidator.xtend
@@ -0,0 +1,36 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsLowerThanOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsLowerThanOperatorValidator extends AbstractRBAModelValidator {
+
+ private String ISLOWERTHAN_OPERAND_SIZE = Messages.ISLOWERTHAN_OPERAND_SIZE;
+
+ private String ISLOWERTHAN_OPERAND_TYPE = Messages.ISLOWERTHAN_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsLowerThanOperator(IsLowerThanOperator isLowerThanOperator) {
+ if (isLowerThanOperator.operand.size < 2) {
+ error(ISLOWERTHAN_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < isLowerThanOperator.operand.size; i++) {
+ var operand = isLowerThanOperator.operand.get(i)
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(ISLOWERTHAN_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsMutedValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsMutedValidator.xtend
new file mode 100644
index 0000000..d16b34d
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsMutedValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsMuted
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsMutedValidator extends AbstractRBAModelValidator {
+
+ private String ISMUTED_SIZE = Messages.ISMUTED_SIZE;
+
+ private String ISMUTED_TYPE = Messages.ISMUTED_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(IsMuted isMuted) {
+ if (isMuted.operand.size > 1) {
+ error(ISMUTED_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ for (operand : isMuted.operand) {
+ if (operand.type != ExpressionType.ZONE) {
+ error(ISMUTED_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOnValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOnValidator.xtend
new file mode 100644
index 0000000..4959161
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOnValidator.xtend
@@ -0,0 +1,32 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsOn
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsOnValidator extends AbstractRBAModelValidator {
+
+ private String ISON_SIZE = Messages.ISON_SIZE;
+
+ private String ISON_TYPE = Messages.ISON_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsOnOperator(IsOn isOn) {
+ if (isOn.operand.size > 1) {
+ error(ISON_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ if (isOn.operand.get(0).type != ExpressionType.SCENE) {
+ error(ISON_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedOnValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedOnValidator.xtend
new file mode 100644
index 0000000..fd72494
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedOnValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsOutputtedOn
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsOutputtedOnValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsOutputtedOn.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsOutputtedOn(IsOutputtedOn isOutputtedOn) {
+ if (isOutputtedOn.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isOutputtedOn.operand.get(0)
+ if (firstOperand.type != ExpressionType::SOUND) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_SOUNDCONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isOutputtedOn.operand.get(1)
+ if (argument.type != ExpressionType::ZONE) {
+ error(String.format(Messages.ARGUMENT_MUST_ZONE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedValidator.xtend
new file mode 100644
index 0000000..fc43966
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsOutputtedValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsOutputted
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsOutputtedValidator extends AbstractRBAModelValidator {
+
+ private String ISOUTPUTTED_SIZE = Messages.ISOUTPUTTED_SIZE;
+
+ private String ISOUTPUTTED_TYPE = Messages.ISOUTPUTTED_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(IsOutputted isOutputted) {
+ if (isOutputted.operand.size > 1) {
+ error(ISOUTPUTTED_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ for (operand : isOutputted.operand) {
+ if (operand.type != ExpressionType.ZONE) {
+ error(ISOUTPUTTED_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsSoundingValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsSoundingValidator.xtend
new file mode 100644
index 0000000..fe1fe4b
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsSoundingValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsSounding
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsSoundingValidator extends AbstractRBAModelValidator {
+
+ private String ISSOUNDING_SIZE = Messages.ISSOUNDING_SIZE;
+
+ private String ISSOUNDING_TYPE = Messages.ISSOUNDING_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(IsSounding isSounding) {
+ if (isSounding.operand.size > 1) {
+ error(ISSOUNDING_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ for (operand : isSounding.operand) {
+ if (operand.type != ExpressionType.SOUND) {
+ error(ISSOUNDING_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedSoundToValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedSoundToValidator.xtend
new file mode 100644
index 0000000..87e471a
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedSoundToValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.IsTranslatedSoundTo
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsTranslatedSoundToValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsTranslatedSoundTo.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsTranslatedSoundTo(IsTranslatedSoundTo isTranslatedSoundTo) {
+ if (isTranslatedSoundTo.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isTranslatedSoundTo.operand.get(0)
+ if (firstOperand.type != ExpressionType::ZONE) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_ZONE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isTranslatedSoundTo.operand.get(1)
+ if (argument.type != ExpressionType::SOUND) {
+ error(String.format(Messages.ARGUMENT_MUST_SOUNDCONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedToValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedToValidator.xtend
new file mode 100644
index 0000000..bd8cf33
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedToValidator.xtend
@@ -0,0 +1,48 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IsTranslatedTo
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class IsTranslatedToValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsTranslatedTo.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsTranslatedTo(IsTranslatedTo isTranslatedTo) {
+ if (isTranslatedTo.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isTranslatedTo.operand.get(0)
+ if (firstOperand.type != ExpressionType::AREA && firstOperand.type != ExpressionType::ZONE) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_ALLOCATABLE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isTranslatedTo.operand.get(1)
+ if (argument.type != ExpressionType::CONTENT && argument.type != ExpressionType::SOUND) {
+ error(String.format(Messages.ARGUMENT_MUST_CONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+
+ if ((firstOperand.type == ExpressionType::AREA && argument.type == ExpressionType::SOUND) ||
+ (firstOperand.type == ExpressionType::ZONE && argument.type == ExpressionType::CONTENT ) ||
+ (firstOperand.type == ExpressionType::ZONE ) ||
+ (argument.type == ExpressionType::SOUND )) {
+ error(String.format(Messages.COMBINATION_OPERAND_ARGUMENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedViewToValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedViewToValidator.xtend
new file mode 100644
index 0000000..c010644
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTranslatedViewToValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.IsTranslatedViewTo
+import rba.core.ExpressionType
+
+class IsTranslatedViewToValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = IsTranslatedViewTo.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsTranslatedViewTo(IsTranslatedViewTo isTranslatedViewTo) {
+ if (isTranslatedViewTo.operand.size < 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstOperand = isTranslatedViewTo.operand.get(0)
+ if (firstOperand.type != ExpressionType::AREA) {
+ error(String.format(Messages.FIRST_OPERAND_MUST_AREA, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var argument = isTranslatedViewTo.operand.get(1)
+ if (argument.type != ExpressionType::CONTENT) {
+ error(String.format(Messages.ARGUMENT_MUST_VIEWCONTENT, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTypeOfValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTypeOfValidator.xtend
new file mode 100644
index 0000000..c765268
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsTypeOfValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.IsTypeOf
+import rba.core.ExpressionType
+
+class IsTypeOfValidator extends AbstractRBAModelValidator {
+
+ private String OPERAND_SIZE_TWO = Messages.OPERAND_SIZE_TWO;
+ private String FIRST_OPERAND_MUST_FOR_ISTYPEOF = Messages.FIRST_OPERAND_MUST_FOR_ISTYPEOF;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsTypeOf(IsTypeOf op) {
+ if (op.operand.size < 1) {
+ error(String.format(OPERAND_SIZE_TWO, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if (operand.type != ExpressionType.CONTENT && operand.type != ExpressionType.AREA && operand.type != ExpressionType.SOUND &&
+ operand.type != ExpressionType.ZONE) {
+ error(String.format(FIRST_OPERAND_MUST_FOR_ISTYPEOF, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/IsVisibleValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsVisibleValidator.xtend
new file mode 100644
index 0000000..5d44d34
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/IsVisibleValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.IsVisible
+
+class IsVisibleValidator extends AbstractRBAModelValidator {
+
+ private String ISVISIBLE_SIZE = Messages.ISVISIBLE_SIZE;
+
+ private String ISVISIBLE_TYPE = Messages.ISVISIBLE_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsVisible(IsVisible isVisible) {
+ if (isVisible.operand.size > 1) {
+ error(ISVISIBLE_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : isVisible.operand) {
+ if (operand.type != ExpressionType.CONTENT) {
+ error(ISVISIBLE_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/LambdaExpressionValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/LambdaExpressionValidator.xtend
new file mode 100644
index 0000000..6daad3e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/LambdaExpressionValidator.xtend
@@ -0,0 +1,25 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.LambdaExpression
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class LambdaExpressionValidator extends AbstractRBAModelValidator {
+
+ private String LAMBDAEXPRESSION_TYPE = Messages.LAMBDAEXPRESSION_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkLambdaExpression(LambdaExpression lambdaExpression) {
+ if (lambdaExpression.x.expressionType != lambdaExpression.context.contextType) {
+ error(LAMBDAEXPRESSION_TYPE, RBACorePackage.Literals.LAMBDA_EXPRESSION__CONTEXT)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/LetStatementValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/LetStatementValidator.xtend
new file mode 100644
index 0000000..83102a7
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/LetStatementValidator.xtend
@@ -0,0 +1,35 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.LetStatement
+
+class LetStatementValidator extends AbstractRBAModelValidator {
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(LetStatement op) {
+ if (op.body.type != ExpressionType::VALUE &&
+ op.body.type != ExpressionType::BOOLEAN &&
+ op.body.type != ExpressionType::AREA &&
+ op.body.type != ExpressionType::CONTENT &&
+ op.body.type != ExpressionType::SET_OF_AREA &&
+ op.body.type != ExpressionType::SET_OF_CONTENT &&
+ op.body.type != ExpressionType::SCENE &&
+ op.body.type != ExpressionType::ZONE &&
+ op.body.type != ExpressionType::SET_OF_ZONE &&
+ op.body.type != ExpressionType::SOUND &&
+ op.body.type != ExpressionType::SET_OF_SOUND &&
+ op.body.type != ExpressionType::CONTENT_STATE) {
+ error(String.format(Messages.BODY_MUST_OBJECT, "let"), RBACorePackage.Literals.LET_STATEMENT__BODY)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/LowerThanOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/LowerThanOperatorValidator.xtend
new file mode 100644
index 0000000..1fde1f0
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/LowerThanOperatorValidator.xtend
@@ -0,0 +1,40 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.LowerThanOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class LowerThanOperatorValidator extends AbstractRBAModelValidator {
+
+ private String LOWERTHAN_OPERAND_SIZE_NULL = Messages.LOWERTHAN_OPERAND_SIZE_NULL;
+
+ private String LOWERTHAN_OPERAND_SIZE = Messages.LOWERTHAN_OPERAND_SIZE;
+
+ private String LOWERTHAN_OPERAND_TYPE = Messages.LOWERTHAN_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkLowerThanOperator(LowerThanOperator lowerThanOperator) {
+ if (lowerThanOperator.operand.size == 0) {
+ error(LOWERTHAN_OPERAND_SIZE_NULL, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (lowerThanOperator.operand.size != 1) {
+ error(LOWERTHAN_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : lowerThanOperator.operand) {
+ if (operand.type != ExpressionType.VALUE) {
+ error(LOWERTHAN_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/MaxOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/MaxOperatorValidator.xtend
new file mode 100644
index 0000000..4927d71
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/MaxOperatorValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+import rba.core.MaxOperator
+
+class MaxOperatorValidator extends AbstractRBAModelValidator {
+
+ private String MAX_OP_OPERAND_SIZE = Messages.MAX_OP_OPERAND_SIZE;
+ private String MAX_OP_OPERAND_TYPE = Messages.MAX_OP_OPERAND_SIZE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkMaxOperator(MaxOperator op) {
+ if (op.operand.size == 0) {
+ error(String.format(MAX_OP_OPERAND_SIZE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if (operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA && operand.type != ExpressionType.SET_OF_SOUND &&
+ operand.type != ExpressionType.SET_OF_ZONE) {
+ error(String.format(MAX_OP_OPERAND_TYPE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/MinOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/MinOperatorValidator.xtend
new file mode 100644
index 0000000..81417fb
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/MinOperatorValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+import rba.core.MinOperator
+
+class MinOperatorValidator extends AbstractRBAModelValidator {
+
+ private String MIN_OP_OPERAND_SIZE = Messages.MIN_OP_OPERAND_SIZE;
+ private String MIN_OP_OPERAND_TYPE = Messages.MIN_OP_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkMinOperator(MinOperator op) {
+ if (op.operand.size == 0) {
+ error(String.format(MIN_OP_OPERAND_SIZE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if (operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA && operand.type != ExpressionType.SET_OF_SOUND &&
+ operand.type != ExpressionType.SET_OF_ZONE) {
+ error(String.format(MIN_OP_OPERAND_TYPE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/MuchGreaterThanOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/MuchGreaterThanOperatorValidator.xtend
new file mode 100644
index 0000000..13de568
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/MuchGreaterThanOperatorValidator.xtend
@@ -0,0 +1,40 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.MuchGreaterThanOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class MuchGreaterThanOperatorValidator extends AbstractRBAModelValidator {
+
+ private String MUCHGREATERTHAN_OPERAND_SIZE_NULL = Messages.MUCHGREATERTHAN_OPERAND_SIZE_NULL;
+
+ private String MUCHGREATERTHAN_OPERAND_SIZE = Messages.MUCHGREATERTHAN_OPERAND_SIZE;
+
+ private String MUCHGREATERTHAN_OPERAND_TYPE = Messages.MUCHGREATERTHAN_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkMuchGreaterThanOperator(MuchGreaterThanOperator muchGreaterThanOperator) {
+ if (muchGreaterThanOperator.operand.size == 0) {
+ error(MUCHGREATERTHAN_OPERAND_SIZE_NULL, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (muchGreaterThanOperator.operand.size != 1) {
+ error(MUCHGREATERTHAN_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : muchGreaterThanOperator.operand) {
+ if (operand.type != ExpressionType.VALUE) {
+ error(MUCHGREATERTHAN_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/MuteLowerPriorityValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/MuteLowerPriorityValidator.xtend
new file mode 100644
index 0000000..fe4dc34
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/MuteLowerPriorityValidator.xtend
@@ -0,0 +1,39 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.MuteLowerPriority
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class MuteLowerPriorityValidator extends AbstractRBAModelValidator {
+ private static final String OperatorName = MuteLowerPriority.simpleName
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkMuteLowerPriority(MuteLowerPriority muteLowerPriority) {
+ if (muteLowerPriority.operand.size != 2) {
+ error(String.format(Messages.OPERAND_SIZE_TWO, OperatorName), RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var firstArgument = muteLowerPriority.operand.get(0)
+ if (firstArgument.type != ExpressionType::ZONE) {
+ error(String.format(Messages.ARGUMENT_MUST_ZONE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 0)
+ return;
+ }
+
+ var secondArgument = muteLowerPriority.operand.get(1)
+ if (secondArgument.type != ExpressionType::ZONE) {
+ error(String.format(Messages.ARGUMENT_MUST_ZONE, OperatorName),
+ RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/NamedElementValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/NamedElementValidator.xtend
new file mode 100644
index 0000000..19b0e8e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/NamedElementValidator.xtend
@@ -0,0 +1,60 @@
+package rba.tool.editor.validation.validators
+
+import com.google.common.collect.Sets
+import com.google.inject.Inject
+import java.util.Set
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.validation.CancelableDiagnostician
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.NamedElement
+import rba.tool.editor.util.RBAModelEditorToolUtil
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.tool.editor.validation.UniqueNameValidationHelper
+
+class NamedElementValidator extends AbstractRBAModelValidator {
+
+ @Inject private UniqueNameValidationHelper helper;
+
+ override register(EValidatorRegistrar registrar) {
+ // library validator is not registered for a specific language
+ }
+
+ @Check(NORMAL)
+ def public void checkUniqueNamesInResourceOf(NamedElement namedElement) {
+ val context = getContext();
+ val resource = namedElement.eResource();
+ if (resource === null) {
+ return;
+ }
+
+ if (context !== null) {
+ var Object contextValue;
+ if (context.containsKey(resource)) {
+ contextValue = context.get(resource);
+ }
+ if (!(contextValue instanceof Set<?>)) {
+ context.put(resource, Sets.newHashSet());
+ }
+ if (RBAModelEditorToolUtil.isValidated((contextValue), this)) {
+ return; // resource was already validated
+ }
+
+ (contextValue as Set).add(this);
+ doCheckUniqueNames(resource, context.get(CancelableDiagnostician.CANCEL_INDICATOR) as CancelIndicator);
+ return;
+ }
+ doCheckUniqueNames(resource, null);
+ }
+
+ def public void doCheckUniqueNames(Resource resource, CancelIndicator cancelIndicator) {
+ helper.checkUniqueNames(resource, cancelIndicator, this);
+ }
+
+ override protected checkIsFromCurrentlyCheckedResource(EObject object) {
+ // do nothing
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/NotOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/NotOperatorValidator.xtend
new file mode 100644
index 0000000..1881a22
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/NotOperatorValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.NotOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class NotOperatorValidator extends AbstractRBAModelValidator {
+
+ private String NOT_OPERAND_SIZE = Messages.NOT_OPERAND_SIZE;
+
+ private String NOT_OPERAND_TYPE = Messages.NOT_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkNotOperator(NotOperator notOperator) {
+ if (notOperator.operand.size > 1) {
+ error(NOT_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (operand : notOperator.operand) {
+ if (operand.type != ExpressionType.BOOLEAN) {
+ error(NOT_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareNotValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareNotValidator.xtend
new file mode 100644
index 0000000..7700e3a
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareNotValidator.xtend
@@ -0,0 +1,15 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import rba.core.ObjectCompareNot
+
+class ObjectCompareNotValidator extends ObjectCompareValidator {
+ def override protected getOperatorName() {
+ return ObjectCompareNot.simpleName;
+ }
+
+ @Check(NORMAL)
+ def check(ObjectCompareNot operator) {
+ doCheck(operator.operand);
+ }
+} \ No newline at end of file
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareValidator.xtend
new file mode 100644
index 0000000..ba897e1
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ObjectCompareValidator.xtend
@@ -0,0 +1,71 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.ObjectCompare
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import static rba.tool.editor.validation.validators.ValidatorUtils.*;
+import rba.core.Expression
+import java.util.List
+
+class ObjectCompareValidator extends AbstractRBAModelValidator {
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ def protected getOperatorName() {
+ return ObjectCompare.simpleName;
+ }
+
+ @Check(NORMAL)
+ def checkObjectCompare(ObjectCompare objectCompare) {
+ doCheck(objectCompare.operand);
+ }
+
+ /** Check points.
+ * * operand size is 2.
+ * * type of operands are AREA/CONTENT/ZONE/SOUND.
+ */
+ def protected doCheck(List<Expression> operands) {
+ if (!operandSizeMustBeTwo(operands, getOperatorName, [ msg | error(msg, RBACorePackage.Literals.OPERATOR__OPERAND, 0)])) {
+ return;
+ }
+
+ val first = operands.get(0)
+ switch (first.type) {
+ case ExpressionType.VALUE: {
+ val message = String.format(Messages.FIRST_OPERAND_MUST_BE_OBJECT, getOperatorName);
+ error(message, RBACorePackage.Literals.OPERATOR__OPERAND, 0, null)
+ return;
+ }
+ case AREA,
+ case CONTENT,
+ case CONTENT_STATE,
+ case ZONE,
+ case SOUND: {
+ }
+ default: {
+ val message = String.format(Messages.OPERANDS_MUST_BE_OBJECT, getOperatorName);
+ error(message, RBACorePackage.Literals.OPERATOR__OPERAND, 0, null)
+ return;
+ }
+ }
+
+ for (var i = 1; i < operands.size; i++) {
+ var operand = operands.get(i)
+ if (operand.type !== first.type && ObjectsMustBeAreaOrContent(operand.type, first.type)) {
+ val message = String.format(Messages.OPERANDS_MUST_BE_OBJECT, getOperatorName);
+ error(message, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+
+ def private boolean ObjectsMustBeAreaOrContent(ExpressionType type1, ExpressionType type2) {
+ return true
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/OffSceneValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/OffSceneValidator.xtend
new file mode 100644
index 0000000..f6ecce1
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/OffSceneValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.OffScene
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class OffSceneValidator extends AbstractRBAModelValidator {
+
+ private String OFFSCENE_OPERAND_SIZE_CHECK = Messages.OFFSCENE_OPERAND_SIZE_CHECK;
+
+ private String OFFSCENE_OPERAND_TYPE_CHECK = Messages.OFFSCENE_OPERAND_TYPE_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkOffScene(OffScene offScene) {
+ if (offScene.operand.size > 1) {
+ error(OFFSCENE_OPERAND_SIZE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand = offScene.operand.get(0)
+ if (operand.type != ExpressionType.SCENE) {
+ error(OFFSCENE_OPERAND_TYPE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/OffsetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/OffsetValidator.xtend
new file mode 100644
index 0000000..57ea7b4
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/OffsetValidator.xtend
@@ -0,0 +1,64 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.Area
+import rba.view.Offset
+import rba.view.PositionContainer
+import rba.view.RBAViewPackage
+import rba.view.SizeIdentifier
+import rba.view.SizeReference
+
+class OffsetValidator extends AbstractRBAModelValidator {
+
+ private String OFFSET_SIZE_DUPLICATE = Messages.OFFSET_SIZE_DUPLICATE;
+
+ private String OFFSET_SIZE_AREA_REF = Messages.OFFSET_SIZE_AREA_REF;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkOffset(Offset offset) {
+ var parent = offset.eContainer as PositionContainer
+ for (Offset target : parent.offset) {
+ if (target != offset) {
+ if (target.size.size == offset.size.size) {
+ warning(OFFSET_SIZE_DUPLICATE, RBAViewPackage.Literals.OFFSET__SIZE);
+ return;
+ }
+ }
+ }
+
+ if (!hasSameSizeInArea(parent, offset)) {
+ warning(OFFSET_SIZE_AREA_REF, RBAViewPackage.Literals.OFFSET__SIZE);
+ return;
+ }
+ }
+
+ def hasSameSizeInArea(PositionContainer parent, Offset offset) {
+ var chk = false;
+
+ if (!(parent.area instanceof Area)) {
+ return false
+ }
+
+ var area = parent.area as Area
+ for (SizeIdentifier sizeId : area.size) {
+ if (sizeId instanceof SizeReference) {
+ var sizeRef = sizeId as SizeReference
+ if (sizeRef.size == offset.size.size) {
+ chk = true
+ }
+ }
+ }
+ if (chk == true) {
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/OnSceneValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/OnSceneValidator.xtend
new file mode 100644
index 0000000..d2b3792
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/OnSceneValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.OnScene
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class OnSceneValidator extends AbstractRBAModelValidator {
+
+ private String ONSCENE_OPERAND_SIZE_CHECK = Messages.ONSCENE_OPERAND_SIZE_CHECK;
+
+ private String ONSCENE_OPERAND_TYPE_CHECK = Messages.ONSCENE_OPERAND_TYPE_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkOnScene(OnScene onScene) {
+ if (onScene.operand.size > 1) {
+ error(ONSCENE_OPERAND_SIZE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand = onScene.operand.get(0)
+ if (operand.type != ExpressionType.SCENE) {
+ error(ONSCENE_OPERAND_TYPE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/OrOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/OrOperatorValidator.xtend
new file mode 100644
index 0000000..3afcd05
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/OrOperatorValidator.xtend
@@ -0,0 +1,35 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.OrOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class OrOperatorValidator extends AbstractRBAModelValidator {
+
+ private String OR_OPERAND_SIZE = Messages.OR_OPERAND_SIZE;
+
+ private String OR_OPERAND_TYPE = Messages.OR_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkOrOperator(OrOperator orOperator) {
+ if (orOperator.operand.size < 2) {
+ error(OR_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ for (var i = 0; i < orOperator.operand.size; i++) {
+ var operand = orOperator.operand.get(i)
+ if (operand.type != ExpressionType.BOOLEAN) {
+ error(OR_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/OutputtingSoundValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/OutputtingSoundValidator.xtend
new file mode 100644
index 0000000..7a5f7fa
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/OutputtingSoundValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.RBACorePackage
+import rba.sound.OutputtingSound
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class OutputtingSoundValidator extends AbstractRBAModelValidator {
+
+ private String OUTPUTTINGSOUND_SIZE = Messages.OUTPUTTINGSOUND_SIZE;
+
+ private String OUTPUTTINGSOUND_TYPE = Messages.OUTPUTTINGSOUND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsHidden(OutputtingSound outputtingSound) {
+ if (outputtingSound.operand.size > 1) {
+ error(OUTPUTTINGSOUND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ for (operand : outputtingSound.operand) {
+ if (operand.type != ExpressionType.ZONE) {
+ error(OUTPUTTINGSOUND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/PackageValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/PackageValidator.xtend
new file mode 100644
index 0000000..39f2084
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/PackageValidator.xtend
@@ -0,0 +1,31 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.Package
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.Project
+
+class PackageValidator extends AbstractRBAModelValidator {
+
+ private String PACKAGE_CHILD_EXISTENCE_CHECK = Messages.PACKAGE_CHILD_EXISTENCE_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkPackage(Package pack) {
+ if(pack instanceof Project)
+ {
+ return;
+ }
+ if (pack.packagableelement.size == 0) {
+ warning(String.format(PACKAGE_CHILD_EXISTENCE_CHECK, pack.name),
+ RBACorePackage.Literals.PACKAGE__PACKAGABLEELEMENT);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/PlusOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/PlusOperatorValidator.xtend
new file mode 100644
index 0000000..b98e8f5
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/PlusOperatorValidator.xtend
@@ -0,0 +1,47 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ComparisonOperator
+import rba.core.ExpressionType
+import rba.core.PlusOperator
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class PlusOperatorValidator extends AbstractRBAModelValidator {
+
+ private String PLUS_OPERAND_SIZE = Messages.PLUS_OPERAND_SIZE;
+
+ private String PLUS_OPERAND_TYPE = Messages.PLUS_OPERAND_TYPE;
+
+ private String PLUS_OPERAND_TYPE_NOT_OPERATOR = Messages.PLUS_OPERAND_TYPE_NOT_OPERATOR;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(FAST)
+ def checkPlusOperatorFast(PlusOperator plusOperator) {
+ if (plusOperator.operand.size < 2) {
+ error(PLUS_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ @Check(NORMAL)
+ def checkPlusOperatorNormal(PlusOperator plusOperator) {
+ for (var i = 0; i < plusOperator.operand.size; i++) {
+ var operand = plusOperator.operand.get(i)
+ if (operand instanceof ComparisonOperator) {
+ error(PLUS_OPERAND_TYPE_NOT_OPERATOR, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+
+ if (operand.type != ExpressionType.VALUE) {
+ error(PLUS_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND, i, null)
+ return;
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/PositionContainerValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/PositionContainerValidator.xtend
new file mode 100644
index 0000000..da27f6c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/PositionContainerValidator.xtend
@@ -0,0 +1,74 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import java.util.Set
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.Area
+import rba.view.Display
+import rba.view.PositionContainer
+import rba.view.RBAViewPackage
+import rba.view.Size
+import rba.view.SizeIdentifier
+import rba.view.SizeReference
+import rba.view.impl.DisplayImpl
+
+class PositionContainerValidator extends AbstractRBAModelValidator {
+
+ private String POSITION_CONTAINER_COORDINATE_CHECK = Messages.POSITION_CONTAINER_COORDINATE_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkPositionContainer(PositionContainer positionContainer) {
+ var display = getDisplay(positionContainer)
+ var displaySizeIden = display.size as SizeIdentifier
+ var displaySize = getSize(displaySizeIden)
+ var displayWidth = displaySize.width
+ var displayHeight = displaySize.height
+
+ var Set<Area> areaList = new HashSet
+ if (positionContainer.area !== null) {
+ areaList.add(positionContainer.area);
+ }
+ for (Area area : areaList) {
+ for (sizeIdentifier : area.size) {
+ var areaSize = getSize(sizeIdentifier)
+ var areaWidth = areaSize.width
+ var areaHeight = areaSize.height
+
+ // warning displays total of position container start point and size exceeds display's size
+ if (positionContainer.x + areaWidth > displayWidth || positionContainer.y + areaHeight > displayHeight) {
+ warning(POSITION_CONTAINER_COORDINATE_CHECK, RBAViewPackage.Literals.POSITION_CONTAINER__X)
+ return;
+ }
+ }
+
+ }
+ }
+
+//get Display from position container
+ def Display getDisplay(PositionContainer positionContainer) {
+ var parent = positionContainer.eContainer
+ while (parent !== null) {
+ if (parent instanceof DisplayImpl) {
+ return parent as Display;
+ }
+ parent = parent.eContainer
+ }
+ }
+
+ // get Size from SizeIdentifier
+ def Size getSize(SizeIdentifier size) {
+ if (size instanceof Size) {
+ return size as Size
+ } else if (size instanceof SizeReference) {
+ var sizeRef = size as SizeReference
+ return sizeRef.size as Size
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ProjectValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ProjectValidator.xtend
new file mode 100644
index 0000000..ffe51f6
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ProjectValidator.xtend
@@ -0,0 +1,34 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.core.Project
+
+class ProjectValidator extends AbstractContentValidator {
+
+ public static String PROJECT_SIZE_CHECK = Messages.PROJECT_SIZE_CHECK;
+ public static String PROJECT_NAME_CHECK = Messages.PROJECT_NAME_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkProject(Project project) {
+
+ val allProjects =project.eResource.resourceSet.resources.map(r|r.allContents.toIterable.filter(Project)).flatten;
+ val definedPrjCnts = allProjects.size;
+ if(definedPrjCnts != 1) {
+ error(PROJECT_SIZE_CHECK, RBACorePackage.Literals.NAMED_ELEMENT__NAME);
+ }
+
+ if(project.getDummyName != null){
+ error(PROJECT_NAME_CHECK, RBACorePackage.Literals.NAMED_ELEMENT__NAME);
+ }
+
+ return true;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SceneValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SceneValidator.xtend
new file mode 100644
index 0000000..f6646e5
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SceneValidator.xtend
@@ -0,0 +1,40 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.core.Scene
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class SceneValidator extends AbstractRBAModelValidator {
+
+ private String SCENE_GLOBAL = Messages.SCENE_GLOBAL;
+ private String SCENE_PROPERTY_NEGATIVE = Messages.SCENE_PROPERTY_NEGATIVE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkSceneProperty(Scene scene) {
+
+ if (scene.properties.size > 0 && scene.global == false) {
+ error(SCENE_GLOBAL, RBACorePackage.Literals.SCENE__PROPERTIES);
+ return;
+ }
+ val properties = scene.properties
+ for (var int i = 0; i < properties.size; i++) {
+ var property = properties.get(i)
+ if (property instanceof rba.core.impl.IntegerPropertyImpl) {
+ var value = property.getValue()
+ if (value instanceof rba.core.impl.IntegerValueImpl) {
+ if (value.getValue() < 0) {
+ error(SCENE_PROPERTY_NEGATIVE, RBACorePackage.Literals.SCENE__PROPERTIES, i);
+ return;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SelectOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SelectOperatorValidator.xtend
new file mode 100644
index 0000000..8bd676e
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SelectOperatorValidator.xtend
@@ -0,0 +1,33 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.SelectOperator
+import rba.core.ExpressionType
+
+class SelectOperatorValidator extends AbstractRBAModelValidator {
+
+ private String SELECT_OPERAND_SIZE = Messages.SELECT_OPERAND_SIZE;
+ private String SELECT_OPERAND_TYPE = Messages.SELECT_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkSelectOperator(SelectOperator op) {
+ if (op.operand.size == 0) {
+ error(String.format(SELECT_OPERAND_SIZE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if (operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA && operand.type != ExpressionType.SET_OF_SOUND &&
+ operand.type != ExpressionType.SET_OF_ZONE) {
+ error(String.format(SELECT_OPERAND_TYPE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend
new file mode 100644
index 0000000..4cede2c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend
@@ -0,0 +1,106 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.RuleObject
+import rba.core.SetOfOperator
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.PreviousModifier
+
+class SetOfOperatorValidator extends AbstractRBAModelValidator {
+
+ private String SET_OF_OPERAND_TYPE = Messages.SET_OF_OPERAND_TYPE;
+
+ private String SET_OF_OPERAND_DUPLICATE = Messages.SET_OF_OPERAND_DUPLICATE;
+
+ private String OPERANDS_CANNOT_USE_PRE = Messages.OPERANDS_CANNOT_USE_PRE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsEqualToOperator(SetOfOperator setOfOperator) {
+ val notNullOp = setOfOperator.operand.filter(o|o.type != ExpressionType.NULL)
+ if (notNullOp.size == 0) {
+ return;
+ }
+ val firstType = notNullOp.get(0).type
+
+ var hash = new HashSet<RuleObject>
+ for (operand : setOfOperator.operand) {
+
+ if (operand instanceof PreviousModifier) {
+ error(String.format(OPERANDS_CANNOT_USE_PRE, "SetOf"), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+
+ var opType = operand.type
+
+ switch (firstType) {
+ case ExpressionType.AREA,
+ case ExpressionType.SET_OF_AREA: {
+ if (!(opType === ExpressionType.AREA || opType === ExpressionType.SET_OF_AREA || opType === ExpressionType.NULL)
+ ) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.CONTENT,
+ case ExpressionType.SET_OF_CONTENT: {
+ if (!(opType === ExpressionType.CONTENT || opType === ExpressionType.SET_OF_CONTENT
+ || opType === ExpressionType.NULL
+ )) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.ZONE,
+ case ExpressionType.SET_OF_ZONE: {
+ if (!(opType === ExpressionType.ZONE || opType === ExpressionType.SET_OF_ZONE)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.SOUND,
+ case ExpressionType.SET_OF_SOUND: {
+ if (!(opType === ExpressionType.SOUND || opType === ExpressionType.SET_OF_SOUND)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.SCENE: {
+ if (!(opType === ExpressionType.SCENE)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.PROPERTY: {
+ if (!(opType === ExpressionType.PROPERTY)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ default: {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ if (operand instanceof ObjectReference) {
+ var refObj = (operand as ObjectReference).refObject
+ if (hash.contains(refObj)) {
+ error(SET_OF_OPERAND_DUPLICATE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ } else {
+ hash.add(refObj)
+ }
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SetPropertyValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetPropertyValidator.xtend
new file mode 100644
index 0000000..15abc53
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetPropertyValidator.xtend
@@ -0,0 +1,83 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.IntegerProperty
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.Scene
+import rba.core.SetProperty
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.IntegerValue
+import org.eclipse.xtext.EcoreUtil2
+import rba.core.PreviousModifier
+
+class SetPropertyValidator extends AbstractRBAModelValidator {
+
+ private String SETPROPERTY_OPERAND_SIZE_CHECK = Messages.SETPROPERTY_OPERAND_SIZE_CHECK;
+
+ private String SETPROPERTY_OPERAND_0_TYPE_CHECK = Messages.SETPROPERTY_OPERAND_0_TYPE_CHECK;
+
+ private String SETPROPERTY_OPERAND_ISGLOBALSCENE = Messages.SETPROPERTY_OPERAND_ISGLOBALSCENE;
+
+ private String SETPROPERTY_OPERAND_1_TYPE_CHECK = Messages.SETPROPERTY_OPERAND_1_TYPE_CHECK;
+
+ private String SETPROPERTY_PROPERTY_NEGATIVE = Messages.SETPROPERTY_PROPERTY_NEGATIVE
+
+ private String OPERAND_CANNOT_USE_PRE = Messages.OPERAND_CANNOT_USE_PRE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkSetProperty(SetProperty setProperty) {
+ if (setProperty.operand.size < 2) {
+ error(SETPROPERTY_OPERAND_SIZE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ var operand0 = setProperty.operand.get(0)
+ if (operand0.type != ExpressionType.PROPERTY) {
+ error(SETPROPERTY_OPERAND_0_TYPE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (operand0 instanceof PreviousModifier || EcoreUtil2.getAllContentsOfType(operand0, PreviousModifier).size != 0) {
+ error(String.format(OPERAND_CANNOT_USE_PRE, setProperty.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (operand0 instanceof ObjectReference) {
+ var parent = isParentScene(operand0.refObject)
+ if (parent !== null) {
+ var scene = parent as Scene
+ if (!scene.global) {
+ error(SETPROPERTY_OPERAND_ISGLOBALSCENE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+ var operand1 = setProperty.operand.get(1)
+ if (!(operand1 instanceof IntegerValue)) {
+ error(SETPROPERTY_OPERAND_1_TYPE_CHECK, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ if (operand1 instanceof IntegerValue) {
+ if(operand1.getValue() < 0) {
+ error(SETPROPERTY_PROPERTY_NEGATIVE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ }
+
+ def EObject isParentScene(EObject object) {
+ if (object instanceof Scene) {
+ return object as Scene;
+ }
+ if (object instanceof IntegerProperty) {
+ return isParentScene(object.owner)
+ }
+ return null;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeOperatorValidator.xtend
new file mode 100644
index 0000000..c1c1f6c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeOperatorValidator.xtend
@@ -0,0 +1,37 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.ExpressionType
+import rba.core.IfStatement
+import org.eclipse.xtext.EcoreUtil2
+import rba.core.SizeOperator
+
+class SizeOperatorValidator extends AbstractRBAModelValidator {
+
+ private String OPERAND_SIZE_ONE = Messages.OPERAND_SIZE_ONE;
+ private String SIZE_OPERAND_TYPE = Messages.SIZE_OPERAND_TYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkSizeOperator(SizeOperator op) {
+ if (op.operand.size > 1) {
+ error(OPERAND_SIZE_ONE, RBACorePackage.Literals.OPERATOR__OPERAND, 1)
+ return;
+ }
+ var operand = op.operand.get(0)
+ if ((operand instanceof IfStatement) ||
+ (EcoreUtil2.getAllContentsOfType(operand, IfStatement).size != 0) ||
+ operand.type != ExpressionType.SET_OF_CONTENT && operand.type != ExpressionType.SET_OF_AREA && operand.type != ExpressionType.SET_OF_SOUND &&
+ operand.type != ExpressionType.SET_OF_ZONE) {
+ error(String.format(SIZE_OPERAND_TYPE, op.symbol), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeValidator.xtend
new file mode 100644
index 0000000..203c086
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SizeValidator.xtend
@@ -0,0 +1,28 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.RBAViewPackage
+
+class SizeValidator extends AbstractRBAModelValidator {
+
+ private String SIZE_NEGATIVE = Messages.SIZE_NEGATIVE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkSize(rba.view.Size size) {
+ if (size.getWidth() < 0) {
+ error(SIZE_NEGATIVE, RBAViewPackage.Literals.SIZE__WIDTH);
+ return;
+ }
+ if (size.getHeight() < 0) {
+ error(SIZE_NEGATIVE, RBAViewPackage.Literals.SIZE__HEIGHT);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentSetValidator.xtend
new file mode 100644
index 0000000..b12cd3c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentSetValidator.xtend
@@ -0,0 +1,70 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import rba.core.AbstractAllocatable
+import rba.core.AbstractContent
+import rba.core.RBACorePackage
+import rba.sound.SoundContent
+import rba.sound.SoundContentSet
+import rba.sound.Zone
+import rba.sound.ZoneSet
+import rba.tool.editor.messages.Messages
+
+class SoundContentSetValidator extends ContentSetValidator {
+
+ private String SOUNDCONTENTSET_TARGET_SIZE = Messages.SOUNDCONTENTSET_TARGET_SIZE;
+
+ private String SOUNDCONTENTSET_TARGET_INVALID_TYPE = Messages.SOUNDCONTENTSET_TARGET_INVALID_TYPE;
+
+ private String SOUNDCONTENTSET_TARGET_INCLUDE_SELF = Messages.SOUNDCONTENTSET_TARGET_INCLUDE_SELF;
+
+ private String SOUNDCONTENTSET_TARGET_DUPLICATE = Messages.SOUNDCONTENTSET_TARGET_DUPLICATE;
+
+ private String SOUNDCONTENTSET_ALLOCATABLE_INVALID_TYPE = Messages.SOUNDCONTENTSET_ALLOCATABLE_INVALID_TYPE;
+
+ private String SOUNDCONTENTSET_ALLOCATABLE_DUPLICATE = Messages.SOUNDCONTENTSET_ALLOCATABLE_DUPLICATE;
+
+ @Check(NORMAL)
+ def checkContent(SoundContentSet soundContentSet) {
+ if (soundContentSet.target.size === 0) {
+ warning(String.format(SOUNDCONTENTSET_TARGET_SIZE, soundContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET);
+ }
+
+ if (soundContentSet.target.contains(soundContentSet)) {
+ error(String.format(SOUNDCONTENTSET_TARGET_INCLUDE_SELF, soundContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET,
+ soundContentSet.target.indexOf(soundContentSet));
+ return;
+ }
+
+ var hash = new HashSet<AbstractContent>
+ for (var index = 0; index < soundContentSet.target.size; index.operator_plusPlus()) {
+ val AbstractContent abstractContent = soundContentSet.target.get(index);
+ if (!(abstractContent instanceof SoundContent || abstractContent instanceof SoundContentSet)) {
+ error(String.format(SOUNDCONTENTSET_TARGET_INVALID_TYPE, soundContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET, index);
+ return;
+ }
+ if (hash.contains(abstractContent)) {
+ error(String.format(SOUNDCONTENTSET_TARGET_DUPLICATE, soundContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET, index);
+ return;
+ } else {
+ hash.add(abstractContent)
+ }
+ }
+
+ var allocatableSet = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < soundContentSet.allocatable.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = soundContentSet.allocatable.get(index);
+ if (!(abstractAllocatable instanceof Zone || abstractAllocatable instanceof ZoneSet)) {
+ error(String.format(SOUNDCONTENTSET_ALLOCATABLE_INVALID_TYPE, soundContentSet.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ }
+ if (allocatableSet.contains(abstractAllocatable)) {
+ error(String.format(SOUNDCONTENTSET_ALLOCATABLE_DUPLICATE, soundContentSet.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ } else {
+ allocatableSet.add(abstractAllocatable)
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentValidator.xtend
new file mode 100644
index 0000000..68f5d35
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SoundContentValidator.xtend
@@ -0,0 +1,86 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import java.util.function.Consumer
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AbstractAllocatable
+import rba.core.RBACorePackage
+import rba.sound.SoundContent
+import rba.sound.Zone
+import rba.sound.ZoneSet
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.rbaEditorModel.CTag
+import rba.sound.RBASoundPackage
+
+class SoundContentValidator extends AbstractContentValidator {
+
+ private String SOUND_ALLOCATABLE_INVALID_TYPE = Messages.SOUND_ALLOCATABLE_INVALID_TYPE;
+
+ private String SOUND_ALLOCATABLE_DUPLICATE = Messages.SOUND_ALLOCATABLE_DUPLICATE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ private Consumer<String> errorToName = [msg|error(msg, RBACorePackage.Literals.NAMED_ELEMENT__NAME, 0)];
+
+ @Check(NORMAL)
+ def checkSOUND(SoundContent soundContent) {
+ var hash = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < soundContent.allocatable.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = soundContent.allocatable.get(index);
+ if(!(abstractAllocatable instanceof Zone || abstractAllocatable instanceof ZoneSet)) {
+ error(String.format(SOUND_ALLOCATABLE_INVALID_TYPE, soundContent.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ }
+ if(hash.contains(abstractAllocatable)) {
+ error(String.format(SOUND_ALLOCATABLE_DUPLICATE, soundContent.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ } else {
+ hash.add(abstractAllocatable)
+ }
+ }
+
+// for (var index = 0; index < soundContent.tags.size; index.operator_plusPlus()) {
+// val Tag tag = soundContent.tags.get(index);
+// if (!tag.stereotype.targetModelName.equals(SoundContent.simpleName)) {
+// error(String.format(TARGET_MODEL_NAME_MISMATCH, SoundContent.simpleName, tag.stereotype.targetModelName), RBACorePackage.Literals.TAG__STEREOTYPE);
+// return;
+// }
+// }
+ }
+
+ @Check(NORMAL)
+ def check0RequiredFields(SoundContent soundContent) {
+// println(this.class.simpleName)
+ val tags = soundContent.tags;
+
+ if(tags.isNullOrEmpty || !tags.filter(CTag).isEmpty) {
+ if(!doRequiredFieldsCheck(soundContent)) return;
+ }
+ }
+
+ def protected doRequiredFieldsCheck(SoundContent soundContent) {
+ var passed = false;
+ passed = ValidatorUtils.mustHaveLeastOneState(soundContent, errorToName);
+ if(!passed) {
+ return false;
+ }
+ passed = false;
+ for (var index = 0; index < soundContent.contentGroup.size; index.operator_plusPlus()) {
+ if(!soundContent.contentGroup.get(index).allocatable.empty) {
+ passed = true
+ }
+ }
+ if(!passed) {
+ passed = ValidatorUtils.mustHaveLeastOneAllocatable(soundContent, errorToName);
+ if(!passed) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/StateValueValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/StateValueValidator.xtend
new file mode 100644
index 0000000..598f1c9
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/StateValueValidator.xtend
@@ -0,0 +1,28 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.core.StateValue
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+import static rba.tool.editor.validation.validators.ValidatorUtils.*
+
+class StateValueValidator extends AbstractRBAModelValidator {
+
+ private static final String TargetOperatorName = StateValue.simpleName;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsActive(StateValue operator) {
+ val passed = operandSizeMustBeOne(operator.operand, TargetOperatorName, [ msg | error(msg, RBACorePackage.Literals.OPERATOR__OPERAND, 0)])
+ if (!passed) {
+ return;
+ }
+ val firstOperand = operator.operand.get(0);
+ firstOperandMustBeContent(firstOperand, TargetOperatorName, [ msg | error(msg, RBACorePackage.Literals.OPERATOR__OPERAND, 0)]);
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ThatOfOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ThatOfOperatorValidator.xtend
new file mode 100644
index 0000000..e6092c4
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ThatOfOperatorValidator.xtend
@@ -0,0 +1,69 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.Allocatable
+import rba.core.ContentState
+import rba.core.ExpressionType
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.ThatOfOperator
+import rba.core.impl.OperatorImpl
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ThatOfOperatorValidator extends AbstractRBAModelValidator {
+
+ private String THATOF_OPERAND_SIZE = Messages.THATOF_OPERAND_SIZE;
+
+ private String THATOF_OPERAND_OBJECTREFERENCE = Messages.THATOF_OPERAND_OBJECTREFERENCE;
+
+ private String THATOF_OPERAND_OBJECTREFERENCE_EQUAL = Messages.THATOF_OPERAND_OBJECTREFERENCE_EQUAL;
+
+ private String THATOF_OPERAND_EXPRESSIONTYPE = Messages.THATOF_OPERAND_EXPRESSIONTYPE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkThatOfOperator(ThatOfOperator thatOfOperator) {
+ if (thatOfOperator.operand.size != 1) {
+ error(THATOF_OPERAND_SIZE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ for (operand : thatOfOperator.operand) {
+ if (operand.type != ExpressionType.AREA && operand.type != ExpressionType.CONTENT_STATE && operand.type != ExpressionType.ZONE) {
+ error(THATOF_OPERAND_EXPRESSIONTYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ var thatOfoperand = thatOfOperator.operand.get(0)
+ if (thatOfoperand instanceof ObjectReference) {
+ var objRef = thatOfoperand as ObjectReference
+ if (objRef.refObject.name !== null) {
+ var parent = getParent(thatOfOperator)
+ if ((parent instanceof ContentState && objRef.refObject instanceof ContentState) || (parent instanceof Allocatable && objRef.refObject instanceof Allocatable)) {
+ } else {
+ error(THATOF_OPERAND_OBJECTREFERENCE_EQUAL, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ } else {
+ error(THATOF_OPERAND_OBJECTREFERENCE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ } else {
+ error(THATOF_OPERAND_OBJECTREFERENCE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ }
+ }
+
+ def EObject getParent(ThatOfOperator thatOfOperator) {
+ var parent = thatOfOperator.eContainer
+ while (parent instanceof OperatorImpl) {
+ parent = parent.eContainer
+ }
+ return parent;
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ValidatorUtils.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ValidatorUtils.xtend
new file mode 100644
index 0000000..2416be7
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ValidatorUtils.xtend
@@ -0,0 +1,109 @@
+package rba.tool.editor.validation.validators
+
+import java.util.List
+import java.util.function.Consumer
+import rba.core.Expression
+import rba.core.ExpressionType
+import rba.tool.editor.messages.Messages
+import rba.core.Allocatable
+import rba.core.RBACorePackage
+import rba.core.Content
+import rba.view.RBAViewPackage
+import rba.view.Area
+import rba.view.ViewContent
+
+
+class ValidatorUtils {
+
+ def public static boolean isContent(Expression operand) {
+ return (operand.type != ExpressionType.CONTENT && operand.type != ExpressionType.SOUND);
+ }
+ def private static String getModelType(Object obj) {
+ return obj.class.simpleName.replaceAll("Impl", "");
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveVisibility(Allocatable model, Consumer<String> handling) {
+ if (!model.eIsSet(RBACorePackage.eINSTANCE.allocatable_Visibility)) {
+ handling.accept(String.format(Messages.VISIBILITY_IS_REQUIRED, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveZorder(Area model, Consumer<String> handling) {
+ if (!model.eIsSet(RBAViewPackage.eINSTANCE.area_Zorder)) {
+ handling.accept(String.format(Messages.ZORDER_IS_REQUIRED, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveLeastOneSize(Area model, Consumer<String> handling) {
+ if (model.size.empty) {
+ handling.accept(String.format(Messages.HAS_AT_LEAST_ONE_SIZE, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveLeastOneSize(ViewContent model, Consumer<String> handling) {
+ if (model.size.empty) {
+ handling.accept(String.format(Messages.HAS_AT_LEAST_ONE_SIZE, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveLeastOneState(Content model, Consumer<String> handling) {
+ if (model.states.empty) {
+ handling.accept(String.format(Messages.HAS_AT_LEAST_ONE_STATE, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean mustHaveLeastOneAllocatable(Content model, Consumer<String> handling) {
+ if (model.allocatable.empty) {
+ handling.accept(String.format(Messages.ALLOCATABLE_SIZE, getModelType(model), model.name));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean operandSizeMustBeOne(List<Expression> operands, String operatorName,
+ Consumer<String> handling) {
+ if (operands.size != 1) {
+ handling.accept(String.format(Messages.OPERAND_SIZE_ONE, operatorName));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Find an error. */
+ def public static boolean operandSizeMustBeTwo(List<Expression> operands, String operatorName,
+ Consumer<String> handling) {
+ if (operands.size != 2) {
+ handling.accept(String.format(Messages.OPERAND_SIZE_TWO, operatorName));
+ return false;
+ }
+ return true;
+ }
+
+ /** @return true: Check passed. false: Error occurs. */
+ def public static boolean firstOperandMustBeContent(Expression firstOperand, String operatorName,
+ Consumer<String> handling) {
+ if (isContent(firstOperand)) {
+ handling.accept(String.format(Messages.FIRST_OPERAND_MUST_CONTENT, operatorName));
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/VerticalLayoutValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/VerticalLayoutValidator.xtend
new file mode 100644
index 0000000..47efaf2
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/VerticalLayoutValidator.xtend
@@ -0,0 +1,25 @@
+package rba.tool.editor.validation.validators
+
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.view.RBAViewPackage
+import rba.view.VerticalLayout
+
+class VerticalLayoutValidator extends AbstractRBAModelValidator {
+
+ private String VERTICAL_LAYOUT_CHECK = Messages.VERTICAL_LAYOUT_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkVerticalLayout(VerticalLayout verticalLayout) {
+ if (verticalLayout.subarea.size == 0) {
+ warning(VERTICAL_LAYOUT_CHECK, RBAViewPackage.Literals.ALIGNED_LAYOUT__SUBAREA);
+ return;
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentSetValidator.xtend
new file mode 100644
index 0000000..6130d75
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentSetValidator.xtend
@@ -0,0 +1,70 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import rba.core.AbstractAllocatable
+import rba.core.AbstractContent
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.view.Area
+import rba.view.AreaSet
+import rba.view.ViewContent
+import rba.view.ViewContentSet
+
+class ViewContentSetValidator extends ContentSetValidator {
+
+ private String VIEWCONTENTSET_TARGET_SIZE = Messages.VIEWCONTENTSET_TARGET_SIZE;
+
+ private String VIEWCONTENTSET_TARGET_INVALID_TYPE = Messages.VIEWCONTENTSET_TARGET_INVALID_TYPE;
+
+ private String VIEWCONTENTSET_TARGET_INCLUDE_SELF = Messages.VIEWCONTENTSET_TARGET_INCLUDE_SELF;
+
+ private String VIEWCONTENTSET_TARGET_DUPLICATE = Messages.VIEWCONTENTSET_TARGET_DUPLICATE;
+
+ private String VIEWCONTENTSET_ALLOCATABLE_INVALID_TYPE = Messages.VIEWCONTENTSET_ALLOCATABLE_INVALID_TYPE;
+
+ private String VIEWCONTENTSET_ALLOCATABLE_DUPLICATE = Messages.VIEWCONTENTSET_ALLOCATABLE_DUPLICATE;
+
+ @Check(NORMAL)
+ def checkContent(ViewContentSet viewContentSet) {
+ if (viewContentSet.target.size === 0) {
+ warning(String.format(VIEWCONTENTSET_TARGET_SIZE, viewContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET);
+ }
+
+ if (viewContentSet.target.contains(viewContentSet)) {
+ error(String.format(VIEWCONTENTSET_TARGET_INCLUDE_SELF, viewContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET, viewContentSet.target.indexOf(
+ viewContentSet));
+ return;
+ }
+
+ var hash = new HashSet<AbstractContent>
+ for (var index = 0; index < viewContentSet.target.size; index.operator_plusPlus()) {
+ val AbstractContent abstractContent = viewContentSet.target.get(index);
+ if (!(abstractContent instanceof ViewContent || abstractContent instanceof ViewContentSet)) {
+ error(String.format(VIEWCONTENTSET_TARGET_INVALID_TYPE, viewContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET, index);
+ return;
+ }
+ if (hash.contains(abstractContent)) {
+ error(String.format(VIEWCONTENTSET_TARGET_DUPLICATE, viewContentSet.name), RBACorePackage.Literals.CONTENT_SET__TARGET, index);
+ return;
+ } else {
+ hash.add(abstractContent)
+ }
+ }
+
+ var allocatableSet = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < viewContentSet.allocatable.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = viewContentSet.allocatable.get(index);
+ if (!(abstractAllocatable instanceof Area || abstractAllocatable instanceof AreaSet)) {
+ error(String.format(VIEWCONTENTSET_ALLOCATABLE_INVALID_TYPE, viewContentSet.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ }
+ if (allocatableSet.contains(abstractAllocatable)) {
+ error(String.format(VIEWCONTENTSET_ALLOCATABLE_DUPLICATE, viewContentSet.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ } else {
+ allocatableSet.add(abstractAllocatable)
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentValidator.xtend
new file mode 100644
index 0000000..ae4dde2
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ViewContentValidator.xtend
@@ -0,0 +1,91 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import java.util.function.Consumer
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.AbstractAllocatable
+import rba.core.RBACorePackage
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.rbaEditorModel.CTag
+import rba.view.Area
+import rba.view.AreaSet
+import rba.view.ViewContent
+
+class ViewContentValidator extends AbstractContentValidator {
+
+ private String CONTENT_ALLOCATABLE_INVALID_TYPE = Messages.CONTENT_ALLOCATABLE_INVALID_TYPE;
+
+ private String CONTENT_ALLOCATABLE_DUPLICATE = Messages.CONTENT_ALLOCATABLE_DUPLICATE;
+
+ public static String CONTENT_DISPLAY_SIZE_CHECK = Messages.CONTENT_DISPLAY_SIZE_CHECK;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ private Consumer<String> errorToName = [msg|error(msg, RBACorePackage.Literals.NAMED_ELEMENT__NAME, 0)];
+
+ @Check(NORMAL)
+ def checkContent(ViewContent viewContent) {
+ var hash = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < viewContent.allocatable.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = viewContent.allocatable.get(index);
+ if(!(abstractAllocatable instanceof Area || abstractAllocatable instanceof AreaSet)) {
+ error(String.format(CONTENT_ALLOCATABLE_INVALID_TYPE, viewContent.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ }
+ if(hash.contains(abstractAllocatable)) {
+ error(String.format(CONTENT_ALLOCATABLE_DUPLICATE, viewContent.name), RBACorePackage.Literals.ABSTRACT_CONTENT__ALLOCATABLE, index);
+ return;
+ } else {
+ hash.add(abstractAllocatable)
+ }
+ }
+
+// for (var index = 0; index < viewContent.tags.size; index.operator_plusPlus()) {
+// val Tag tag = viewContent.tags.get(index);
+// if (!tag.stereotype.targetModelName.equals(ViewContent.simpleName)) {
+// error(String.format(TARGET_MODEL_NAME_MISMATCH, ViewContent.simpleName, tag.stereotype.targetModelName), RBACorePackage.Literals.TAG__STEREOTYPE);
+// return;
+// }
+// }
+ }
+
+ @Check(NORMAL)
+ def check0RequiredFields(ViewContent viewContent) {
+// println(this.class.simpleName)
+ val tags = viewContent.tags;
+
+ if(tags.isNullOrEmpty || !tags.filter(CTag).isEmpty) {
+ if(!doRequiredFieldsCheck(viewContent)) return;
+ }
+ }
+
+ def protected doRequiredFieldsCheck(ViewContent viewContent) {
+ var passed = false;
+ passed = ValidatorUtils.mustHaveLeastOneState(viewContent, errorToName);
+ if(!passed) {
+ return false;
+ }
+ passed = ValidatorUtils.mustHaveLeastOneSize(viewContent, errorToName);
+ if(!passed) {
+ return false;
+ }
+ passed = false;
+ for (var index = 0; index < viewContent.contentGroup.size; index.operator_plusPlus()) {
+ if(!viewContent.contentGroup.get(index).allocatable.empty) {
+ passed = true
+ }
+ }
+ if(!passed) {
+ passed = ValidatorUtils.mustHaveLeastOneAllocatable(viewContent, errorToName);
+ if(!passed) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneSetValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneSetValidator.xtend
new file mode 100644
index 0000000..0e0ce9f
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneSetValidator.xtend
@@ -0,0 +1,47 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import rba.core.AbstractAllocatable
+import rba.core.RBACorePackage
+import rba.sound.Zone
+import rba.sound.ZoneSet
+import rba.tool.editor.messages.Messages
+
+class ZoneSetValidator extends AllocatableSetValidator {
+
+ private String ZONESET_TARGET_SIZE = Messages.ZONESET_TARGET_SIZE;
+
+ private String ZONESET_TARGET_INVALID_TYPE = Messages.ZONESET_TARGET_INVALID_TYPE;
+
+ private String ZONESET_TARGET_INCLUDE_SELF = Messages.ZONESET_TARGET_INCLUDE_SELF;
+
+ private String ZONESET_TARGET_DUPLICATE = Messages.ZONESET_TARGET_DUPLICATE;
+
+ @Check(NORMAL)
+ def checkContent(ZoneSet zoneSet) {
+ if (zoneSet.target.size === 0) {
+ warning(String.format(ZONESET_TARGET_SIZE, zoneSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET);
+ }
+
+ if (zoneSet.target.contains(zoneSet)) {
+ error(String.format(ZONESET_TARGET_INCLUDE_SELF, zoneSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, zoneSet.target.indexOf(zoneSet));
+ return;
+ }
+
+ var hash = new HashSet<AbstractAllocatable>
+ for (var index = 0; index < zoneSet.target.size; index.operator_plusPlus()) {
+ val AbstractAllocatable abstractAllocatable = zoneSet.target.get(index);
+ if (!(abstractAllocatable instanceof Zone || abstractAllocatable instanceof ZoneSet)) {
+ error(String.format(ZONESET_TARGET_INVALID_TYPE, zoneSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, index);
+ return;
+ }
+ if (hash.contains(abstractAllocatable)) {
+ error(String.format(ZONESET_TARGET_DUPLICATE, zoneSet.name), RBACorePackage.Literals.ALLOCATABLE_SET__TARGET, index);
+ return;
+ } else {
+ hash.add(abstractAllocatable)
+ }
+ }
+ }
+}
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneValidator.xtend
new file mode 100644
index 0000000..36a0f80
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/ZoneValidator.xtend
@@ -0,0 +1,69 @@
+package rba.tool.editor.validation.validators
+
+import java.util.function.Consumer
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.RBACorePackage
+import rba.sound.RBASoundPackage
+import rba.sound.Zone
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.rbaEditorModel.CTag
+import rba.tool.editor.validation.AbstractRBAModelValidator
+
+class ZoneValidator extends AbstractRBAModelValidator {
+ private String TARGET_MODEL_NAME_MISMATCH = Messages.TARGET_MODEL_NAME_MISMATCH;
+ private String ZONE_VISIBILITY_NEGATIVE = Messages.ZONE_VISIBILITY_NEGATIVE;
+ private String ZONE_ATTENUATE_NEGATIVE = Messages.ZONE_ATTENUATE_NEGATIVE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ private Consumer<String> errorToName = [msg|error(msg, RBACorePackage.Literals.NAMED_ELEMENT__NAME, 0)];
+
+ @Check(NORMAL)
+ def checkZone(Zone zone) {
+ var visibility = zone.getVisibility()
+ if (visibility instanceof rba.core.impl.IntegerValueImpl) {
+ if (visibility.getValue() < 0) {
+ error(ZONE_VISIBILITY_NEGATIVE, RBACorePackage.Literals.ALLOCATABLE__VISIBILITY);
+ return;
+ }
+ }
+ var attenuate = zone.getAttenuate();
+ if (attenuate instanceof rba.core.impl.IntegerValueImpl) {
+ if (attenuate.getValue() < 0) {
+ error(ZONE_ATTENUATE_NEGATIVE, RBASoundPackage.Literals.ZONE__ATTENUATE);
+ return;
+ }
+ }
+
+// for (var index = 0; index < zone.tags.size; index.operator_plusPlus()) {
+// val Tag tag = zone.tags.get(index);
+// if (!tag.stereotype.targetModelName.equals(Zone.simpleName)) {
+// error(String.format(TARGET_MODEL_NAME_MISMATCH, Zone.simpleName, tag.stereotype.targetModelName), RBACorePackage.Literals.TAG__STEREOTYPE);
+// return;
+// }
+// }
+ }
+
+ @Check(NORMAL)
+ def check0RequiredFields(Zone zone) {
+// println(this.class.simpleName)
+ val tags = zone.tags;
+
+ if(tags.isNullOrEmpty || !tags.filter(CTag).isEmpty) {
+ if(!doRequiredFieldsCheck(zone)) return;
+ }
+ }
+
+ def protected doRequiredFieldsCheck(Zone zone) {
+ var passed = ValidatorUtils.mustHaveVisibility(zone, errorToName)
+ if(!passed) {
+ return false;
+ }
+
+ return true;
+ }
+
+}