]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.server/src/org/simantics/document/server/request/NodesRequest.java
Manually "cherry-picked" changes from ae2e31aa to release/1.35.2.1
[simantics/platform.git] / bundles / org.simantics.document.server / src / org / simantics / document / server / request / NodesRequest.java
1 package org.simantics.document.server.request;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.Set;
7
8 import org.simantics.db.ReadGraph;
9 import org.simantics.db.common.request.UnaryRead;
10 import org.simantics.db.exception.DatabaseException;
11 import org.simantics.db.layer0.request.VariableChildren;
12 import org.simantics.db.layer0.request.VariableRead;
13 import org.simantics.db.layer0.variable.Variable;
14 import org.simantics.structural.stubs.StructuralResource2;
15
16 public class NodesRequest extends VariableRead<Set<Variable>> {
17
18     public NodesRequest(Variable var) {
19         super(var);
20     }
21
22     static class CollectNodesRequest2 extends UnaryRead<Collection<Variable>, Set<Variable>> {
23
24         public CollectNodesRequest2(Collection<Variable> nodes) {
25             super(nodes);
26         }
27
28         @Override
29         public Set<Variable> perform(ReadGraph graph) throws DatabaseException {
30             HashSet<Variable> rs = new HashSet<>(); // result
31             for(Variable child : parameter) {
32                 Set<Variable> childNodes = graph.syncRequest(new NodesRequest2(child));
33                 rs.addAll(childNodes);
34             }
35             return rs;
36         }
37
38     }
39
40     @Override
41     public Set<Variable> perform(ReadGraph graph) throws DatabaseException {
42
43         long s = System.nanoTime();
44
45         StructuralResource2.getInstance(graph);
46         if(variable == null)
47             return Collections.emptySet();
48
49         Collection<Variable> children = graph.syncRequest(new VariableChildren(variable));
50
51         Set<Variable> nodes = graph.syncRequest(new CollectNodesRequest2(children));
52
53         if(DocumentRequest.PROFILE) {
54             long dura = System.nanoTime()-s;
55             System.err.println("NodesRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph));
56         }
57
58         return nodes;
59
60     }
61
62 }