1 package org.simantics.objmap.structural.rules.domain;
\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
12 public class StructuralUtils {
\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
25 public static Resource getContainingInstance(StructuralResource element) {
\r
26 if (!element.isStructural())
\r
28 Resource instance = element.getContext().get(element.getContext().size()-1);
\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
37 Layer0 l0 = Layer0.getInstance(g);
\r
38 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
40 Resource type = null;
\r
42 type = g.getSingleType(instance);
\r
43 } catch (NoSingleResultException e) {
\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
59 if (!elementPublished)
\r
61 return publicRelation;
\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
69 Layer0 l0 = Layer0.getInstance(g);
\r
70 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
72 Resource type = g.getSingleType(instance);
\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
84 if (!elementPublished)
\r
86 if (publicRelation != null)
\r
87 return publicRelation;
\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
102 return publicRelation;
\r