]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.db.layer0.util;\r
2 \r
3 import java.util.Collection;\r
4 \r
5 import org.simantics.databoard.util.URIStringUtils;\r
6 import org.simantics.db.ReadGraph;\r
7 import org.simantics.db.Resource;\r
8 import org.simantics.db.Statement;\r
9 import org.simantics.db.common.request.FunctionalStatementMapOfResource;\r
10 import org.simantics.db.common.uri.UnescapedChildMapOfResource;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.layer0.Layer0;\r
13 import org.simantics.scl.runtime.tuple.Tuple2;\r
14 \r
15 public class ExtendedUris {\r
16 \r
17     public static Resource resolveAbsoluteUri(ReadGraph graph, String uri) throws DatabaseException {\r
18         if(!uri.startsWith("http:/"))\r
19             throw new IllegalArgumentException("Invalid absolute URI '" + uri + "'.");\r
20         return resolveRelativeUri(graph, graph.getRootLibrary(), uri.substring(6));\r
21     }\r
22 \r
23     public static Resource resolveRelativeUri(ReadGraph graph, Resource parent, String uri) throws DatabaseException {\r
24         int beginPos = 0;\r
25         while(beginPos < uri.length()) {\r
26             int endPos;\r
27             for(endPos = beginPos+1; endPos < uri.length(); ++endPos) {\r
28                 char c = uri.charAt(endPos);\r
29                 if(c == '/' || c == '#')\r
30                     break;\r
31             }\r
32 \r
33             char c = uri.charAt(beginPos);\r
34             if(c == '/') {\r
35                 String escapedName = uri.substring(beginPos+1, endPos);\r
36                 String name = URIStringUtils.unescape(escapedName);\r
37                 parent = graph.syncRequest(new UnescapedChildMapOfResource(parent)).get(name);\r
38                 if(parent == null)\r
39                     throw new DatabaseException("Didn't find a child " + name);\r
40             }\r
41             else if(c == '#') {\r
42                 String escapedName = uri.substring(beginPos+1, endPos);\r
43                 String name = URIStringUtils.unescape(escapedName);\r
44                 parent = graph.syncRequest(new FunctionalStatementMapOfResource(parent)).get(name);\r
45                 if(parent == null)\r
46                     throw new DatabaseException("Didn't find a property " + name);\r
47             }\r
48             else\r
49                 throw new IllegalArgumentException("Invalid relative URI '" + uri + "'.");\r
50             beginPos = endPos;\r
51         }\r
52         return parent;\r
53     }\r
54     \r
55     private static boolean initialized = false;\r
56     private static Resource ElementToComponent;\r
57     private static void initialize(ReadGraph graph) throws DatabaseException {\r
58         ElementToComponent = graph.getResource("http://www.simantics.org/Modeling-1.2/ElementToComponent");\r
59         initialized = true;\r
60     }\r
61     \r
62     public static Tuple2 getPrimaryFunctionalReference(ReadGraph graph, Resource r) throws DatabaseException {\r
63         if(!initialized)\r
64             initialize(graph);\r
65         Statement stat = graph.getPossibleStatement(r, ElementToComponent);\r
66         if(stat != null)\r
67             return statementToResult(graph, stat);\r
68         return null;\r
69     }\r
70     \r
71     public static Tuple2 getSecondaryFunctionalReference(ReadGraph graph, Resource r) throws DatabaseException {\r
72         Layer0 L0 = Layer0.getInstance(graph);\r
73         Collection<Statement> statements = graph.getStatements(r, L0.PropertyOf);\r
74         if(statements.size() == 1) \r
75             for(Statement stat : statements)\r
76                 return statementToResult(graph, stat);\r
77         return null;\r
78     }\r
79     \r
80     private static Tuple2 statementToResult(ReadGraph graph, Statement stat) throws DatabaseException {\r
81         return new Tuple2(stat.getObject(), graph.getInverse(stat.getPredicate()));\r
82     }\r
83 \r
84 }\r