]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.objmap2/src/org/simantics/objmap/structural/rules/domain/StructuralUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / structural / rules / domain / StructuralUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.objmap.structural.rules.domain;\r
13 \r
14 import org.simantics.db.ReadGraph;\r
15 import org.simantics.db.Resource;\r
16 import org.simantics.db.WriteGraph;\r
17 import org.simantics.db.exception.DatabaseException;\r
18 import org.simantics.db.exception.NoSingleResultException;\r
19 import org.simantics.layer0.Layer0;\r
20 import org.simantics.objmap.structural.StructuralResource;\r
21 import org.simantics.structural.stubs.StructuralResource2;\r
22 \r
23 public class StructuralUtils {\r
24 \r
25         \r
26         public static boolean isStructuralInstance(ReadGraph g, Resource r) throws DatabaseException {\r
27                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
28                  if (g.isInstanceOf(r, sr.Component)) {\r
29                          Resource type = g.getSingleType(r);\r
30                          return g.isInstanceOf(type, sr.Component);\r
31                  }\r
32                  return false;\r
33                 \r
34         }\r
35         \r
36         public static Resource getContainingInstance(StructuralResource element) {\r
37                 if (!element.isStructural())\r
38                         return null;\r
39                 Resource instance = element.getContext().get(element.getContext().size()-1);\r
40                 return instance;\r
41         }\r
42         \r
43         public static Resource getPublishedRelation(ReadGraph g, StructuralResource element, Resource relation) throws DatabaseException{\r
44                 Resource instance = getContainingInstance(element);\r
45                 if (instance == null)\r
46                         return null;\r
47                 \r
48                 Layer0 l0 = Layer0.getInstance(g);\r
49                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
50                 \r
51             Resource type = null;\r
52             try {\r
53                 type = g.getSingleType(instance);\r
54             } catch (NoSingleResultException e) {\r
55                 \r
56             }\r
57             if (type == null)\r
58                 return null;\r
59             \r
60             boolean elementPublished = false;\r
61             Resource publicRelation = null;\r
62             for (Resource r : g.getObjects(type, l0.DomainOf)) {\r
63                 if (r.equals(element.getResource()))\r
64                         elementPublished = true;\r
65                 if (g.isInstanceOf(r, relation)) {\r
66                         if (element.getResource().equals(g.getPossibleObject(r, sr.IsBoundBy)))\r
67                                 publicRelation = r;\r
68                 }\r
69             }\r
70             if (!elementPublished)\r
71                 return null;\r
72             return publicRelation;\r
73         }\r
74         \r
75         public static Resource getOrCreatePublishedRelation(WriteGraph g, StructuralResource element, Resource relation) throws DatabaseException{\r
76                 Resource instance = getContainingInstance(element);\r
77                 if (instance == null)\r
78                         return null;\r
79                 \r
80                 Layer0 l0 = Layer0.getInstance(g);\r
81                 StructuralResource2 sr = StructuralResource2.getInstance(g);\r
82                 \r
83             Resource type = g.getSingleType(instance);\r
84             \r
85             boolean elementPublished = false;\r
86             Resource publicRelation = null;\r
87             for (Resource r : g.getObjects(type, l0.DomainOf)) {\r
88                 if (r.equals(element.getResource()))\r
89                         elementPublished = true;\r
90                 if (g.isInstanceOf(r, relation)) {\r
91                         if (element.getResource().equals(g.getPossibleObject(r, sr.IsBoundBy)))\r
92                                 publicRelation = r;\r
93                 }\r
94             }\r
95             if (!elementPublished)\r
96                 return null;\r
97             if (publicRelation != null)\r
98                 return publicRelation;\r
99             \r
100             publicRelation = g.newResource();\r
101             // TODO: type ConsistsOf publicRelation, publicRelation ConsistsOf publicInverse ?\r
102             g.claim(publicRelation, l0.SubrelationOf, l0.IsRelatedTo);\r
103             g.claim(publicRelation, l0.InstanceOf, relation);\r
104             g.claim(publicRelation, sr.IsBoundBy, element.getResource());\r
105             g.claim(type, l0.DomainOf, publicRelation);\r
106             g.claimLiteral(publicRelation, l0.HasName, g.getRelatedValue(element.getResource(), l0.HasName) +"_" + g.getRelatedValue(relation, l0.HasName)); \r
107             Resource inverse = g.getPossibleInverse(relation);\r
108             if (inverse != null) {\r
109                 Resource publicInverse = g.newResource();\r
110                 g.claim(publicInverse, l0.SubrelationOf, inverse);\r
111                 g.claim(publicRelation, l0.InverseOf, publicInverse);\r
112             }\r
113             return publicRelation;\r
114             \r
115         }\r
116 }\r