]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/symbolEditor/PopulateTerminal.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / symbolEditor / PopulateTerminal.java
1 package org.simantics.modeling.symbolEditor;
2
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;
13
14 public class PopulateTerminal {
15
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);
21
22         Resource definedElement = g.getSingleObject(symbolDiagram, STR.Defines);
23
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;
33                     break;
34                 }
35             }
36         }
37
38         if (terminalRelation == null) {
39             terminalRelation = GraphUtils.create(g,
40 //                    L0.SubrelationOf, STR.IsConnectedTo,
41                     MOD.DiagramConnectionRelationToConnectionRelation, relation,
42                     L0.PartOf, definedElement
43             );
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);
52             if(name != null)
53                 g.claimLiteral(terminalRelation, L0.HasName, name);
54
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);
63             }
64
65             StructuralUtils.addConnectionPoint(g, definedElement, terminalRelation);
66         }
67
68         g.claim(terminal, DIA.HasConnectionPoint, terminalRelation);
69     }
70         
71 }