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