| /******************************************************************************* |
| * Copyright (c) 2012 Willink Transformations and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * E.D.Willink - Initial API and implementation |
| * |
| * This file provides additional validation constraints for use of OCL embedded in Ecore. |
| *******************************************************************************/ |
| import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/' |
| |
| package ecore |
| |
| context EModelElement |
| /** |
| * Declare a helper operation to map an ok/warning verdict to ok/error. |
| */ |
| def: asError(verdict : Boolean) : Boolean = if verdict then true else null endif |
| |
| /** |
| * Extra validation for EReference and EAttribute. |
| */ |
| context EStructuralFeature |
| |
| /** |
| * Declare a helper property to determine whether an EStructuralFeature has an OCL derivation. |
| */ |
| def: hasDerivation : Boolean = eAnnotations->select(source?.startsWith('http://www.eclipse.org/emf/2002/Ecore/OCL'))->notEmpty() |
| |
| /** |
| * If a feature has an OCL derivation, it should be transient; otherwise it is not executed. |
| */ |
| inv DerivationIsTransient: hasDerivation implies transient |
| |
| /** |
| * If a feature has an OCL derivation, it must be volatile; otherwise the cached value suppresses execution. |
| */ |
| inv DerivationIsVolatile: asError(hasDerivation implies volatile) |
| |
| /** |
| * If a feature has an OCL derivation, it should not also have a default value. |
| */ |
| inv DerivationIsUninitialized: hasDerivation implies defaultValue.oclIsUndefined() |
| |
| /** |
| * Extra validation for just EReference. |
| */ |
| context EReference |
| |
| /** |
| * If a feature has an OCL derivation, it should not compete with built-in containment. |
| */ |
| inv DerivationIsNotComposed: asError(hasDerivation implies not containment) |
| |
| /** |
| * If a feature has an OCL derivation, it should be not waste time resolving proxies. |
| */ |
| inv DerivationDoesNotResolveProxies: hasDerivation implies not resolveProxies |
| |
| /** |
| * If a feature has an OCL derivation and an opposite, the opposite should also have an OCL derivation |
| */ |
| inv DerivationWithOppositeHasOppositeDerivation: hasDerivation and eOpposite <> null implies eOpposite.hasDerivation |
| |
| endpackage |