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