]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesListenerStore.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / DependenciesListenerStore.java
1 package org.simantics.db.layer0.genericrelation;
2
3 import gnu.trove.set.hash.THashSet;
4
5 import java.util.HashMap;
6 import java.util.Map;
7 import java.util.Set;
8
9 import org.simantics.db.Resource;
10
11 class DependenciesListenerStore {
12         
13         private final Map<Resource,Set<Runnable>> listeners = new HashMap<Resource,Set<Runnable>>();
14
15         public synchronized void addListener(Resource model, Runnable listener) {
16                 Set<Runnable> list = listeners.get(model);
17                 if(list == null) {
18                         list = new THashSet<Runnable>();
19                         listeners.put(model, list);
20                 }
21                 list.add(listener);
22                 if (DependenciesRelation.DEBUG_LISTENERS) {
23                         System.out.println("DependenciesRelation.addListener(" + listener + "), " + listeners.size() + " total listeners");
24                         new Exception("DependenciesRelation.addListener(" + listener + ")").printStackTrace(System.out);
25                 }
26         }
27
28         public synchronized void removeListener(Resource model, Runnable listener) {
29                 Set<Runnable> list = listeners.get(model);
30                 if(list == null) return;
31                 list.remove(listener);
32                 if (DependenciesRelation.DEBUG_LISTENERS) {
33                         System.out.println("DependenciesRelation.removeListener(" + listener + "), " + listeners.size() + " total listeners");
34                         new Exception("DependenciesRelation.removeListener(" + listener + ")").printStackTrace(System.out);
35                 }
36         }
37
38         public synchronized void fireListeners(Resource model) {
39                 Set<Runnable> list = listeners.get(model);
40                 if(list == null) return;
41                 for (Runnable r : list) {
42                         r.run();
43                 }
44         }
45
46 }