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