| /******************************************************************************* |
| * Copyright (c) 2009, 2018 SAP AG 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: |
| * SAP AG - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ocl.examples.impactanalyzer; |
| |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.ocl.ecore.CallExp; |
| import org.eclipse.ocl.ecore.opposites.OppositeEndFinder; |
| import org.eclipse.ocl.examples.impactanalyzer.deltaPropagation.PartialEcoreEnvironmentFactory; |
| import org.eclipse.ocl.examples.impactanalyzer.deltaPropagation.PartialEvaluatorFactoryImpl; |
| import org.eclipse.ocl.examples.impactanalyzer.util.OCLFactory; |
| |
| /** |
| * Used to create {@link PartialEvaluator} objects. A partial evaluator can |
| * evaluate an OCL expression in the "pre"-state of a model before a given |
| * change, described by an EMF {@link Notification} object, was performed. This |
| * is similar to the OCL <code>@pre</code> evaluation, only that it applies to |
| * the entire expression. This is similar to undoing the change described by the |
| * notification, only that the model doesn't need to be changed for this. |
| * <p> |
| * |
| * A second use for a partial evaluator is that of a {@link CallExp} whose |
| * {@link CallExp#getSource() source} expression's value is known up-front. This |
| * value can be passed to the partial evaluator's |
| * {@link PartialEvaluator#evaluate(Object, CallExp, Object)} method.<p> |
| * |
| * A partial evaluator may also be used to attempt an expression's evaluation |
| * if not all variable values required by the expression are known. For example, |
| * if an operation body expression needs to be evaluated but for some reason not |
| * all argument values have yet been determined, an evaluation attempt may still |
| * succeed if the nature of the expressions leads to the unknown variables not |
| * being accessed. However, if a variable with unknown value is accessed during |
| * expression evaluation, a {@link ValueNotFoundException} is thrown. |
| * |
| * A default factory instance can be obtained using the {@link #INSTANCE} field. |
| * |
| * @author Axel Uhl |
| */ |
| public interface PartialEvaluatorFactory { |
| PartialEvaluatorFactory INSTANCE = new PartialEvaluatorFactoryImpl(); |
| |
| /** |
| * Taking a {@link Notification} object such that an evaluation will be |
| * based on the state *before* the notification. For example, if the |
| * notification indicates the removal of a reference from an element |
| * <tt>e1</tt> to an element <tt>e2</tt> across reference <tt>r</tt> then |
| * when during partial evaluation <tt>r</tt> is traversed starting from |
| * <tt>e1</tt> then <tt>e2</tt> will show in the results although in the |
| * current version of the model it would not. |
| * <p> |
| * |
| * @param atPre |
| * if <code>null</code>, the constructor behaves the same as |
| * {@link #createPartialEvaluator(OppositeEndFinder, OCLFactory)} |
| */ |
| PartialEvaluator createPartialEvaluator(Notification atPre, OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory); |
| |
| /** |
| * Constructs the OCL instance using {@link OCLFactory#createOCL(OppositeEndFinder)}, passing the |
| * <code>oppositeEndFinder</code> provided. A default {@link PartialEcoreEnvironmentFactory} is |
| * used, configured as well with the <code>oppositeEndFinder</code> provided here. |
| */ |
| PartialEvaluator createPartialEvaluator(OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory); |
| } |