-package org.simantics.db.layer0.variable;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.Databoard;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.datatypes.literal.GUID;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.exception.MissingVariableException;\r
-import org.simantics.db.layer0.request.VariablePossibleRVIRequest;\r
-import org.simantics.db.layer0.request.VariableRVIRequest;\r
-import org.simantics.db.layer0.variable.RVI.GuidRVIPart;\r
-import org.simantics.db.layer0.variable.RVI.RVIPart;\r
-import org.simantics.db.layer0.variable.RVI.ResourceRVIPart;\r
-import org.simantics.db.layer0.variable.RVI.StringRVIPart;\r
-import org.simantics.db.layer0.variable.Variables.Role;\r
-import org.simantics.layer0.Layer0;\r
-\r
-public class StandardRVIResolver implements RVIResolver {\r
-\r
- public static final StandardRVIResolver INSTANCE = new StandardRVIResolver();\r
-\r
- protected RVIPart getRVIPart(ReadGraph graph, Variable variable) throws DatabaseException {\r
- if(variable instanceof AbstractVariable) {\r
- AbstractVariable abst = (AbstractVariable)variable;\r
- return abst.getRVIPart(graph);\r
- }\r
- Role role = variable.getRole(graph);\r
- return new StringRVIPart(role, variable.getName(graph));\r
- }\r
- \r
- @Override\r
- public RVI getRVI(ReadGraph graph, Variable variable) throws DatabaseException {\r
- Databoard databoard = graph.getService( Databoard.class );\r
- Binding rviBinding = databoard.getBindingUnchecked( RVI.class );\r
- if(Variables.isContext(graph, variable)) {\r
- return RVI.empty( rviBinding );\r
- } else {\r
- Variable parent = variable.getParent(graph);\r
- if (parent == null)\r
- // TODO: consider using a more suitable exception here to better convey the situation.\r
- throw new MissingVariableException("no parent for variable " + variable + " (URI=" + variable.getURI(graph) + ")");\r
- RVI base = graph.syncRequest(new VariableRVIRequest(parent));\r
- RVIPart part = getRVIPart(graph, variable);\r
- return new RVIBuilder(base).append(part).toRVI();\r
- }\r
- }\r
-\r
- @Override\r
- public RVI getPossibleRVI(ReadGraph graph, Variable variable) throws DatabaseException {\r
- Databoard databoard = graph.getService( Databoard.class );\r
- Binding rviBinding = databoard.getBindingUnchecked( RVI.class );\r
- if(Variables.isContext(graph, variable)) {\r
- return RVI.empty( rviBinding );\r
- } else {\r
- Variable parent = variable.getParent(graph);\r
- if (parent == null) return null;\r
- RVI base = graph.syncRequest(new VariablePossibleRVIRequest(parent));\r
- if (base == null) return null;\r
- RVIPart part = getRVIPart(graph, variable);\r
- return new RVIBuilder(base).append(part).toRVI();\r
- }\r
- }\r
-\r
- protected Variable resolveChild(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {\r
- String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);\r
- return variable.getChild(graph, rName);\r
- }\r
- \r
- protected Variable resolveProperty(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {\r
- String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);\r
- return variable.getProperty(graph, rName);\r
- }\r
- \r
- protected Variable resolveChild(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
- return resolveChildDefault(graph, variable, part);\r
- }\r
-\r
- protected Variable resolveProperty(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
- return resolvePropertyDefault(graph, variable, part);\r
- }\r
-\r
- public static Variable resolveChildDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- for(Variable child : variable.getChildren(graph)) {\r
- GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);\r
- if(id != null) {\r
- if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)\r
- return child;\r
- }\r
- }\r
- throw new DatabaseException("Could not resolve child " + part);\r
- }\r
-\r
- public static Variable resolvePropertyDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- for(Variable child : variable.getProperties(graph)) {\r
- GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);\r
- if(id != null) {\r
- if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)\r
- return child;\r
- }\r
- }\r
- throw new DatabaseException("Could not resolve property " + part);\r
- }\r
-\r
- @Override\r
- public Variable getVariable(ReadGraph graph, Variable context, RVIPart part) throws DatabaseException {\r
- if(part instanceof StringRVIPart) {\r
- StringRVIPart srp = (StringRVIPart)part;\r
- if(Role.CHILD.equals(srp.getRole())) return context.getChild(graph, srp.string);\r
- else if(Role.PROPERTY.equals(srp.getRole())) return context.getProperty(graph, srp.string);\r
- } else if(part instanceof ResourceRVIPart) {\r
- ResourceRVIPart rrp = (ResourceRVIPart)part;\r
- if(Role.CHILD.equals(rrp.getRole())) return resolveChild(graph, context, rrp.resource);\r
- else if(Role.PROPERTY.equals(rrp.getRole())) return resolveProperty(graph, context, rrp.resource);\r
- } else if(part instanceof GuidRVIPart) {\r
- GuidRVIPart grp = (GuidRVIPart)part;\r
- if(Role.CHILD.equals(grp.getRole())) return resolveChild(graph, context, grp);\r
- else if(Role.PROPERTY.equals(grp.getRole())) return resolveProperty(graph, context, grp);\r
- }\r
- throw new DatabaseException("Unrecognized RVIPart: " + part);\r
- }\r
-\r
-}\r
+package org.simantics.db.layer0.variable;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.Databoard;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.datatypes.literal.GUID;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.exception.MissingVariableException;
+import org.simantics.db.layer0.request.VariablePossibleRVIRequest;
+import org.simantics.db.layer0.request.VariableRVIRequest;
+import org.simantics.db.layer0.variable.RVI.GuidRVIPart;
+import org.simantics.db.layer0.variable.RVI.RVIPart;
+import org.simantics.db.layer0.variable.RVI.ResourceRVIPart;
+import org.simantics.db.layer0.variable.RVI.StringRVIPart;
+import org.simantics.db.layer0.variable.Variables.Role;
+import org.simantics.layer0.Layer0;
+
+public class StandardRVIResolver implements RVIResolver {
+
+ public static final StandardRVIResolver INSTANCE = new StandardRVIResolver();
+
+ protected RVIPart getRVIPart(ReadGraph graph, Variable variable) throws DatabaseException {
+ if(variable instanceof AbstractVariable) {
+ AbstractVariable abst = (AbstractVariable)variable;
+ return abst.getRVIPart(graph);
+ }
+ Role role = variable.getRole(graph);
+ return new StringRVIPart(role, variable.getName(graph));
+ }
+
+ @Override
+ public RVI getRVI(ReadGraph graph, Variable variable) throws DatabaseException {
+ if(Variables.isContext(graph, variable)) {
+ Databoard databoard = graph.getService( Databoard.class );
+ Binding rviBinding = databoard.getBindingUnchecked( RVI.class );
+ return RVI.empty( rviBinding );
+ } else {
+ Variable parent = variable.getParent(graph);
+ if (parent == null)
+ // TODO: consider using a more suitable exception here to better convey the situation.
+ throw new MissingVariableException("no parent for variable " + variable + " (URI=" + variable.getURI(graph) + ")");
+ RVI base = graph.syncRequest(new VariableRVIRequest(parent));
+ RVIPart part = getRVIPart(graph, variable);
+ return new RVIBuilder(base).append(part).toRVI();
+ }
+ }
+
+ @Override
+ public RVI getPossibleRVI(ReadGraph graph, Variable variable) throws DatabaseException {
+ if(Variables.isContext(graph, variable)) {
+ Databoard databoard = graph.getService( Databoard.class );
+ Binding rviBinding = databoard.getBindingUnchecked( RVI.class );
+ return RVI.empty( rviBinding );
+ } else {
+ Variable parent = variable.getParent(graph);
+ if (parent == null) return null;
+ RVI base = graph.syncRequest(new VariablePossibleRVIRequest(parent));
+ if (base == null) return null;
+ RVIPart part = getRVIPart(graph, variable);
+ return new RVIBuilder(base).append(part).toRVI();
+ }
+ }
+
+ protected Variable resolveChild(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {
+ String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);
+ return variable.getChild(graph, rName);
+ }
+
+ protected Variable resolveProperty(ReadGraph graph, Variable variable, Resource resource) throws DatabaseException {
+ String rName = graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName, Bindings.STRING);
+ return variable.getProperty(graph, rName);
+ }
+
+ protected Variable resolveChild(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
+ return resolveChildDefault(graph, variable, part);
+ }
+
+ protected Variable resolveProperty(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
+ return resolvePropertyDefault(graph, variable, part);
+ }
+
+ public static Variable resolveChildDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ for(Variable child : variable.getChildren(graph)) {
+ GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);
+ if(id != null) {
+ if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)
+ return child;
+ }
+ }
+ throw new DatabaseException("Could not resolve child " + part);
+ }
+
+ public static Variable resolvePropertyDefault(ReadGraph graph, Variable variable, GuidRVIPart part) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ for(Variable child : variable.getProperties(graph)) {
+ GUID id = child.getPossiblePropertyValue(graph, L0.identifier, GUID.BINDING);
+ if(id != null) {
+ if(id.mostSignificant == part.mostSignificant && id.leastSignificant == part.leastSignificant)
+ return child;
+ }
+ }
+ throw new DatabaseException("Could not resolve property " + part);
+ }
+
+ @Override
+ public Variable getVariable(ReadGraph graph, Variable context, RVIPart part) throws DatabaseException {
+ if(part instanceof StringRVIPart) {
+ StringRVIPart srp = (StringRVIPart)part;
+ if(Role.CHILD.equals(srp.getRole())) return context.getChild(graph, srp.string);
+ else if(Role.PROPERTY.equals(srp.getRole())) return context.getProperty(graph, srp.string);
+ } else if(part instanceof ResourceRVIPart) {
+ ResourceRVIPart rrp = (ResourceRVIPart)part;
+ if(Role.CHILD.equals(rrp.getRole())) return resolveChild(graph, context, rrp.resource);
+ else if(Role.PROPERTY.equals(rrp.getRole())) return resolveProperty(graph, context, rrp.resource);
+ } else if(part instanceof GuidRVIPart) {
+ GuidRVIPart grp = (GuidRVIPart)part;
+ if(Role.CHILD.equals(grp.getRole())) return resolveChild(graph, context, grp);
+ else if(Role.PROPERTY.equals(grp.getRole())) return resolveProperty(graph, context, grp);
+ }
+ throw new DatabaseException("Unrecognized RVIPart: " + part);
+ }
+
+}