diff options
Diffstat (limited to 'rba.tool.editor/src/rba/tool/editor/validation')
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; + } + +} |