]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.structural2/src/org/simantics/structural2/StructuralRVIResolver.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / StructuralRVIResolver.java
1 package org.simantics.structural2;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.LinkedList;\r
5 \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
24 \r
25 public class StructuralRVIResolver extends StandardRVIResolver {\r
26 \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
33         return true;\r
34     }\r
35     \r
36     @Override\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
42         }\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
47     }\r
48 \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
56         }\r
57         return false;\r
58     }\r
59 \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
66         return represents;\r
67     }\r
68 \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
72         if (base == null)\r
73             return null;\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
83         }\r
84         return result;\r
85     }\r
86     \r
87     protected Collection<Resource> getRVIPath(ReadGraph graph, Variable variable, GuidRVIPart part)\r
88             throws DatabaseException {\r
89 \r
90         if(part.resource != null) {\r
91                 return getRVIPath(graph, variable, part.resource);\r
92         } else {\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
99         }\r
100         \r
101     }\r
102 \r
103     @Override\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
108         return variable;\r
109     }\r
110     \r
111     @Override\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
116         return variable;\r
117     }\r
118 \r
119 }\r