1 package org.simantics.db.layer0.variable;
\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
20 public class StandardRVIResolver implements RVIResolver {
\r
22 public static final StandardRVIResolver INSTANCE = new StandardRVIResolver();
\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
29 Role role = variable.getRole(graph);
\r
30 return new StringRVIPart(role, variable.getName(graph));
\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
40 Variable parent = variable.getParent(graph);
\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
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
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
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
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
76 protected Variable resolveChild(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
\r
77 return resolveChildDefault(graph, variable, part);
\r
80 protected Variable resolveProperty(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
\r
81 return resolvePropertyDefault(graph, variable, part);
\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
89 if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)
\r
93 throw new DatabaseException("Could not resolve child " + part);
\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
101 if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)
\r
105 throw new DatabaseException("Could not resolve property " + part);
\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
123 throw new DatabaseException("Unrecognized RVIPart: " + part);
\r