X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Frules%2FRelatedDiagramConnections.java;fp=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Frules%2FRelatedDiagramConnections.java;h=ebbef33323cd7d543e9011026f1863e54e3bff75;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/RelatedDiagramConnections.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/RelatedDiagramConnections.java new file mode 100644 index 000000000..ebbef3332 --- /dev/null +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/RelatedDiagramConnections.java @@ -0,0 +1,71 @@ +package org.simantics.modeling.rules; + +import gnu.trove.set.hash.THashSet; + +import java.util.Collection; +import java.util.Set; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Statement; +import org.simantics.db.exception.DatabaseException; +import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.structural.stubs.StructuralResource2; + +public class RelatedDiagramConnections { + + ReadGraph g; + StructuralResource2 sr; + DiagramResource dr; + + THashSet connections = new THashSet(); + THashSet connectionJoins = new THashSet(); + THashSet outputConnectors = new THashSet(); + + public RelatedDiagramConnections(ReadGraph g) { + this.g = g; + this.sr = StructuralResource2.getInstance(g); + this.dr = DiagramResource.getInstance(g); + } + + public void addConnection(Resource connection) throws DatabaseException { + if(connections.add(connection)) { + for(Statement hasConnector : g.getStatements(connection, dr.HasConnector)) { + Resource connector = hasConnector.getObject(); + for(Resource flag : g.getObjects(connector, sr.Connects)) { + if(g.isInstanceOf(flag, dr.Flag)) { + for(Resource join : g.getObjects(flag, dr.FlagIsJoinedBy)) + addConnectionJoin(join); + } + } + if (g.isSubrelationOf(hasConnector.getPredicate(), dr.HasTailConnector)) { + outputConnectors.add(connector); + } + } + } + } + + public void addConnectionJoin(Resource join) throws DatabaseException { + if(connectionJoins.add(join)) { + for(Resource flag : g.getObjects(join, dr.JoinsFlag)) + for(Resource connector : g.getObjects(flag, sr.IsConnectedTo)) + for(Resource connection : g.getObjects(connector, dr.IsConnectorOf)) + addConnection(connection); + } + } + + public static Collection getRelatedDiagramConnections(ReadGraph g, Resource connection) throws DatabaseException { + RelatedDiagramConnections p = new RelatedDiagramConnections(g); + p.addConnection(connection); + return p.connections; + } + + public Set getDiagramConnections() { + return connections; + } + + public Set getOutputConnectors() { + return outputConnectors; + } + +}