blob: defab241b2ab061f0750ffb2633256f5407a61f3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
******************************************************************************/
package org.eclipse.ocl.examples.impactanalyzer;
import java.util.Collection;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.ocl.ecore.OCLExpression;
import org.eclipse.ocl.examples.eventmanager.EventFilter;
import org.eclipse.ocl.examples.eventmanager.EventManager;
import org.eclipse.ocl.examples.impactanalyzer.configuration.ActivationOption;
import org.eclipse.ocl.examples.impactanalyzer.configuration.OptimizationActivation;
/**
* The Impact Analyzer (IA) analyzes the impact of {@link Notification}s on a single {@link OCLExpression} in the sense that it
* determines those context objects of the expression for which the expression's evaluation result may have changed because of the
* change indicated by the notification. Imagine this as "spreadsheet" functionality for models: model changes can be propagated
* efficiently, even for large to huge models. Possible application areas include OCL constraint re-evaluation after model changes
* as well as attribute grammars based on OCL.
* <p>
*
* The interaction with the IA typically happens in two steps. First call {@link #createFilterForExpression()}. This
* returns an {@link EventFilter} which can be used to register a listener in the {@link EventManager}. The subscriber will then
* be supplied with all relevant {@link Notification}s relevant to the supplied {@link OCLExpression}.
* <p>
*
* Once a relevant <code>Notification</code> occurs it can be passed to the IA by calling {@link #getContextObjects(Notification)}
* which returns a set of {@link EObject}s for which the expression's value may have changed due to the change notification. These
* context objects can be used to instruct the evaluator to evaluate affected <code>OCLExpressions</code> for a certain set of
* instances.
* <p>
*
* The impact analyzer has a few configuration options, affecting the choice of implementation. We currently
* use those to tune and performance-benchmark variants and flavors of the implementation. If you find that
* the default configuration doesn't work well for your case, you may try different configuration options.
* See {@link OptimizationActivation} and {@link ActivationOption} for details.
*
* @author Axel Uhl
*/
public interface ImpactAnalyzer {
/**
* Creates a filter for the given OCL expression, which matches at least all events
* that cause the expression to change its value on one or more context elements.
* Note that also events may be matched that don't actually lead to a change. The
* filter synthesis is "conservative" in this sense.
* @return the filter matching all relevant events
*/
EventFilter createFilterForExpression();
/**
* For a change notification <tt>event</tt> calculates a superset of the set of context objects
* for which <tt>expression</tt> may have changed its value due to the change indicated by the event.
* As implied by "superset," the result set may contain context elements for which the expression's
* value may happen to not have changed.
*
* @param event
* the event to calculate for
* @return all relevant context objects; always a valid collection, never <code>null</code>
*/
Collection<EObject> getContextObjects(Notification event);
/**
* Determines a superset of the set of context objects for which the overall
* expression managed by this instance scope analysis results in
* <code>evaluationResult</code> or a collection containing
* <code>evaluationResult</code>. The result is always a valid collection,
* never <code>null</code>, but possibly empty.
*
* @param evaluationResult
* has to be a non-<code>null</code> {@link EObject} because
* backwards navigation is not easily possible for
* primitive-typed values and is impossible from
* <code>null</code> values for now.
*/
public Collection<EObject> getContextObjects(EObject evaluationResult);
}