1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.objmap.structural.rules.domain;
\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
23 public class StructuralUtils {
\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
36 public static Resource getContainingInstance(StructuralResource element) {
\r
37 if (!element.isStructural())
\r
39 Resource instance = element.getContext().get(element.getContext().size()-1);
\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
48 Layer0 l0 = Layer0.getInstance(g);
\r
49 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
51 Resource type = null;
\r
53 type = g.getSingleType(instance);
\r
54 } catch (NoSingleResultException e) {
\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
70 if (!elementPublished)
\r
72 return publicRelation;
\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
80 Layer0 l0 = Layer0.getInstance(g);
\r
81 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
83 Resource type = g.getSingleType(instance);
\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
95 if (!elementPublished)
\r
97 if (publicRelation != null)
\r
98 return publicRelation;
\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
113 return publicRelation;
\r