]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExtendedUris.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / ExtendedUris.java
diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExtendedUris.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExtendedUris.java
new file mode 100644 (file)
index 0000000..2070c49
--- /dev/null
@@ -0,0 +1,84 @@
+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