--- /dev/null
+package org.simantics.modeling.rules;\r
+\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.util.Collection;\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.exception.DatabaseException;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+\r
+public class RelatedDiagramConnections {\r
+\r
+ ReadGraph g;\r
+ StructuralResource2 sr;\r
+ DiagramResource dr;\r
+ \r
+ THashSet<Resource> connections = new THashSet<Resource>();\r
+ THashSet<Resource> connectionJoins = new THashSet<Resource>();\r
+ THashSet<Resource> outputConnectors = new THashSet<Resource>();\r
+ \r
+ public RelatedDiagramConnections(ReadGraph g) {\r
+ this.g = g;\r
+ this.sr = StructuralResource2.getInstance(g);\r
+ this.dr = DiagramResource.getInstance(g);\r
+ }\r
+\r
+ public void addConnection(Resource connection) throws DatabaseException {\r
+ if(connections.add(connection)) {\r
+ for(Statement hasConnector : g.getStatements(connection, dr.HasConnector)) {\r
+ Resource connector = hasConnector.getObject();\r
+ for(Resource flag : g.getObjects(connector, sr.Connects)) {\r
+ if(g.isInstanceOf(flag, dr.Flag)) {\r
+ for(Resource join : g.getObjects(flag, dr.FlagIsJoinedBy))\r
+ addConnectionJoin(join);\r
+ }\r
+ }\r
+ if (g.isSubrelationOf(hasConnector.getPredicate(), dr.HasTailConnector)) {\r
+ outputConnectors.add(connector);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void addConnectionJoin(Resource join) throws DatabaseException {\r
+ if(connectionJoins.add(join)) {\r
+ for(Resource flag : g.getObjects(join, dr.JoinsFlag))\r
+ for(Resource connector : g.getObjects(flag, sr.IsConnectedTo))\r
+ for(Resource connection : g.getObjects(connector, dr.IsConnectorOf))\r
+ addConnection(connection);\r
+ }\r
+ }\r
+\r
+ public static Collection<Resource> getRelatedDiagramConnections(ReadGraph g, Resource connection) throws DatabaseException {\r
+ RelatedDiagramConnections p = new RelatedDiagramConnections(g);\r
+ p.addConnection(connection);\r
+ return p.connections;\r
+ }\r
+\r
+ public Set<Resource> getDiagramConnections() {\r
+ return connections;\r
+ }\r
+\r
+ public Set<Resource> getOutputConnectors() {\r
+ return outputConnectors;\r
+ }\r
+\r
+}\r