]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ConsistsOfProcess.java
0b461bcc133e766af4d45850328c120722cbc11c
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / ConsistsOfProcess.java
1 package org.simantics.db.layer0.util;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Set;\r
5 \r
6 import org.simantics.db.AsyncReadGraph;\r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.common.request.ReadRequest;\r
10 import org.simantics.db.common.utils.Logger;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.db.procedure.AsyncContextMultiProcedure;\r
13 import org.simantics.db.service.CollectionSupport;\r
14 import org.simantics.db.service.DirectQuerySupport;\r
15 import org.simantics.layer0.Layer0;\r
16 \r
17 class ConsistsOfProcess {\r
18 \r
19         final Set<Resource> result;\r
20         final AsyncContextMultiProcedure<Resource, Resource> structure;\r
21 \r
22     public static Set<Resource> walk(ReadGraph graph, Collection<Resource> resources, Set<Resource> exclusions, boolean ignoreVirtual) throws DatabaseException {\r
23         ConsistsOfProcess process = new ConsistsOfProcess(graph, resources, exclusions, ignoreVirtual);\r
24         return process.result;\r
25     }\r
26         \r
27     private ConsistsOfProcess(ReadGraph graph, final Collection<Resource> resources, final Set<Resource> exclusions, final boolean ignoreVirtual) throws DatabaseException {\r
28 \r
29                 final Layer0 L0 = Layer0.getInstance(graph);\r
30                 final DirectQuerySupport dqs = graph.getService(DirectQuerySupport.class);\r
31                 \r
32                 CollectionSupport cs = graph.getService(CollectionSupport.class);\r
33                 result = cs.createSet();\r
34                 \r
35                 structure = dqs.compileForEachObject(graph, L0.ConsistsOf, new AsyncContextMultiProcedure<Resource, Resource>() {\r
36 \r
37                         @Override\r
38                         public void execute(AsyncReadGraph graph, Resource parent, Resource child) {\r
39                                 \r
40                                 if(exclusions.contains(child)) return;\r
41                                 \r
42                                 if(!ignoreVirtual || child.isPersistent())\r
43                                         if(result.add(child)) {\r
44                                                 dqs.forEachObjectCompiled(graph, child, child, structure);\r
45                                         }\r
46                                 \r
47                         }\r
48 \r
49                         @Override\r
50                         public void finished(AsyncReadGraph graph) {\r
51                         }\r
52 \r
53                         @Override\r
54                         public void exception(AsyncReadGraph graph, Throwable throwable) {\r
55                                 Logger.defaultLogError(throwable);\r
56                         }\r
57 \r
58                 });\r
59                 \r
60                 graph.syncRequest(new ReadRequest() {\r
61 \r
62                         @Override\r
63                         public void run(ReadGraph graph) throws DatabaseException {\r
64                                 for(Resource r  : resources)\r
65                                         dqs.forEachObjectCompiled(graph, r, r, structure);\r
66                         }\r
67                         \r
68                 });\r
69                 \r
70         }\r
71         \r
72     \r
73 }\r