]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.common/src/org/simantics/db/common/request/ResourceSetGraph.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / request / ResourceSetGraph.java
index e00ff7f7090705c82d9ec237e5e5b20e23f64f48..0b968f24150a5be506b7006d673b86ffab5640ec 100644 (file)
@@ -1,90 +1,90 @@
-package org.simantics.db.common.request;\r
-\r
-import gnu.trove.map.hash.THashMap;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.ResourceSet;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.service.CollectionSupport;\r
-\r
-public class ResourceSetGraph {\r
-       \r
-       final public CollectionSupport coll; \r
-       final public List<ResourceSetGraph> references;\r
-       final public Resource resource;\r
-       final public Map<ResourceSet,Set<Resource>> cache = new THashMap<ResourceSet,Set<Resource>>();\r
-       \r
-       public ResourceSetGraph(ReadGraph graph, Resource result) {\r
-               this.resource = result;\r
-               this.references = new ArrayList<ResourceSetGraph>();\r
-               this.coll = graph.getService(CollectionSupport.class);\r
-       }\r
-\r
-       private Set<Resource> probe(ReadGraph graph, ResourceSet types) {\r
-           return cache.get(types);\r
-       }\r
-       \r
-       private Set<Resource> resolve(ReadGraph graph, ResourceSet types, Set<Resource> visited) throws DatabaseException {\r
-\r
-           if(visited != null)\r
-               if(!visited.add(this.resource)) return Collections.emptySet();\r
-\r
-           Set<Resource> cached = cache.get(types);\r
-           if(cached != null) return cached;\r
-           \r
-               boolean includeThis = !types.disjoint(graph.getTypes(this.resource));\r
-               \r
-               Set<Resource> allRefs = null;\r
-               for(ResourceSetGraph ref : references) {\r
-                   Set<Resource> refs = ref.probe(graph, types);\r
-                   if(refs == null) {\r
-                       if(visited == null) {\r
-                           visited = coll.createSet();\r
-                           visited.add(this.resource);\r
-                       }\r
-                       refs = ref.resolve(graph, types, visited);\r
-                   }\r
-                   if(!refs.isEmpty()) {\r
-                       if(allRefs == null) allRefs = coll.createSet(refs.size());\r
-                       allRefs.addAll(refs);\r
-                   }\r
-               }\r
-               \r
-               Set<Resource> result = Collections.emptySet();\r
-               if(allRefs != null) {\r
-                   if(allRefs.size() == 1) {\r
-                       if(includeThis) {\r
-                           allRefs.add(resource);\r
-                           if(allRefs.size() == 1) result =  Collections.singleton(allRefs.iterator().next());\r
-                           else result = allRefs;\r
-                       } else {\r
-                          result = Collections.singleton(allRefs.iterator().next());\r
-                       }\r
-                   } else {\r
-                if(includeThis) allRefs.add(resource);\r
-                result = allRefs;\r
-                   }\r
-               } else {\r
-                   if(includeThis) result = Collections.singleton(resource);\r
-               }\r
-               \r
-               cache.put(types, result);\r
-               \r
-               return result;\r
-               \r
-       }\r
-       \r
-       public Set<Resource> resolve(ReadGraph graph, ResourceSet types) throws DatabaseException {\r
-               Set<Resource> result = resolve(graph, types, null);\r
-               if(result == null) result = Collections.emptySet();\r
-               return result;\r
-       }\r
-       \r
+package org.simantics.db.common.request;
+
+import gnu.trove.map.hash.THashMap;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.ResourceSet;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.service.CollectionSupport;
+
+public class ResourceSetGraph {
+       
+       final public CollectionSupport coll; 
+       final public List<ResourceSetGraph> references;
+       final public Resource resource;
+       final public Map<ResourceSet,Set<Resource>> cache = new THashMap<ResourceSet,Set<Resource>>();
+       
+       public ResourceSetGraph(ReadGraph graph, Resource result) {
+               this.resource = result;
+               this.references = new ArrayList<ResourceSetGraph>();
+               this.coll = graph.getService(CollectionSupport.class);
+       }
+
+       private Set<Resource> probe(ReadGraph graph, ResourceSet types) {
+           return cache.get(types);
+       }
+       
+       private Set<Resource> resolve(ReadGraph graph, ResourceSet types, Set<Resource> visited) throws DatabaseException {
+
+           if(visited != null)
+               if(!visited.add(this.resource)) return Collections.emptySet();
+
+           Set<Resource> cached = cache.get(types);
+           if(cached != null) return cached;
+           
+               boolean includeThis = !types.disjoint(graph.getTypes(this.resource));
+               
+               Set<Resource> allRefs = null;
+               for(ResourceSetGraph ref : references) {
+                   Set<Resource> refs = ref.probe(graph, types);
+                   if(refs == null) {
+                       if(visited == null) {
+                           visited = coll.createSet();
+                           visited.add(this.resource);
+                       }
+                       refs = ref.resolve(graph, types, visited);
+                   }
+                   if(!refs.isEmpty()) {
+                       if(allRefs == null) allRefs = coll.createSet(refs.size());
+                       allRefs.addAll(refs);
+                   }
+               }
+               
+               Set<Resource> result = Collections.emptySet();
+               if(allRefs != null) {
+                   if(allRefs.size() == 1) {
+                       if(includeThis) {
+                           allRefs.add(resource);
+                           if(allRefs.size() == 1) result =  Collections.singleton(allRefs.iterator().next());
+                           else result = allRefs;
+                       } else {
+                          result = Collections.singleton(allRefs.iterator().next());
+                       }
+                   } else {
+                if(includeThis) allRefs.add(resource);
+                result = allRefs;
+                   }
+               } else {
+                   if(includeThis) result = Collections.singleton(resource);
+               }
+               
+               cache.put(types, result);
+               
+               return result;
+               
+       }
+       
+       public Set<Resource> resolve(ReadGraph graph, ResourceSet types) throws DatabaseException {
+               Set<Resource> result = resolve(graph, types, null);
+               if(result == null) result = Collections.emptySet();
+               return result;
+       }
+       
 }
\ No newline at end of file