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