From e37f75d3d9b8cfda74fc48766c890dda07343794 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 27 Jun 2024 18:54:23 +0200 Subject: interpreter: Fix NPE in VQE wipe/dispose -> EVM -> MatchUpdateListener chains Port https://github.com/eclipse-viatra/org.eclipse.viatra/commit/a70e5e35f254079fbb0819731c81f64b3c79d1d7 from the VIATRA upstream repository --- .../interpreter/rete/matcher/ReteEngine.java | 43 ++++++++++++---------- .../rete/matcher/RetePatternMatcher.java | 1 + 2 files changed, 25 insertions(+), 19 deletions(-) (limited to 'subprojects/interpreter-rete') diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/ReteEngine.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/ReteEngine.java index aa793e11..fba257e0 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/ReteEngine.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/ReteEngine.java @@ -9,34 +9,30 @@ package tools.refinery.interpreter.rete.matcher; -import java.lang.reflect.InvocationTargetException; -import java.util.Collection; -import java.util.LinkedList; -import java.util.Map; -import java.util.concurrent.Callable; - import org.apache.log4j.Logger; -import tools.refinery.interpreter.rete.boundary.Disconnectable; -import tools.refinery.interpreter.rete.boundary.ReteBoundary; -import tools.refinery.interpreter.rete.construction.RetePatternBuildException; -import tools.refinery.interpreter.rete.construction.plancompiler.ReteRecipeCompiler; -import tools.refinery.interpreter.rete.network.Network; -import tools.refinery.interpreter.rete.network.NodeProvisioner; -import tools.refinery.interpreter.rete.network.ReteContainer; import tools.refinery.interpreter.matchers.InterpreterRuntimeException; -import tools.refinery.interpreter.matchers.backend.IQueryBackend; -import tools.refinery.interpreter.matchers.backend.IQueryBackendFactory; -import tools.refinery.interpreter.matchers.backend.IQueryBackendHintProvider; -import tools.refinery.interpreter.matchers.backend.IQueryResultProvider; -import tools.refinery.interpreter.matchers.backend.QueryEvaluationHint; +import tools.refinery.interpreter.matchers.backend.*; import tools.refinery.interpreter.matchers.context.IQueryBackendContext; import tools.refinery.interpreter.matchers.context.IQueryRuntimeContext; import tools.refinery.interpreter.matchers.psystem.queries.PQuery; import tools.refinery.interpreter.matchers.tuple.TupleMask; import tools.refinery.interpreter.matchers.util.CollectionsFactory; +import tools.refinery.interpreter.rete.boundary.Disconnectable; +import tools.refinery.interpreter.rete.boundary.ReteBoundary; +import tools.refinery.interpreter.rete.construction.RetePatternBuildException; +import tools.refinery.interpreter.rete.construction.plancompiler.ReteRecipeCompiler; import tools.refinery.interpreter.rete.index.Indexer; +import tools.refinery.interpreter.rete.network.Network; +import tools.refinery.interpreter.rete.network.NodeProvisioner; +import tools.refinery.interpreter.rete.network.ReteContainer; import tools.refinery.interpreter.rete.traceability.RecipeTraceInfo; +import java.lang.reflect.InvocationTargetException; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; +import java.util.concurrent.Callable; + /** * @author Gabor Bergmann * @@ -262,6 +258,7 @@ public class ReteEngine implements IQueryBackend { * @since 2.4 */ public T constructionWrapper(final Callable payload) { + ensureInitialized(); T result = null; // context.modelReadLock(); // try { @@ -533,7 +530,15 @@ public class ReteEngine implements IQueryBackend { } - @Override + /** + * @since 2.9 + */ + public boolean isDisposedOrUninitialized() { + return disposedOrUninitialized; + } + + + @Override public IQueryResultProvider getResultProvider(PQuery query) { return accessMatcher(query); } diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/RetePatternMatcher.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/RetePatternMatcher.java index 5d04081c..21154bd5 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/RetePatternMatcher.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/RetePatternMatcher.java @@ -441,6 +441,7 @@ public class RetePatternMatcher extends TransformerNode implements IQueryResultP @Override public void removeUpdateListener(Object listenerTag) { + if (engine.isDisposedOrUninitialized()) return; // NO-OP engine.constructionWrapper(() -> { disconnectByTag(listenerTag); return null; -- cgit v1.2.3-70-g09d2