]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/rules/RelatedDiagramConnections.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / rules / RelatedDiagramConnections.java
1 package org.simantics.modeling.rules;\r
2 \r
3 import gnu.trove.set.hash.THashSet;\r
4 \r
5 import java.util.Collection;\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.exception.DatabaseException;\r
12 import org.simantics.diagram.stubs.DiagramResource;\r
13 import org.simantics.structural.stubs.StructuralResource2;\r
14 \r
15 public class RelatedDiagramConnections {\r
16 \r
17         ReadGraph g;\r
18         StructuralResource2 sr;\r
19         DiagramResource dr;\r
20         \r
21         THashSet<Resource> connections = new THashSet<Resource>();\r
22         THashSet<Resource> connectionJoins = new THashSet<Resource>();\r
23         THashSet<Resource> outputConnectors = new THashSet<Resource>();\r
24                 \r
25         public RelatedDiagramConnections(ReadGraph g) {\r
26                 this.g = g;\r
27                 this.sr = StructuralResource2.getInstance(g);\r
28                 this.dr = DiagramResource.getInstance(g);\r
29         }\r
30 \r
31         public void addConnection(Resource connection) throws DatabaseException {\r
32                 if(connections.add(connection)) {\r
33                         for(Statement hasConnector : g.getStatements(connection, dr.HasConnector)) {\r
34                                 Resource connector = hasConnector.getObject();\r
35                                 for(Resource flag : g.getObjects(connector, sr.Connects)) {\r
36                                         if(g.isInstanceOf(flag, dr.Flag)) {\r
37                                                 for(Resource join : g.getObjects(flag, dr.FlagIsJoinedBy))\r
38                                                         addConnectionJoin(join);\r
39                                         }\r
40                                 }\r
41                                 if (g.isSubrelationOf(hasConnector.getPredicate(), dr.HasTailConnector)) {\r
42                                         outputConnectors.add(connector);\r
43                                 }\r
44                         }\r
45                 }\r
46         }\r
47         \r
48         public void addConnectionJoin(Resource join) throws DatabaseException {\r
49                 if(connectionJoins.add(join)) {\r
50                         for(Resource flag : g.getObjects(join, dr.JoinsFlag))\r
51                                 for(Resource connector : g.getObjects(flag, sr.IsConnectedTo))\r
52                                         for(Resource connection : g.getObjects(connector, dr.IsConnectorOf))\r
53                                                 addConnection(connection);\r
54                 }\r
55         }\r
56 \r
57         public static Collection<Resource> getRelatedDiagramConnections(ReadGraph g, Resource connection) throws DatabaseException {\r
58                 RelatedDiagramConnections p = new RelatedDiagramConnections(g);\r
59                 p.addConnection(connection);\r
60                 return p.connections;\r
61         }\r
62 \r
63         public Set<Resource> getDiagramConnections() {\r
64                 return connections;\r
65         }\r
66 \r
67         public Set<Resource> getOutputConnectors() {\r
68                 return outputConnectors;\r
69         }\r
70 \r
71 }\r