]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/StandardRVIResolver.java
Merge commit 'ad8333027322fda6b9a8a524c7a7e15a54c52f38'
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / variable / StandardRVIResolver.java
1 package org.simantics.db.layer0.variable;\r
2 \r
3 import org.simantics.databoard.Bindings;\r
4 import org.simantics.databoard.Databoard;\r
5 import org.simantics.databoard.binding.Binding;\r
6 import org.simantics.datatypes.literal.GUID;\r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.db.layer0.exception.MissingVariableException;\r
11 import org.simantics.db.layer0.request.VariablePossibleRVIRequest;\r
12 import org.simantics.db.layer0.request.VariableRVIRequest;\r
13 import org.simantics.db.layer0.variable.RVI.GuidRVIPart;\r
14 import org.simantics.db.layer0.variable.RVI.RVIPart;\r
15 import org.simantics.db.layer0.variable.RVI.ResourceRVIPart;\r
16 import org.simantics.db.layer0.variable.RVI.StringRVIPart;\r
17 import org.simantics.db.layer0.variable.Variables.Role;\r
18 import org.simantics.layer0.Layer0;\r
19 \r
20 public class StandardRVIResolver implements RVIResolver {\r
21 \r
22     public static final StandardRVIResolver INSTANCE = new StandardRVIResolver();\r
23 \r
24     protected RVIPart getRVIPart(ReadGraph graph, Variable variable) throws DatabaseException {\r
25         if(variable instanceof AbstractVariable) {\r
26             AbstractVariable abst = (AbstractVariable)variable;\r
27             return abst.getRVIPart(graph);\r
28         }\r
29         Role role = variable.getRole(graph);\r
30         return new StringRVIPart(role, variable.getName(graph));\r
31     }\r
32     \r
33     @Override\r
34     public RVI getRVI(ReadGraph graph, Variable variable) throws DatabaseException {\r
35         Databoard databoard = graph.getService( Databoard.class );\r
36         Binding rviBinding = databoard.getBindingUnchecked( RVI.class );\r
37         if(Variables.isContext(graph, variable)) {\r
38             return RVI.empty( rviBinding );\r
39         } else {\r
40             Variable parent = variable.getParent(graph);\r
41             if (parent == null)\r
42                 // TODO: consider using a more suitable exception here to better convey the situation.\r
43                 throw new MissingVariableException("no parent for variable " + variable + " (URI=" + variable.getURI(graph) + ")");\r
44             RVI base = graph.syncRequest(new VariableRVIRequest(parent));\r
45             RVIPart part = getRVIPart(graph, variable);\r
46             return new RVIBuilder(base).append(part).toRVI();\r
47         }\r
48     }\r
49 \r
50     @Override\r
51     public RVI getPossibleRVI(ReadGraph graph, Variable variable) throws DatabaseException {\r
52         Databoard databoard = graph.getService( Databoard.class );\r
53         Binding rviBinding = databoard.getBindingUnchecked( RVI.class );\r
54         if(Variables.isContext(graph, variable)) {\r
55             return RVI.empty( rviBinding );\r
56         } else {\r
57             Variable parent = variable.getParent(graph);\r
58             if (parent == null) return null;\r
59             RVI base = graph.syncRequest(new VariablePossibleRVIRequest(parent));\r
60             if (base == null) return null;\r
61             RVIPart part = getRVIPart(graph, variable);\r
62             return new RVIBuilder(base).append(part).toRVI();\r
63         }\r
64     }\r
65 \r
66     protected Variable resolveChild(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {\r
67         String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);\r
68         return variable.getChild(graph, rName);\r
69     }\r
70     \r
71     protected Variable resolveProperty(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {\r
72         String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);\r
73         return variable.getProperty(graph, rName);\r
74     }\r
75     \r
76     protected Variable resolveChild(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
77         return resolveChildDefault(graph, variable, part);\r
78     }\r
79 \r
80     protected Variable resolveProperty(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
81         return resolvePropertyDefault(graph, variable, part);\r
82     }\r
83 \r
84     public static Variable resolveChildDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
85                 Layer0 L0 = Layer0.getInstance(graph);\r
86         for(Variable child : variable.getChildren(graph)) {\r
87                 GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);\r
88                 if(id != null) {\r
89                         if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)\r
90                                 return child;\r
91                 }\r
92         }\r
93         throw new DatabaseException("Could not resolve child " + part);\r
94     }\r
95 \r
96     public static Variable resolvePropertyDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
97                 Layer0 L0 = Layer0.getInstance(graph);\r
98         for(Variable child : variable.getProperties(graph)) {\r
99                 GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);\r
100                 if(id != null) {\r
101                         if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)\r
102                                 return child;\r
103                 }\r
104         }\r
105         throw new DatabaseException("Could not resolve property " + part);\r
106     }\r
107 \r
108     @Override\r
109     public Variable getVariable(ReadGraph graph, Variable context, RVIPart part) throws DatabaseException {\r
110         if(part instanceof StringRVIPart) {\r
111             StringRVIPart srp = (StringRVIPart)part;\r
112             if(Role.CHILD.equals(srp.getRole())) return context.getChild(graph, srp.string);\r
113             else if(Role.PROPERTY.equals(srp.getRole())) return context.getProperty(graph, srp.string);\r
114         } else if(part instanceof ResourceRVIPart) {\r
115             ResourceRVIPart rrp = (ResourceRVIPart)part;\r
116             if(Role.CHILD.equals(rrp.getRole())) return resolveChild(graph, context, rrp.resource);\r
117             else if(Role.PROPERTY.equals(rrp.getRole())) return resolveProperty(graph, context, rrp.resource);\r
118         } else if(part instanceof GuidRVIPart) {\r
119             GuidRVIPart grp = (GuidRVIPart)part;\r
120             if(Role.CHILD.equals(grp.getRole())) return resolveChild(graph, context, grp);\r
121             else if(Role.PROPERTY.equals(grp.getRole())) return resolveProperty(graph, context, grp);\r
122         }\r
123         throw new DatabaseException("Unrecognized RVIPart: " + part);\r
124     }\r
125 \r
126 }\r