1 package org.simantics.modeling.symbolEditor;
3 import org.simantics.databoard.Bindings;
4 import org.simantics.db.Resource;
5 import org.simantics.db.WriteGraph;
6 import org.simantics.db.exception.DatabaseException;
7 import org.simantics.diagram.stubs.DiagramResource;
8 import org.simantics.layer0.Layer0;
9 import org.simantics.layer0.utils.direct.GraphUtils;
10 import org.simantics.modeling.ModelingResources;
11 import org.simantics.structural.stubs.StructuralResource2;
12 import org.simantics.structural2.utils.StructuralUtils;
14 public class PopulateTerminal {
16 public static void addToGraph(WriteGraph g, Resource symbolDiagram, Resource relation, Resource terminal) throws DatabaseException {
17 StructuralResource2 STR = StructuralResource2.getInstance(g);
18 DiagramResource DIA = DiagramResource.getInstance(g);
19 ModelingResources MOD = ModelingResources.getInstance(g);
20 Layer0 L0 = Layer0.getInstance(g);
22 Resource definedElement = g.getSingleObject(symbolDiagram, STR.Defines);
24 // Check for existing terminal relation in
25 // the current defined element before creating new ones.
26 Resource terminalRelation = null;
27 for (Resource terminalRel : StructuralUtils.getConnectionRelations(g, definedElement)) {
28 for (Resource connectionRel : g.getObjects(terminalRel, MOD.DiagramConnectionRelationToConnectionRelation)) {
29 if (relation.equals(connectionRel)) {
30 // Don't create new diagram-side terminal relation if one already
31 // exists for the same connection relation.
32 terminalRelation = terminalRel;
38 if (terminalRelation == null) {
39 terminalRelation = GraphUtils.create(g,
40 // L0.SubrelationOf, STR.IsConnectedTo,
41 MOD.DiagramConnectionRelationToConnectionRelation, relation,
42 L0.PartOf, definedElement
44 g.claim(terminalRelation, L0.SubrelationOf, null, STR.IsConnectedTo);
45 Resource inverse = GraphUtils.create(g,
46 // L0.SubrelationOf, STR.Connects,
47 L0.PartOf, terminalRelation,
48 L0.HasName, "Inverse");
49 g.claim(inverse, L0.SubrelationOf, null, STR.Connects);
50 g.claim(terminalRelation, L0.InverseOf, inverse);
51 String name = g.getPossibleRelatedValue(relation, L0.HasName, Bindings.STRING);
53 g.claimLiteral(terminalRelation, L0.HasName, name);
55 boolean interfaceGeneratesComponentExternally = !g.hasStatement(relation, MOD.GeneratesConnectionComponentInternally);
56 for(Resource type : g.getObjects(relation, MOD.ImpliesDiagramConnectionRelationType)) {
57 // #6636: Only instantiate type if it does not generate a component
58 // when interface is marked to generate component internally.
59 boolean shouldInstantiate = interfaceGeneratesComponentExternally ||
60 g.getAssertedObjects(type, MOD.DiagramConnectionRelationToComponentType).isEmpty();
61 if (shouldInstantiate)
62 g.claim(terminalRelation, L0.InstanceOf, type);
65 StructuralUtils.addConnectionPoint(g, definedElement, terminalRelation);
68 g.claim(terminal, DIA.HasConnectionPoint, terminalRelation);