]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/symbolEditor/PopulateTerminal.java
Sync git svn branch with SVN repository r33144.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / symbolEditor / PopulateTerminal.java
1 package org.simantics.modeling.symbolEditor;\r
2 \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
13 \r
14 public class PopulateTerminal {\r
15 \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
21 \r
22         Resource definedElement = g.getSingleObject(symbolDiagram, STR.Defines);\r
23 \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
33                     break;\r
34                 }\r
35             }\r
36         }\r
37 \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
43             );\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
52             if(name != null)\r
53                 g.claimLiteral(terminalRelation, L0.HasName, name);\r
54 \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
63             }\r
64 \r
65             StructuralUtils.addConnectionPoint(g, definedElement, terminalRelation);\r
66         }\r
67 \r
68         g.claim(terminal, DIA.HasConnectionPoint, terminalRelation);\r
69     }\r
70         \r
71 }\r