--- /dev/null
+package org.simantics.db.layer0.request;\r
+\r
+import org.simantics.databoard.util.URIStringUtils;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.common.request.UnaryRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.StandardGraphChildVariable;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.request.ReadExt;\r
+import org.simantics.db.request.RequestFlags;\r
+\r
+public class ResourceURIToVariable extends UnaryRead<String, Variable> implements ReadExt {\r
+\r
+ public ResourceURIToVariable(String uri) {\r
+ super(uri);\r
+ }\r
+ \r
+ public static int split(String uri) {\r
+ int pos = uri.lastIndexOf(URIStringUtils.NAMESPACE_PATH_SEPARATOR);\r
+ int pos2 = uri.lastIndexOf(URIStringUtils.NAMESPACE_LOCAL_SEPARATOR);\r
+ return Math.max(pos, pos2);\r
+ }\r
+ \r
+ @Override\r
+ public Variable perform(ReadGraph graph) throws DatabaseException {\r
+ \r
+ if("http://".equals(parameter) || "http:/".equals(parameter)) {\r
+ return new StandardGraphChildVariable(null, null, graph.getRootLibrary());\r
+ } else {\r
+ int childPos = parameter.lastIndexOf(URIStringUtils.NAMESPACE_PATH_SEPARATOR);\r
+ int propertyPos = parameter.lastIndexOf(URIStringUtils.NAMESPACE_LOCAL_SEPARATOR);\r
+ if(childPos > propertyPos) {\r
+ Variable parent = graph.syncRequest(new ResourceURIToVariable(parameter.substring(0, childPos)));\r
+ return parent.getChild(graph, URIStringUtils.unescape(parameter.substring(childPos + 1, parameter.length())));\r
+ } else {\r
+ Variable parent = graph.syncRequest(new ResourceURIToVariable(parameter.substring(0, propertyPos)));\r
+ return parent.getProperty(graph, URIStringUtils.unescape(parameter.substring(propertyPos + 1, parameter.length())));\r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public boolean isImmutable(ReadGraph graph) throws DatabaseException {\r
+ return false;\r
+ }\r
+\r
+ @Override\r
+ public int getType() {\r
+ return RequestFlags.IMMEDIATE_UPDATE;\r
+ }\r
+\r
+}\r