--- /dev/null
+package org.simantics.db.layer0.util;\r
+\r
+import java.util.Collection;\r
+\r
+import org.simantics.databoard.util.URIStringUtils;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.common.request.FunctionalStatementMapOfResource;\r
+import org.simantics.db.common.uri.UnescapedChildMapOfResource;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.scl.runtime.tuple.Tuple2;\r
+\r
+public class ExtendedUris {\r
+\r
+ public static Resource resolveAbsoluteUri(ReadGraph graph, String uri) throws DatabaseException {\r
+ if(!uri.startsWith("http:/"))\r
+ throw new IllegalArgumentException("Invalid absolute URI '" + uri + "'.");\r
+ return resolveRelativeUri(graph, graph.getRootLibrary(), uri.substring(6));\r
+ }\r
+\r
+ public static Resource resolveRelativeUri(ReadGraph graph, Resource parent, String uri) throws DatabaseException {\r
+ int beginPos = 0;\r
+ while(beginPos < uri.length()) {\r
+ int endPos;\r
+ for(endPos = beginPos+1; endPos < uri.length(); ++endPos) {\r
+ char c = uri.charAt(endPos);\r
+ if(c == '/' || c == '#')\r
+ break;\r
+ }\r
+\r
+ char c = uri.charAt(beginPos);\r
+ if(c == '/') {\r
+ String escapedName = uri.substring(beginPos+1, endPos);\r
+ String name = URIStringUtils.unescape(escapedName);\r
+ parent = graph.syncRequest(new UnescapedChildMapOfResource(parent)).get(name);\r
+ if(parent == null)\r
+ throw new DatabaseException("Didn't find a child " + name);\r
+ }\r
+ else if(c == '#') {\r
+ String escapedName = uri.substring(beginPos+1, endPos);\r
+ String name = URIStringUtils.unescape(escapedName);\r
+ parent = graph.syncRequest(new FunctionalStatementMapOfResource(parent)).get(name);\r
+ if(parent == null)\r
+ throw new DatabaseException("Didn't find a property " + name);\r
+ }\r
+ else\r
+ throw new IllegalArgumentException("Invalid relative URI '" + uri + "'.");\r
+ beginPos = endPos;\r
+ }\r
+ return parent;\r
+ }\r
+ \r
+ private static boolean initialized = false;\r
+ private static Resource ElementToComponent;\r
+ private static void initialize(ReadGraph graph) throws DatabaseException {\r
+ ElementToComponent = graph.getResource("http://www.simantics.org/Modeling-1.2/ElementToComponent");\r
+ initialized = true;\r
+ }\r
+ \r
+ public static Tuple2 getPrimaryFunctionalReference(ReadGraph graph, Resource r) throws DatabaseException {\r
+ if(!initialized)\r
+ initialize(graph);\r
+ Statement stat = graph.getPossibleStatement(r, ElementToComponent);\r
+ if(stat != null)\r
+ return statementToResult(graph, stat);\r
+ return null;\r
+ }\r
+ \r
+ public static Tuple2 getSecondaryFunctionalReference(ReadGraph graph, Resource r) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Collection<Statement> statements = graph.getStatements(r, L0.PropertyOf);\r
+ if(statements.size() == 1) \r
+ for(Statement stat : statements)\r
+ return statementToResult(graph, stat);\r
+ return null;\r
+ }\r
+ \r
+ private static Tuple2 statementToResult(ReadGraph graph, Statement stat) throws DatabaseException {\r
+ return new Tuple2(stat.getObject(), graph.getInverse(stat.getPredicate()));\r
+ }\r
+\r
+}\r