]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.structural2/src/org/simantics/structural2/internal/queries/ConnectedTo.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / internal / queries / ConnectedTo.java
1 package org.simantics.structural2.internal.queries;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.HashSet;\r
6 import java.util.Set;\r
7 \r
8 import org.simantics.db.ReadGraph;\r
9 import org.simantics.db.Resource;\r
10 import org.simantics.db.Statement;\r
11 import org.simantics.db.common.request.ResourceRead2;\r
12 import org.simantics.db.common.utils.NameUtils;\r
13 import org.simantics.db.exception.DatabaseException;\r
14 import org.simantics.structural.stubs.StructuralResource2;\r
15 import org.simantics.structural2.queries.Terminal;\r
16 import org.simantics.structural2.utils.StructuralUtils;\r
17 \r
18 /**\r
19  * @author Tuukka Lehtonen\r
20  */\r
21 public class ConnectedTo extends ResourceRead2<Set<Terminal>> {\r
22 \r
23     private static final boolean DEBUG = false;\r
24 \r
25     public ConnectedTo(Resource component, Resource connectionPoint) {\r
26         super(component, connectionPoint);\r
27     }\r
28 \r
29     @Override\r
30     public Set<Terminal> perform(ReadGraph graph) throws DatabaseException {\r
31         if (DEBUG)\r
32             System.out.println("connectedTo(" + NameUtils.getSafeName(graph, resource) + ", " + NameUtils.getSafeName(graph, resource2) + ")");\r
33 \r
34         Collection<Resource> connections = graph.getObjects(resource, resource2);\r
35         if (connections.isEmpty())\r
36             return Collections.emptySet();\r
37 \r
38         Set<Resource> reachableConnections = new HashSet<Resource>();\r
39         for (Resource connection : connections) {\r
40             reachableConnections.addAll(StructuralUtils.getRelatedConnections(graph, connection));\r
41         }\r
42 \r
43         StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
44 \r
45         Set<Terminal> connectedTo = new HashSet<Terminal>();\r
46 \r
47         for (Resource connection : reachableConnections) {\r
48             if (DEBUG)\r
49                 System.out.println("  checking connection: " + NameUtils.getSafeName(graph, connection));\r
50 \r
51             for (Statement stm : graph.getStatements(connection, sr.Connects)) {\r
52                 Resource connectionPoint2 = graph.getInverse(stm.getPredicate());\r
53                 if (resource2.equals(connectionPoint2) && resource.equals(stm.getObject()))\r
54                     continue;\r
55 \r
56                 if (DEBUG)\r
57                     System.out.println("    connected to (" + NameUtils.getSafeName(graph, stm.getObject()) + ", " + NameUtils.getSafeName(graph, connectionPoint2) + ")");\r
58 \r
59                 connectedTo.add(new Terminal(stm.getObject(), connectionPoint2));\r
60             }\r
61         }\r
62 \r
63         return connectedTo;\r
64     }\r
65 \r
66 }\r