1 package org.simantics.db.layer0.util;
\r
3 import java.util.Collection;
\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
15 public class ExtendedUris {
\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
23 public static Resource resolveRelativeUri(ReadGraph graph, Resource parent, String uri) throws DatabaseException {
\r
25 while(beginPos < uri.length()) {
\r
27 for(endPos = beginPos+1; endPos < uri.length(); ++endPos) {
\r
28 char c = uri.charAt(endPos);
\r
29 if(c == '/' || c == '#')
\r
33 char c = uri.charAt(beginPos);
\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
39 throw new DatabaseException("Didn't find a child " + name);
\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
46 throw new DatabaseException("Didn't find a property " + name);
\r
49 throw new IllegalArgumentException("Invalid relative URI '" + uri + "'.");
\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
62 public static Tuple2 getPrimaryFunctionalReference(ReadGraph graph, Resource r) throws DatabaseException {
\r
65 Statement stat = graph.getPossibleStatement(r, ElementToComponent);
\r
67 return statementToResult(graph, stat);
\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
80 private static Tuple2 statementToResult(ReadGraph graph, Statement stat) throws DatabaseException {
\r
81 return new Tuple2(stat.getObject(), graph.getInverse(stat.getPredicate()));
\r