--- /dev/null
+package org.simantics.modeling.symbolEditor;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.layer0.utils.direct.GraphUtils;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.structural2.utils.StructuralUtils;\r
+\r
+public class PopulateTerminal {\r
+\r
+ public static void addToGraph(WriteGraph g, Resource symbolDiagram, Resource relation, Resource terminal) throws DatabaseException {\r
+ StructuralResource2 STR = StructuralResource2.getInstance(g);\r
+ DiagramResource DIA = DiagramResource.getInstance(g);\r
+ ModelingResources MOD = ModelingResources.getInstance(g);\r
+ Layer0 L0 = Layer0.getInstance(g);\r
+\r
+ Resource definedElement = g.getSingleObject(symbolDiagram, STR.Defines);\r
+\r
+ // Check for existing terminal relation in\r
+ // the current defined element before creating new ones.\r
+ Resource terminalRelation = null;\r
+ for (Resource terminalRel : StructuralUtils.getConnectionRelations(g, definedElement)) {\r
+ for (Resource connectionRel : g.getObjects(terminalRel, MOD.DiagramConnectionRelationToConnectionRelation)) {\r
+ if (relation.equals(connectionRel)) {\r
+ // Don't create new diagram-side terminal relation if one already\r
+ // exists for the same connection relation.\r
+ terminalRelation = terminalRel;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (terminalRelation == null) {\r
+ terminalRelation = GraphUtils.create(g,\r
+// L0.SubrelationOf, STR.IsConnectedTo,\r
+ MOD.DiagramConnectionRelationToConnectionRelation, relation,\r
+ L0.PartOf, definedElement\r
+ );\r
+ g.claim(terminalRelation, L0.SubrelationOf, null, STR.IsConnectedTo);\r
+ Resource inverse = GraphUtils.create(g,\r
+// L0.SubrelationOf, STR.Connects, \r
+ L0.PartOf, terminalRelation, \r
+ L0.HasName, "Inverse");\r
+ g.claim(inverse, L0.SubrelationOf, null, STR.Connects);\r
+ g.claim(terminalRelation, L0.InverseOf, inverse);\r
+ String name = g.getPossibleRelatedValue(relation, L0.HasName, Bindings.STRING);\r
+ if(name != null)\r
+ g.claimLiteral(terminalRelation, L0.HasName, name);\r
+\r
+ for(Resource type : g.getObjects(relation, MOD.ImpliesDiagramConnectionRelationType))\r
+ g.claim(terminalRelation, L0.InstanceOf, type);\r
+\r
+ StructuralUtils.addConnectionPoint(g, definedElement, terminalRelation);\r
+ }\r
+\r
+ g.claim(terminal, DIA.HasConnectionPoint, terminalRelation);\r
+ }\r
+ \r
+}\r