aboutsummaryrefslogtreecommitdiffstats
path: root/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java
diff options
context:
space:
mode:
Diffstat (limited to 'store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java')
-rw-r--r--store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java b/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java
new file mode 100644
index 00000000..a3b319c8
--- /dev/null
+++ b/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListener.java
@@ -0,0 +1,52 @@
1package tools.refinery.data.query.internal;
2
3import java.util.HashMap;
4import java.util.HashSet;
5import java.util.Map;
6import java.util.Set;
7
8import org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener;
9import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple;
10
11import tools.refinery.data.model.Tuple;
12import tools.refinery.data.query.view.RelationView;
13
14public class RelationUpdateListener {
15 private final Map<RelationView<?>,Set<RelationUpdateListenerEntry<?>>> view2Listeners;
16
17 public RelationUpdateListener(Set<RelationView<?>> relationViews) {
18 view2Listeners = new HashMap<>();
19 for(RelationView<?> relationView : relationViews) {
20 view2Listeners.put(relationView, new HashSet<>());
21 }
22 }
23 public boolean containsRelationalView(RelationView<?> relationalKey) {
24 RelationView<?> relationView = relationalKey.getWrappedKey();
25 return view2Listeners.containsKey(relationView);
26 }
27 public void addListener(RelationView<?> relationalKey, ITuple seed, IQueryRuntimeContextListener listener) {
28 RelationView<?> relationView = relationalKey.getWrappedKey();
29 if(view2Listeners.containsKey(relationView)) {
30 RelationUpdateListenerEntry<?> entry = new RelationUpdateListenerEntry<>(relationalKey, seed, listener);
31 view2Listeners.get(relationView).add(entry);
32 } else throw new IllegalArgumentException();
33 }
34 public void removeListener(RelationView<?> relationalKey, ITuple seed, IQueryRuntimeContextListener listener) {
35 RelationView<?> relationView = relationalKey.getWrappedKey();
36 if(view2Listeners.containsKey(relationView)) {
37 RelationUpdateListenerEntry<?> entry = new RelationUpdateListenerEntry<>(relationalKey, seed, listener);
38 view2Listeners.get(relationView).remove(entry);
39 } else throw new IllegalArgumentException();
40 }
41
42 public <D> void processChange(RelationView<D> relationView, Tuple tuple, D oldValue, D newValue) {
43 Set<RelationUpdateListenerEntry<?>> listeners = view2Listeners.get(relationView);
44 if(listeners != null) {
45 for(RelationUpdateListenerEntry<?> listener : listeners) {
46 @SuppressWarnings("unchecked")
47 RelationUpdateListenerEntry<D> typeCorrectListener = (RelationUpdateListenerEntry<D>) listener;
48 typeCorrectListener.processChange(tuple, oldValue, newValue);
49 }
50 } else throw new IllegalArgumentException("View was not indexed in constructor "+relationView);
51 }
52}