[543221] Add cached Executor removal
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotExecutorManager.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotExecutorManager.java
index a6dc2bf..ea90d59 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotExecutorManager.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotExecutorManager.java
@@ -12,6 +12,7 @@
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -66,6 +67,24 @@
return null;
}
+ /**
+ * Remove any OCL Executor from the ResourceSet containing an eObject. This may be necessary to prevent
+ * re-use of the cached context of an earlier executor after a change to the models.
+ *
+ * @since 1.7
+ */
+ public static void removeAdapter(@NonNull ResourceSet resourceSet) {
+ EList<org.eclipse.emf.common.notify.Adapter> eAdapters = resourceSet.eAdapters();
+ synchronized (eAdapters) {
+ for (int i = eAdapters.size(); --i >= 0; ) { // Should be at most one, but code to handle more
+ org.eclipse.emf.common.notify.Adapter adapter = eAdapters.get(i);
+ if (adapter instanceof PivotExecutorManager) {
+ eAdapters.remove(i);
+ }
+ }
+ }
+ }
+
private static class Adapter extends PivotExecutorManager implements org.eclipse.emf.common.notify.Adapter
{
private @NonNull ResourceSet resourceSet;
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
index 51cfb8e..661b951 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
@@ -1144,7 +1144,7 @@
*
* @since 1.7
*/
- public static @NonNull Executor getExecutor(@NonNull EObject eObject, @Nullable Map<Object, Object> validationContext) {
+ public static @NonNull Executor getExecutor(@NonNull EObject eObject, @Nullable Map<Object, Object> validationContext) {
if (validationContext != null) {
Executor executor = (Executor) validationContext.get(Executor.class);
if (executor != null) {
@@ -1883,6 +1883,22 @@
}
/**
+ * Remove any OCL Executor from the ResourceSet containing an eObject. This may be necessary to prevent
+ * re-use of the cached context of an earlier executor after a change to the models.
+ *
+ * @since 1.7
+ */
+ public static void removeExecutor(@NonNull EObject eObject) {
+ Resource eResource = eObject.eResource();
+ if (eResource != null) {
+ ResourceSet resourceSet = eResource.getResourceSet();
+ if (resourceSet != null) {
+ PivotExecutorManager.removeAdapter(resourceSet);
+ }
+ }
+ }
+
+ /**
* Rewrite asTree and all its descendants to replace all "?." and "?->" navigations by their safe counterparts.
* @since 1.3
* @deprecated use PivotHelper