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