blob: 902dd02af883387a7afc94529649dee713e43517 [file] [log] [blame]
/*******************************************************************************
* 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.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.ocl.ecore.OCLExpression;
import org.eclipse.ocl.ecore.OppositePropertyCallExp;
import org.eclipse.ocl.ecore.opposites.DefaultOppositeEndFinder;
import org.eclipse.ocl.ecore.opposites.OppositeEndFinder;
import org.eclipse.ocl.examples.eventmanager.EventManager;
import org.eclipse.ocl.examples.impactanalyzer.configuration.ActivationOption;
import org.eclipse.ocl.examples.impactanalyzer.configuration.OptimizationActivation;
import org.eclipse.ocl.examples.impactanalyzer.impl.ImpactAnalyzerFactoryImpl;
import org.eclipse.ocl.examples.impactanalyzer.util.OCLFactory;
/**
* Used to create {@link ImpactAnalyzer} and {@link DerivedPropertyNotifier}
* objects. A default factory can be obtained using the {@link #INSTANCE} field.
*
* @author Axel Uhl
*/
public interface ImpactAnalyzerFactory {
static final ImpactAnalyzerFactory INSTANCE = new ImpactAnalyzerFactoryImpl();
/**
* Constructs an impact analyzer for the expression specified. The expression's context type is inferred from any occurrence
* of <code>self</code> in the expression. If no <code>self</code> occurrence can be found, an exception will be thrown. The
* configuration is taken from the default {@link OptimizationActivation#getOption()}.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type and its subtypes or not. (Creation here means that the object is added to a resource in the
* {@link ResourceSet} observed by the {@link EventManager} used for handling change events.) Registering for
* element creation on the context type is useful for invariants / constraints because when a new element is
* created, validating the constraint may be useful. For other use cases, registering for element creation may not
* be so useful. For example, when a type inferencer defines its rules using OCL, it only wants to receive
* <em>update</em> events after the element has been fully initialized from those OCL expressions. In those cases,
* some framework may be responsible for the initial evaluation of those OCL expressions on new element, and
* therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, boolean notifyOnNewContextElements, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified with an explicit context type specification. Use this factory
* method if <code>expression</code> does not contain any reference to <code>self</code>. The configuration is taken from the
* default {@link OptimizationActivation#getOption()}.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type and its subtypes or not. (Creation here means that the object is added to a resource in the
* {@link ResourceSet} observed by the {@link EventManager} used for handling change events.) Registering for
* element creation on the context type is useful for invariants / constraints because when a new element is
* created, validating the constraint may be useful. For other use cases, registering for element creation may not
* be so useful. For example, when a type inferencer defines its rules using OCL, it only wants to receive
* <em>update</em> events after the element has been fully initialized from those OCL expressions. In those cases,
* some framework may be responsible for the initial evaluation of those OCL expressions on new element, and
* therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, EClass context, boolean notifyOnNewContextElements, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified with an explicit context type specification. Use this factory
* method if <code>expression</code> does not contain any reference to <code>self</code>. The configuration is taken from the
* default {@link OptimizationActivation#getOption()}.
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, EClass context, boolean notifyOnNewContextElements,
OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified. The expression's context type is inferred from any occurrence
* of <code>self</code> in the expression. If no <code>self</code> occurrence can be found, an exception will be thrown. The
* configuration is taken from the default {@link OptimizationActivation#getOption()}.
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, boolean notifyOnNewContextElements,
OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified. The expression's context type is inferred from any occurrence
* of <code>self</code> in the expression. If no <code>self</code> occurrence can be found, an exception will be thrown.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, boolean notifyOnNewContextElements,
OppositeEndFinder oppositeEndFinder, ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified with an explicit context type specification. Use this factory
* method if <code>expression</code> does not contain any reference to <code>self</code>.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, EClass context, boolean notifyOnNewContextElements,
OppositeEndFinder oppositeEndFinder, ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified with an explicit context type specification. Use this factory
* method if <code>expression</code> does not contain any reference to <code>self</code>.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, EClass context, boolean notifyOnNewContextElements,
ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs an impact analyzer for the expression specified. The expression's context type is inferred from any occurrence
* of <code>self</code> in the expression. If no <code>self</code> occurrence can be found, an exception will be thrown.
* @param notifyOnNewContextElements
* The analyzer can be parameterized during construction such that it either registers for creation events on the
* context type or not. Registering for element creation on the context type is useful for invariants / constraints
* because when a new element is created, validating the constraint may be useful. For other use cases, registering
* for element creation may not be so useful. For example, when a type inferencer defines its rules using OCL, it
* only wants to receive <em>update</em> events after the element has been fully initialized from those OCL
* expressions. In those cases, some framework may be responsible for the initial evaluation of those OCL
* expressions on new element, and therefore, context element creation events are not of interest.
*/
ImpactAnalyzer createImpactAnalyzer(OCLExpression expression, boolean notifyOnNewContextElements,
ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs a notifier for derived properties which efficiently, based on
* an {@link ImpactAnalyzer}, constructs and emits {@link Notification}s for
* derived, OCL-specified {@link EStructuralFeature properties}.
* <p>
*
* This variant uses a {@link DefaultOppositeEndFinder default opposite end
* finder} for resolving and navigating {@link OppositePropertyCallExp}
* expressions. The configuration is taken from the default
* {@link OptimizationActivation#getOption()}.
*
* @param property
* the {@link EStructuralFeature#isDerived() derived} property
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EStructuralFeature property, OCLFactory oclFactory);
/**
* Constructs a notifier for derived properties which efficiently, based on
* an {@link ImpactAnalyzer}, constructs and emits {@link Notification}s for
* derived, OCL-specified {@link EStructuralFeature properties}.
* <p>
*
* This variant uses a {@link DefaultOppositeEndFinder default opposite end
* finder} for resolving and navigating {@link OppositePropertyCallExp}
* expressions.
*
* @param property
* the {@link EStructuralFeature#isDerived() derived} property
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EStructuralFeature property, ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs a notifier for derived properties which efficiently, based on
* an {@link ImpactAnalyzer}, constructs and emits {@link Notification}s for
* derived, OCL-specified {@link EStructuralFeature properties}.
* <p>
*
* The configuration is taken from the default
* {@link OptimizationActivation#getOption()}.
*
* @param property
* the {@link EStructuralFeature#isDerived() derived} property
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when
* evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EStructuralFeature property, OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory);
/**
* Constructs a notifier for derived properties which efficiently, based on
* an {@link ImpactAnalyzer}, constructs and emits {@link Notification}s for
* derived, OCL-specified {@link EStructuralFeature properties}.
* <p>
*
* @param property
* the {@link EStructuralFeature#isDerived() derived} property
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when
* evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EStructuralFeature property, OppositeEndFinder oppositeEndFinder,
ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs a notifier for all derived properties in <code>pkg</code>
* which efficiently, based on an {@link ImpactAnalyzer}, constructs and
* emits {@link Notification}s for derived, OCL-specified
* {@link EStructuralFeature properties}.
* <p>
*
* This variant uses a {@link DefaultOppositeEndFinder default opposite end
* finder} for resolving and navigating {@link OppositePropertyCallExp}
* expressions. The configuration is taken from the default
* {@link OptimizationActivation#getOption()}.
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EPackage pkg, OCLFactory oclFactory);
/**
* Constructs a notifier for all derived properties in <code>pkg</code>
* which efficiently, based on an {@link ImpactAnalyzer}, constructs and
* emits {@link Notification}s for derived, OCL-specified
* {@link EStructuralFeature properties}.
* <p>
*
* This variant uses a {@link DefaultOppositeEndFinder default opposite end
* finder} for resolving and navigating {@link OppositePropertyCallExp}
* expressions.
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EPackage pkg, ActivationOption configuration, OCLFactory oclFactory);
/**
* Constructs a notifier for all derived properties in <code>pkg</code>
* which efficiently, based on an {@link ImpactAnalyzer}, constructs and
* emits {@link Notification}s for derived, OCL-specified
* {@link EStructuralFeature properties}.
* <p>
*
* The configuration is taken from the default
* {@link OptimizationActivation#getOption()}.
*
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when
* evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EPackage pkg, OppositeEndFinder oppositeEndFinder, OCLFactory oclFactory);
/**
* Constructs a notifier for all derived properties in <code>pkg</code>
* which efficiently, based on an {@link ImpactAnalyzer}, constructs and
* emits {@link Notification}s for derived, OCL-specified
* {@link EStructuralFeature properties}.
* <p>
*
* @param oppositeEndFinder
* used to perform {@link OppositePropertyCallExp} when
* evaluating (parts of) <code>expression</code> and for
* evaluating <code>allInstances()</code> calls
*/
DerivedPropertyNotifier createDerivedPropertyNotifier(
EPackage pkg, OppositeEndFinder oppositeEndFinder,
ActivationOption configuration, OCLFactory oclFactory);
}