]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/TGConfigurer.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / TGConfigurer.java
index 34af0d1fcbf4d573f8ac7b842e8ecf95596b7125..4e23fa5750968ab64624843146da008ddc9ce9c9 100644 (file)
-package org.simantics.db.layer0.util;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.NamedResource;\r
-import org.simantics.db.common.request.PossibleIndexRoot;\r
-import org.simantics.db.common.utils.CommonDBUtils;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;\r
-import org.simantics.db.layer0.util.TransferableGraphConfiguration2.RootSpec;\r
-import org.simantics.layer0.Layer0;\r
-\r
-public class TGConfigurer {\r
-\r
-       final private ReadGraph graph;\r
-       final Collection<RootSpec> roots = new ArrayList<RootSpec>();\r
-       final Map<Resource, ExtentStatus> preStatus = new HashMap<Resource, ExtentStatus>();\r
-       final boolean ignoreVirtualResources;\r
-       final boolean validate;\r
-       \r
-       public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources, boolean validate) {\r
-               this.graph = graph;\r
-               this.ignoreVirtualResources = ignoreVirtualResources;\r
-               this.validate = validate;\r
-       }\r
-       \r
-       public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources) {\r
-               this(graph, ignoreVirtualResources, true);\r
-       }\r
-\r
-       public TGConfigurer exclusions(Collection<Resource> exclusions) {\r
-               for(Resource r : exclusions) {\r
-                       preStatus.put(r, ExtentStatus.EXCLUDED);\r
-               }\r
-               return this;\r
-       }\r
-\r
-       public TGConfigurer roots(Collection<RootSpec> rs) throws DatabaseException {\r
-               Layer0 L0 = Layer0.getInstance(graph);\r
-               for(RootSpec root : rs) {\r
-                       Resource nameResource = graph.getPossibleObject(root.resource, L0.HasName);\r
-                       if(nameResource != null) preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
-//                     String name = graph.getValue(nameResource, Bindings.STRING);\r
-                       roots.add(new RootSpec(root.resource, root.name, root.internal));\r
-                       preStatus.put(root.resource, ExtentStatus.INTERNAL);\r
-               }\r
-               return this;\r
-       }\r
-\r
-       public TGConfigurer roots2(Collection<Resource> rs) throws DatabaseException {\r
-               Layer0 L0 = Layer0.getInstance(graph);\r
-               for(Resource root : rs) {\r
-                       Resource nameResource = graph.getPossibleObject(root, L0.HasName);\r
-                       String name = "<no name>";\r
-                       if(nameResource != null) {\r
-                               name = graph.getPossibleValue(nameResource, Bindings.STRING);\r
-                               if(name == null) name = "<no name>";\r
-                               preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
-                       }\r
-                       roots.add(new RootSpec(root, name, true));\r
-                       preStatus.put(root, ExtentStatus.INTERNAL);\r
-               }\r
-               return this;\r
-       }\r
-       \r
-       public TGConfigurer roots3(Collection<NamedResource> rs) throws DatabaseException {\r
-               Layer0 L0 = Layer0.getInstance(graph);\r
-               for(NamedResource root : rs) {\r
-                       Resource nameResource = graph.getPossibleObject(root.getResource(), L0.HasName);\r
-//                     String name = graph.getValue(nameResource, Bindings.STRING);\r
-                       roots.add(new RootSpec(root.getResource(), root.getName(), true));\r
-                       preStatus.put(root.getResource(), ExtentStatus.INTERNAL);\r
-                       preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
-               }\r
-               return this;\r
-       }\r
-\r
-       public TransferableGraphConfiguration2 create() throws DatabaseException {\r
-\r
-               // Final preparation\r
-\r
-               // -Exclude root library if not explicitly included\r
-               if (!roots.contains(graph.getRootLibrary()))\r
-                       preStatus.put(graph.getRootLibrary(), ExtentStatus.EXCLUDED);\r
-\r
-               // -Exclude owners if not explicitly defined\r
-               Layer0 L0 = Layer0.getInstance(graph);\r
-               ArrayList<Resource> rootList = new ArrayList<Resource>();\r
-               for (RootSpec root : roots) {\r
-                       if(root.internal) {\r
-                               rootList.add(root.resource);\r
-                               for (Resource owner : graph.getObjects(root.resource, L0.IsOwnedBy)) {\r
-                                       ExtentStatus ownerStatus = preStatus.get(owner);\r
-                                       if(ownerStatus == null)\r
-                                               preStatus.put(owner, ExtentStatus.EXCLUDED);\r
-                               }\r
-                       } else {\r
-                               preStatus.put(root.resource, ExtentStatus.EXTERNAL);\r
-                       }\r
-               }\r
-               \r
-               Resource owner = CommonDBUtils.getNearestOwner(graph, rootList);\r
-               if(owner != null) {\r
-                       Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(owner));\r
-                       return new TransferableGraphConfiguration2(indexRoot, roots, preStatus, ignoreVirtualResources, validate);\r
-               } else {\r
-                       return new TransferableGraphConfiguration2(null, roots, preStatus, ignoreVirtualResources, validate);\r
-               }\r
-               \r
-       }\r
-       \r
-}\r
+package org.simantics.db.layer0.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.NamedResource;
+import org.simantics.db.common.request.PossibleIndexRoot;
+import org.simantics.db.common.utils.CommonDBUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;
+import org.simantics.db.layer0.util.TransferableGraphConfiguration2.SeedSpec;
+import org.simantics.db.layer0.util.TransferableGraphConfiguration2.SeedSpec.SeedSpecType;
+import org.simantics.layer0.Layer0;
+
+public class TGConfigurer {
+
+       final private ReadGraph graph;
+       final Collection<SeedSpec> roots = new ArrayList<>();
+       final Map<Resource, ExtentStatus> preStatus = new HashMap<>();
+       final boolean ignoreVirtualResources;
+       final boolean validate;
+       
+       public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources, boolean validate) {
+               this.graph = graph;
+               this.ignoreVirtualResources = ignoreVirtualResources;
+               this.validate = validate;
+       }
+       
+       public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources) {
+               this(graph, ignoreVirtualResources, true);
+       }
+
+       public TGConfigurer exclusions(Collection<Resource> exclusions) {
+               for(Resource r : exclusions) {
+                       preStatus.put(r, ExtentStatus.EXCLUDED);
+               }
+               return this;
+       }
+
+       public TGConfigurer roots(Collection<SeedSpec> rs) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(graph);
+               for(SeedSpec root : rs) {
+                       Resource nameResource = graph.getPossibleObject(root.resource, L0.HasName);
+                       if(nameResource != null) preStatus.put(nameResource, ExtentStatus.EXCLUDED);
+                       roots.add(new SeedSpec(root.resource, root.name, root.specType, root.type));
+                       preStatus.put(root.resource, ExtentStatus.INTERNAL);
+               }
+               return this;
+       }
+
+       public TGConfigurer roots2(Collection<Resource> rs) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(graph);
+               for(Resource root : rs) {
+                       Resource nameResource = graph.getPossibleObject(root, L0.HasName);
+                       String name = "<no name>";
+                       if(nameResource != null) {
+                               name = graph.getPossibleValue(nameResource, Bindings.STRING);
+                               if(name == null) name = "<no name>";
+                               preStatus.put(nameResource, ExtentStatus.EXCLUDED);
+                       }
+                       roots.add(new SeedSpec(root, name, SeedSpecType.ROOT));
+                       preStatus.put(root, ExtentStatus.INTERNAL);
+               }
+               return this;
+       }
+       
+       public TGConfigurer roots3(Collection<NamedResource> rs) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(graph);
+               for(NamedResource root : rs) {
+                       Resource nameResource = graph.getPossibleObject(root.getResource(), L0.HasName);
+                       roots.add(new SeedSpec(root.getResource(), root.getName(), SeedSpecType.ROOT));
+                       preStatus.put(root.getResource(), ExtentStatus.INTERNAL);
+                       preStatus.put(nameResource, ExtentStatus.EXCLUDED);
+               }
+               return this;
+       }
+
+       public TransferableGraphConfiguration2 create() throws DatabaseException {
+
+               // Final preparation
+
+               // -Exclude root library if not explicitly included
+               if (!roots.contains(graph.getRootLibrary()))
+                       preStatus.put(graph.getRootLibrary(), ExtentStatus.EXCLUDED);
+
+               // -Exclude owners if not explicitly defined
+               Layer0 L0 = Layer0.getInstance(graph);
+               ArrayList<Resource> rootList = new ArrayList<>();
+               for (SeedSpec root : roots) {
+                       if(!SeedSpecType.SPECIAL_ROOT.equals(root.specType)) {
+                               rootList.add(root.resource);
+                               for (Resource owner : graph.getObjects(root.resource, L0.IsOwnedBy)) {
+                                       ExtentStatus ownerStatus = preStatus.get(owner);
+                                       if(ownerStatus == null)
+                                               preStatus.put(owner, ExtentStatus.EXCLUDED);
+                               }
+                       } else {
+                               preStatus.put(root.resource, ExtentStatus.EXTERNAL);
+                       }
+               }
+               
+               Resource owner = CommonDBUtils.getNearestOwner(graph, rootList);
+               if(owner != null) {
+                       Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(owner));
+                       return new TransferableGraphConfiguration2(indexRoot, roots, preStatus, ignoreVirtualResources, validate);
+               } else {
+                       return new TransferableGraphConfiguration2(null, roots, preStatus, ignoreVirtualResources, validate);
+               }
+               
+       }
+       
+}