1 package org.simantics.db.layer0.util;
\r
3 import java.util.Collection;
\r
4 import java.util.Set;
\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
17 class ConsistsOfProcess {
\r
19 final Set<Resource> result;
\r
20 final AsyncContextMultiProcedure<Resource, Resource> structure;
\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
27 private ConsistsOfProcess(ReadGraph graph, final Collection<Resource> resources, final Set<Resource> exclusions, final boolean ignoreVirtual) throws DatabaseException {
\r
29 final Layer0 L0 = Layer0.getInstance(graph);
\r
30 final DirectQuerySupport dqs = graph.getService(DirectQuerySupport.class);
\r
32 CollectionSupport cs = graph.getService(CollectionSupport.class);
\r
33 result = cs.createSet();
\r
35 structure = dqs.compileForEachObject(graph, L0.ConsistsOf, new AsyncContextMultiProcedure<Resource, Resource>() {
\r
38 public void execute(AsyncReadGraph graph, Resource parent, Resource child) {
\r
40 if(exclusions.contains(child)) return;
\r
42 if(!ignoreVirtual || child.isPersistent())
\r
43 if(result.add(child)) {
\r
44 dqs.forEachObjectCompiled(graph, child, child, structure);
\r
50 public void finished(AsyncReadGraph graph) {
\r
54 public void exception(AsyncReadGraph graph, Throwable throwable) {
\r
55 Logger.defaultLogError(throwable);
\r
60 graph.syncRequest(new ReadRequest() {
\r
63 public void run(ReadGraph graph) throws DatabaseException {
\r
64 for(Resource r : resources)
\r
65 dqs.forEachObjectCompiled(graph, r, r, structure);
\r