1 package org.simantics.structural2;
\r
3 import java.util.Collection;
\r
4 import java.util.LinkedList;
\r
6 import org.simantics.databoard.Databoard;
\r
7 import org.simantics.databoard.binding.Binding;
\r
8 import org.simantics.datatypes.literal.GUID;
\r
9 import org.simantics.db.ReadGraph;
\r
10 import org.simantics.db.Resource;
\r
11 import org.simantics.db.exception.DatabaseException;
\r
12 import org.simantics.db.layer0.adapter.Instances;
\r
13 import org.simantics.db.layer0.exception.MissingVariableException;
\r
14 import org.simantics.db.layer0.variable.RVI;
\r
15 import org.simantics.db.layer0.variable.RVI.GuidRVIPart;
\r
16 import org.simantics.db.layer0.variable.RVI.RVIPart;
\r
17 import org.simantics.db.layer0.variable.RVIBuilder;
\r
18 import org.simantics.db.layer0.variable.StandardRVIResolver;
\r
19 import org.simantics.db.layer0.variable.Variable;
\r
20 import org.simantics.db.layer0.variable.Variables;
\r
21 import org.simantics.layer0.Layer0;
\r
22 import org.simantics.simulation.ontology.SimulationResource;
\r
23 import org.simantics.structural.stubs.StructuralResource2;
\r
25 public class StructuralRVIResolver extends StandardRVIResolver {
\r
27 protected boolean isRVIBase(ReadGraph graph, Variable variable) throws DatabaseException {
\r
28 if (Variables.isContext(graph, variable)) return true;
\r
29 StructuralResource2 STR = StructuralResource2.getInstance(graph);
\r
30 Resource represents = variable.getRepresents(graph);
\r
31 if (represents == null) return false;
\r
32 if (graph.isInstanceOf(represents, STR.Composite)) return false;
\r
37 public RVI getRVI(ReadGraph graph, Variable variable) throws DatabaseException {
\r
38 if (Variables.isContext(graph, variable)) {
\r
39 Databoard databoard = graph.getService( Databoard.class );
\r
40 Binding rviBinding = databoard.getBindingUnchecked( RVI.class );
\r
41 return RVI.empty(rviBinding);
\r
43 Variable base = variable.getParent(graph);
\r
44 while(!isRVIBase(graph, base)) base = base.getParent(graph);
\r
45 RVIPart part = getRVIPart(graph, variable);
\r
46 return new RVIBuilder(base.getRVI(graph)).append(part).toRVI();
\r
49 protected boolean isPartOfComponentType(ReadGraph graph, Resource resource)
\r
50 throws DatabaseException {
\r
51 Layer0 L0 = Layer0.getInstance(graph);
\r
52 StructuralResource2 STR = StructuralResource2.getInstance(graph);
\r
53 Resource container = graph.getPossibleObject(resource, L0.PartOf);
\r
54 if(container != null && graph.isInstanceOf(container, STR.Composite)) {
\r
55 return graph.hasStatement(container, STR.Defines);
\r
60 protected Resource getBase(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {
\r
61 Layer0 L0 = Layer0.getInstance(graph);
\r
62 SimulationResource SIMU = SimulationResource.getInstance(graph);
\r
63 Resource represents = variable.getPossibleRepresents(graph);
\r
64 if(represents != null && graph.isInstanceOf(represents, SIMU.Run)) return Variables.getPossibleConfigurationContextResource(graph, represents);
\r
65 else if(isPartOfComponentType(graph, resource)) return graph.getPossibleObject(resource, L0.PartOf);
\r
69 protected Collection<Resource> getRVIPath(ReadGraph graph, Variable variable, Resource resource)
\r
70 throws DatabaseException {
\r
71 Resource base = getBase(graph, variable, resource);
\r
74 LinkedList<Resource> result = new LinkedList<Resource>();
\r
75 result.add(resource);
\r
76 Layer0 L0 = Layer0.getInstance(graph);
\r
77 resource = graph.getPossibleObject(resource, L0.PartOf);
\r
78 if(resource == null) return null;
\r
79 while(!base.equals(resource)) {
\r
80 result.addFirst(resource);
\r
81 resource = graph.getPossibleObject(resource, L0.PartOf);
\r
82 if(resource == null) return null;
\r
87 protected Collection<Resource> getRVIPath(ReadGraph graph, Variable variable, GuidRVIPart part)
\r
88 throws DatabaseException {
\r
90 if(part.resource != null) {
\r
91 return getRVIPath(graph, variable, part.resource);
\r
93 Resource indexRoot = variable.getIndexRoot(graph);
\r
94 Instances instances = graph.adapt(Layer0.getInstance(graph).Entity, Instances.class);
\r
95 GUID guid = new GUID(part.mostSignificant, part.leastSignificant);
\r
96 Collection<Resource> queryResult = instances.find(graph, indexRoot, "GUID:"+guid.indexString());
\r
97 if(queryResult.size() != 1) return null;
\r
98 return getRVIPath(graph, variable, queryResult.iterator().next());
\r
104 protected Variable resolveChild(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {
\r
105 Collection<Resource> path = getRVIPath(graph, variable, resource);
\r
106 if(path == null) throw new MissingVariableException("Didn't find a variable related to " + resource + ".", resource);
\r
107 for(Resource r : path) variable = variable.browse(graph, r);
\r
112 protected Variable resolveChild(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
\r
113 Collection<Resource> path = getRVIPath(graph, variable, part);
\r
114 if(path == null) throw new MissingVariableException("Didn't find a variable related to " + part + ".");
\r
115 for(Resource r : path) variable = variable.browse(graph, r);
\r