aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-27 18:54:23 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-27 18:54:23 +0200
commite37f75d3d9b8cfda74fc48766c890dda07343794 (patch)
tree66fb10fda353c4653a0f879c15ede73b140ce4a4
parentdocs: add links between Javadocs (diff)
downloadrefinery-e37f75d3d9b8cfda74fc48766c890dda07343794.tar.gz
refinery-e37f75d3d9b8cfda74fc48766c890dda07343794.tar.zst
refinery-e37f75d3d9b8cfda74fc48766c890dda07343794.zip
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
-rw-r--r--subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/ReteEngine.java43
-rw-r--r--subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/matcher/RetePatternMatcher.java1
2 files changed, 25 insertions, 19 deletions
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 @@
9 9
10package tools.refinery.interpreter.rete.matcher; 10package tools.refinery.interpreter.rete.matcher;
11 11
12import java.lang.reflect.InvocationTargetException;
13import java.util.Collection;
14import java.util.LinkedList;
15import java.util.Map;
16import java.util.concurrent.Callable;
17
18import org.apache.log4j.Logger; 12import org.apache.log4j.Logger;
19import tools.refinery.interpreter.rete.boundary.Disconnectable;
20import tools.refinery.interpreter.rete.boundary.ReteBoundary;
21import tools.refinery.interpreter.rete.construction.RetePatternBuildException;
22import tools.refinery.interpreter.rete.construction.plancompiler.ReteRecipeCompiler;
23import tools.refinery.interpreter.rete.network.Network;
24import tools.refinery.interpreter.rete.network.NodeProvisioner;
25import tools.refinery.interpreter.rete.network.ReteContainer;
26import tools.refinery.interpreter.matchers.InterpreterRuntimeException; 13import tools.refinery.interpreter.matchers.InterpreterRuntimeException;
27import tools.refinery.interpreter.matchers.backend.IQueryBackend; 14import tools.refinery.interpreter.matchers.backend.*;
28import tools.refinery.interpreter.matchers.backend.IQueryBackendFactory;
29import tools.refinery.interpreter.matchers.backend.IQueryBackendHintProvider;
30import tools.refinery.interpreter.matchers.backend.IQueryResultProvider;
31import tools.refinery.interpreter.matchers.backend.QueryEvaluationHint;
32import tools.refinery.interpreter.matchers.context.IQueryBackendContext; 15import tools.refinery.interpreter.matchers.context.IQueryBackendContext;
33import tools.refinery.interpreter.matchers.context.IQueryRuntimeContext; 16import tools.refinery.interpreter.matchers.context.IQueryRuntimeContext;
34import tools.refinery.interpreter.matchers.psystem.queries.PQuery; 17import tools.refinery.interpreter.matchers.psystem.queries.PQuery;
35import tools.refinery.interpreter.matchers.tuple.TupleMask; 18import tools.refinery.interpreter.matchers.tuple.TupleMask;
36import tools.refinery.interpreter.matchers.util.CollectionsFactory; 19import tools.refinery.interpreter.matchers.util.CollectionsFactory;
20import tools.refinery.interpreter.rete.boundary.Disconnectable;
21import tools.refinery.interpreter.rete.boundary.ReteBoundary;
22import tools.refinery.interpreter.rete.construction.RetePatternBuildException;
23import tools.refinery.interpreter.rete.construction.plancompiler.ReteRecipeCompiler;
37import tools.refinery.interpreter.rete.index.Indexer; 24import tools.refinery.interpreter.rete.index.Indexer;
25import tools.refinery.interpreter.rete.network.Network;
26import tools.refinery.interpreter.rete.network.NodeProvisioner;
27import tools.refinery.interpreter.rete.network.ReteContainer;
38import tools.refinery.interpreter.rete.traceability.RecipeTraceInfo; 28import tools.refinery.interpreter.rete.traceability.RecipeTraceInfo;
39 29
30import java.lang.reflect.InvocationTargetException;
31import java.util.Collection;
32import java.util.LinkedList;
33import java.util.Map;
34import java.util.concurrent.Callable;
35
40/** 36/**
41 * @author Gabor Bergmann 37 * @author Gabor Bergmann
42 * 38 *
@@ -262,6 +258,7 @@ public class ReteEngine implements IQueryBackend {
262 * @since 2.4 258 * @since 2.4
263 */ 259 */
264 public <T> T constructionWrapper(final Callable<T> payload) { 260 public <T> T constructionWrapper(final Callable<T> payload) {
261 ensureInitialized();
265 T result = null; 262 T result = null;
266// context.modelReadLock(); 263// context.modelReadLock();
267// try { 264// try {
@@ -533,7 +530,15 @@ public class ReteEngine implements IQueryBackend {
533 530
534 } 531 }
535 532
536 @Override 533 /**
534 * @since 2.9
535 */
536 public boolean isDisposedOrUninitialized() {
537 return disposedOrUninitialized;
538 }
539
540
541 @Override
537 public IQueryResultProvider getResultProvider(PQuery query) { 542 public IQueryResultProvider getResultProvider(PQuery query) {
538 return accessMatcher(query); 543 return accessMatcher(query);
539 } 544 }
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
441 441
442 @Override 442 @Override
443 public void removeUpdateListener(Object listenerTag) { 443 public void removeUpdateListener(Object listenerTag) {
444 if (engine.isDisposedOrUninitialized()) return; // NO-OP
444 engine.constructionWrapper(() -> { 445 engine.constructionWrapper(() -> {
445 disconnectByTag(listenerTag); 446 disconnectByTag(listenerTag);
446 return null; 447 return null;