+package org.simantics.structural2.internal.queries;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.common.request.ResourceRead2;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.structural2.queries.Terminal;\r
+import org.simantics.structural2.utils.StructuralUtils;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ConnectedTo extends ResourceRead2<Set<Terminal>> {\r
+\r
+ private static final boolean DEBUG = false;\r
+\r
+ public ConnectedTo(Resource component, Resource connectionPoint) {\r
+ super(component, connectionPoint);\r
+ }\r
+\r
+ @Override\r
+ public Set<Terminal> perform(ReadGraph graph) throws DatabaseException {\r
+ if (DEBUG)\r
+ System.out.println("connectedTo(" + NameUtils.getSafeName(graph, resource) + ", " + NameUtils.getSafeName(graph, resource2) + ")");\r
+\r
+ Collection<Resource> connections = graph.getObjects(resource, resource2);\r
+ if (connections.isEmpty())\r
+ return Collections.emptySet();\r
+\r
+ Set<Resource> reachableConnections = new HashSet<Resource>();\r
+ for (Resource connection : connections) {\r
+ reachableConnections.addAll(StructuralUtils.getRelatedConnections(graph, connection));\r
+ }\r
+\r
+ StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
+\r
+ Set<Terminal> connectedTo = new HashSet<Terminal>();\r
+\r
+ for (Resource connection : reachableConnections) {\r
+ if (DEBUG)\r
+ System.out.println(" checking connection: " + NameUtils.getSafeName(graph, connection));\r
+\r
+ for (Statement stm : graph.getStatements(connection, sr.Connects)) {\r
+ Resource connectionPoint2 = graph.getInverse(stm.getPredicate());\r
+ if (resource2.equals(connectionPoint2) && resource.equals(stm.getObject()))\r
+ continue;\r
+\r
+ if (DEBUG)\r
+ System.out.println(" connected to (" + NameUtils.getSafeName(graph, stm.getObject()) + ", " + NameUtils.getSafeName(graph, connectionPoint2) + ")");\r
+\r
+ connectedTo.add(new Terminal(stm.getObject(), connectionPoint2));\r
+ }\r
+ }\r
+\r
+ return connectedTo;\r
+ }\r
+\r
+}\r