package com.sap.emf.ocl.trigger; import java.util.Collection; import java.util.Collections; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.ocl.ecore.OCL; import org.eclipse.ocl.ecore.OCLExpression; import org.eclipse.ocl.ecore.opposites.OppositeEndFinder; public class AbstractOCLBasedModelUpdater extends AbstractTriggerable implements OCLBasedModelUpdater { private final EStructuralFeature propertyToUpdate; private final OppositeEndFinder oppositeEndFinder; private final EPackage.Registry metamodelPackageRegistry; protected AbstractOCLBasedModelUpdater(EStructuralFeature propertyToUpdate, Registry metamodelPackageRegistry, OppositeEndFinder oppositeEndFinder, ExpressionWithContext triggerExpression, boolean notifyOnNewContextElements) { super(Collections.singleton(triggerExpression), null, notifyOnNewContextElements); this.propertyToUpdate = propertyToUpdate; this.oppositeEndFinder = oppositeEndFinder; this.metamodelPackageRegistry = metamodelPackageRegistry; } /** * This default implementation re-evaluates the {@link #triggerExpression} on each element reported as affected and * sets the {@link #getPropertyToUpdate() property} to update by this updater to the evaluation result. */ @Override public void notify(OCLExpression expression, Collection<EObject> affectedContextObjects, OppositeEndFinder oppositeEndFinder, Notification change) { OCL ocl = org.eclipse.ocl.examples.impactanalyzer.util.OCL.newInstance(metamodelPackageRegistry, oppositeEndFinder); for (EObject eo : affectedContextObjects) { Object newValue = ocl.evaluate(eo, expression); eo.eSet(getPropertyToUpdate(), newValue); } } protected OppositeEndFinder getOppositeEndFinder() { return oppositeEndFinder; } public EStructuralFeature getPropertyToUpdate() { return propertyToUpdate; } }