]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/internal/queries/ConnectedTo.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/internal/queries/ConnectedTo.java
new file mode 100644 (file)
index 0000000..a0362d7
--- /dev/null
@@ -0,0 +1,66 @@
+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