]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.objmap2/src/org/simantics/objmap/structural/rules/domain/StructuralUtils.java
c4ba7048008201801566660492b7d8a9f2ada86e
[simantics/3d.git] / org.simantics.objmap2 / src / org / simantics / objmap / structural / rules / domain / StructuralUtils.java
1 package org.simantics.objmap.structural.rules.domain;\r
2 \r
3 import org.simantics.db.ReadGraph;\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.db.exception.NoSingleResultException;\r
8 import org.simantics.layer0.Layer0;\r
9 import org.simantics.objmap.structural.StructuralResource;\r
10 import org.simantics.structural.stubs.StructuralResource2;\r
11 \r
12 public class StructuralUtils {\r
13 \r
14         \r
15         public static boolean isStructuralInstance(ReadGraph g, Resource r) throws DatabaseException {\r
16                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
17                  if (g.isInstanceOf(r, sr.Component)) {\r
18                          Resource type = g.getSingleType(r);\r
19                          return g.isInstanceOf(type, sr.Component);\r
20                  }\r
21                  return false;\r
22                 \r
23         }\r
24         \r
25         public static Resource getContainingInstance(StructuralResource element) {\r
26                 if (!element.isStructural())\r
27                         return null;\r
28                 Resource instance = element.getContext().get(element.getContext().size()-1);\r
29                 return instance;\r
30         }\r
31         \r
32         public static Resource getPublishedRelation(ReadGraph g, StructuralResource element, Resource relation) throws DatabaseException{\r
33                 Resource instance = getContainingInstance(element);\r
34                 if (instance == null)\r
35                         return null;\r
36                 \r
37                 Layer0 l0 = Layer0.getInstance(g);\r
38                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
39                 \r
40             Resource type = null;\r
41             try {\r
42                 type = g.getSingleType(instance);\r
43             } catch (NoSingleResultException e) {\r
44                 \r
45             }\r
46             if (type == null)\r
47                 return null;\r
48             \r
49             boolean elementPublished = false;\r
50             Resource publicRelation = null;\r
51             for (Resource r : g.getObjects(type, l0.DomainOf)) {\r
52                 if (r.equals(element.getResource()))\r
53                         elementPublished = true;\r
54                 if (g.isInstanceOf(r, relation)) {\r
55                         if (element.getResource().equals(g.getPossibleObject(r, sr.IsBoundBy)))\r
56                                 publicRelation = r;\r
57                 }\r
58             }\r
59             if (!elementPublished)\r
60                 return null;\r
61             return publicRelation;\r
62         }\r
63         \r
64         public static Resource getOrCreatePublishedRelation(WriteGraph g, StructuralResource element, Resource relation) throws DatabaseException{\r
65                 Resource instance = getContainingInstance(element);\r
66                 if (instance == null)\r
67                         return null;\r
68                 \r
69                 Layer0 l0 = Layer0.getInstance(g);\r
70                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
71                 \r
72             Resource type = g.getSingleType(instance);\r
73             \r
74             boolean elementPublished = false;\r
75             Resource publicRelation = null;\r
76             for (Resource r : g.getObjects(type, l0.DomainOf)) {\r
77                 if (r.equals(element.getResource()))\r
78                         elementPublished = true;\r
79                 if (g.isInstanceOf(r, relation)) {\r
80                         if (element.getResource().equals(g.getPossibleObject(r, sr.IsBoundBy)))\r
81                                 publicRelation = r;\r
82                 }\r
83             }\r
84             if (!elementPublished)\r
85                 return null;\r
86             if (publicRelation != null)\r
87                 return publicRelation;\r
88             \r
89             publicRelation = g.newResource();\r
90             // TODO: type ConsistsOf publicRelation, publicRelation ConsistsOf publicInverse ?\r
91             g.claim(publicRelation, l0.SubrelationOf, l0.IsRelatedTo);\r
92             g.claim(publicRelation, l0.InstanceOf, relation);\r
93             g.claim(publicRelation, sr.IsBoundBy, element.getResource());\r
94             g.claim(type, l0.DomainOf, publicRelation);\r
95             g.claimLiteral(publicRelation, l0.HasName, g.getRelatedValue(element.getResource(), l0.HasName) +"_" + g.getRelatedValue(relation, l0.HasName)); \r
96             Resource inverse = g.getPossibleInverse(relation);\r
97             if (inverse != null) {\r
98                 Resource publicInverse = g.newResource();\r
99                 g.claim(publicInverse, l0.SubrelationOf, inverse);\r
100                 g.claim(publicRelation, l0.InverseOf, publicInverse);\r
101             }\r
102             return publicRelation;\r
103             \r
104         }\r
105 }\r