]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/TGConfigurer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / TGConfigurer.java
1 package org.simantics.db.layer0.util;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.HashMap;\r
6 import java.util.Map;\r
7 \r
8 import org.simantics.databoard.Bindings;\r
9 import org.simantics.db.ReadGraph;\r
10 import org.simantics.db.Resource;\r
11 import org.simantics.db.common.NamedResource;\r
12 import org.simantics.db.common.request.PossibleIndexRoot;\r
13 import org.simantics.db.common.utils.CommonDBUtils;\r
14 import org.simantics.db.exception.DatabaseException;\r
15 import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;\r
16 import org.simantics.db.layer0.util.TransferableGraphConfiguration2.RootSpec;\r
17 import org.simantics.layer0.Layer0;\r
18 \r
19 public class TGConfigurer {\r
20 \r
21         final private ReadGraph graph;\r
22         final Collection<RootSpec> roots = new ArrayList<RootSpec>();\r
23         final Map<Resource, ExtentStatus> preStatus = new HashMap<Resource, ExtentStatus>();\r
24         final boolean ignoreVirtualResources;\r
25         final boolean validate;\r
26         \r
27         public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources, boolean validate) {\r
28                 this.graph = graph;\r
29                 this.ignoreVirtualResources = ignoreVirtualResources;\r
30                 this.validate = validate;\r
31         }\r
32         \r
33         public TGConfigurer(ReadGraph graph, boolean ignoreVirtualResources) {\r
34                 this(graph, ignoreVirtualResources, true);\r
35         }\r
36 \r
37         public TGConfigurer exclusions(Collection<Resource> exclusions) {\r
38                 for(Resource r : exclusions) {\r
39                         preStatus.put(r, ExtentStatus.EXCLUDED);\r
40                 }\r
41                 return this;\r
42         }\r
43 \r
44         public TGConfigurer roots(Collection<RootSpec> rs) throws DatabaseException {\r
45                 Layer0 L0 = Layer0.getInstance(graph);\r
46                 for(RootSpec root : rs) {\r
47                         Resource nameResource = graph.getPossibleObject(root.resource, L0.HasName);\r
48                         if(nameResource != null) preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
49 //                      String name = graph.getValue(nameResource, Bindings.STRING);\r
50                         roots.add(new RootSpec(root.resource, root.name, root.internal));\r
51                         preStatus.put(root.resource, ExtentStatus.INTERNAL);\r
52                 }\r
53                 return this;\r
54         }\r
55 \r
56         public TGConfigurer roots2(Collection<Resource> rs) throws DatabaseException {\r
57                 Layer0 L0 = Layer0.getInstance(graph);\r
58                 for(Resource root : rs) {\r
59                         Resource nameResource = graph.getPossibleObject(root, L0.HasName);\r
60                         String name = "<no name>";\r
61                         if(nameResource != null) {\r
62                                 name = graph.getPossibleValue(nameResource, Bindings.STRING);\r
63                                 if(name == null) name = "<no name>";\r
64                                 preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
65                         }\r
66                         roots.add(new RootSpec(root, name, true));\r
67                         preStatus.put(root, ExtentStatus.INTERNAL);\r
68                 }\r
69                 return this;\r
70         }\r
71         \r
72         public TGConfigurer roots3(Collection<NamedResource> rs) throws DatabaseException {\r
73                 Layer0 L0 = Layer0.getInstance(graph);\r
74                 for(NamedResource root : rs) {\r
75                         Resource nameResource = graph.getPossibleObject(root.getResource(), L0.HasName);\r
76 //                      String name = graph.getValue(nameResource, Bindings.STRING);\r
77                         roots.add(new RootSpec(root.getResource(), root.getName(), true));\r
78                         preStatus.put(root.getResource(), ExtentStatus.INTERNAL);\r
79                         preStatus.put(nameResource, ExtentStatus.EXCLUDED);\r
80                 }\r
81                 return this;\r
82         }\r
83 \r
84         public TransferableGraphConfiguration2 create() throws DatabaseException {\r
85 \r
86                 // Final preparation\r
87 \r
88                 // -Exclude root library if not explicitly included\r
89                 if (!roots.contains(graph.getRootLibrary()))\r
90                         preStatus.put(graph.getRootLibrary(), ExtentStatus.EXCLUDED);\r
91 \r
92                 // -Exclude owners if not explicitly defined\r
93                 Layer0 L0 = Layer0.getInstance(graph);\r
94                 ArrayList<Resource> rootList = new ArrayList<Resource>();\r
95                 for (RootSpec root : roots) {\r
96                         if(root.internal) {\r
97                                 rootList.add(root.resource);\r
98                                 for (Resource owner : graph.getObjects(root.resource, L0.IsOwnedBy)) {\r
99                                         ExtentStatus ownerStatus = preStatus.get(owner);\r
100                                         if(ownerStatus == null)\r
101                                                 preStatus.put(owner, ExtentStatus.EXCLUDED);\r
102                                 }\r
103                         } else {\r
104                                 preStatus.put(root.resource, ExtentStatus.EXTERNAL);\r
105                         }\r
106                 }\r
107                 \r
108                 Resource owner = CommonDBUtils.getNearestOwner(graph, rootList);\r
109                 if(owner != null) {\r
110                         Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(owner));\r
111                         return new TransferableGraphConfiguration2(indexRoot, roots, preStatus, ignoreVirtualResources, validate);\r
112                 } else {\r
113                         return new TransferableGraphConfiguration2(null, roots, preStatus, ignoreVirtualResources, validate);\r
114                 }\r
115                 \r
116         }\r
117         \r
118 }\r