| /******************************************************************************* |
| * Copyright (c) 2007, 2010 BMW Car IT, Technische Universitaet Muenchen, and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * BMW Car IT - Initial API and implementation |
| * Technische Universitaet Muenchen - Major refactoring and extension |
| *******************************************************************************/ |
| package org.eclipse.emf.edapt.internal.migration.impl; |
| |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.emf.common.util.BasicDiagnostic; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.emf.common.util.DiagnosticChain; |
| import org.eclipse.emf.ecore.EAnnotation; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EClassifier; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.plugin.EcorePlugin; |
| import org.eclipse.emf.ecore.util.EObjectValidator; |
| import org.eclipse.emf.edapt.spi.migration.Instance; |
| import org.eclipse.emf.edapt.spi.migration.Model; |
| import org.eclipse.ocl.OCL; |
| import org.eclipse.ocl.ParserException; |
| import org.eclipse.ocl.Query; |
| import org.eclipse.ocl.ecore.Constraint; |
| import org.eclipse.ocl.ecore.EcoreEnvironmentFactory; |
| import org.eclipse.ocl.expressions.OCLExpression; |
| import org.eclipse.ocl.helper.OCLHelper; |
| |
| /** |
| * A validator to validate OCL constraints. |
| * |
| * @author herrmama |
| * @author $Author$ |
| * @version $Rev$ |
| * @levd.rating YELLOW Hash: 096149C737E5B0E96753B668A60D11A6 |
| */ |
| public class ModelValidator extends EObjectValidator { |
| |
| /** Source URI for OCL annotations. */ |
| private static final String OCL_SOURCE_URI = "http://www.eclipse.org/ocl/examples/OCL"; //$NON-NLS-1$ |
| |
| /** OCL helper class. */ |
| private final OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl; |
| |
| /** Constructor */ |
| @SuppressWarnings("unchecked") |
| public ModelValidator(Model model) { |
| ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE); |
| ocl.setExtentMap((Map) model.createExtentMap()); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public boolean validate_EveryDefaultConstraint(EObject object, |
| DiagnosticChain diagnostics, Map<Object, Object> context) { |
| boolean result = super.validate_EveryDefaultConstraint(object, |
| diagnostics, context); |
| if (object instanceof Instance) { |
| if (result || diagnostics != null) { |
| result &= validate_EveryInvariant((Instance) object, |
| diagnostics, context); |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * Validate OCL constraints and return true if OCL constraint holds, false |
| * otherwise. |
| */ |
| private boolean validate_EveryInvariant(Instance instance, |
| DiagnosticChain diagnostics, Map<Object, Object> context) { |
| final EClass eClass = instance.getEClass(); |
| final EAnnotation annotation = eClass.getEAnnotation(OCL_SOURCE_URI); |
| if (annotation != null) { |
| for (final Entry<String, String> entry : annotation.getDetails()) { |
| try { |
| final String expression = entry.getValue(); |
| if (!(Boolean) evaluate(instance, expression)) { |
| if (diagnostics != null) { |
| diagnostics.add(new BasicDiagnostic( |
| Diagnostic.ERROR, DIAGNOSTIC_SOURCE, 0, |
| EcorePlugin.INSTANCE.getString( |
| "_UI_GenericConstraint_diagnostic", //$NON-NLS-1$ |
| new Object[] { |
| entry.getKey(), |
| getObjectLabel( |
| (EObject) instance, |
| context) }), |
| new Object[] { instance })); |
| } |
| return false; |
| } |
| } catch (final ParserException e) { |
| System.out.println(e); |
| } |
| } |
| } |
| return true; |
| } |
| |
| /** Evaluate an OCL expression. */ |
| private Object evaluate(Instance instance, String expression) |
| throws ParserException { |
| final OCLHelper<EClassifier, ?, ?, Constraint> helper = ocl.createOCLHelper(); |
| |
| helper.setContext(((EObject) instance).eClass()); |
| final OCLExpression<EClassifier> query = helper.createQuery(expression); |
| |
| // create a Query to evaluate our query expression |
| final Query<EClassifier, EClass, EObject> queryEval = ocl.createQuery(query); |
| final Object result = queryEval.evaluate(instance); |
| |
| return result; |
| } |
| |
| } |