]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/RelativeReference.java
Sync git svn branch with SVN repository r33158.
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / RelativeReference.java
1 package org.simantics.db.layer0.util;\r
2 \r
3 import java.util.ArrayList;\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.common.uri.UnescapedChildMapOfResource;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.layer0.Layer0;\r
11 \r
12 public class RelativeReference {\r
13     public final Resource base;\r
14     public final String path;\r
15     \r
16     public RelativeReference(Resource base, String path) {\r
17         this.base = base;\r
18         this.path = path;\r
19     }\r
20     \r
21     public Resource resolve(ReadGraph graph) throws DatabaseException {\r
22         return resolve(graph, base, path);\r
23     }\r
24 \r
25     public static Resource resolve(ReadGraph graph, \r
26             Resource base, \r
27             String path) throws DatabaseException {\r
28         String[] splitPath = path.split("/");\r
29         for(String name : splitPath) {            \r
30             base = graph.syncRequest(new UnescapedChildMapOfResource(base)).get(\r
31                     URIStringUtils.unescape(name)\r
32                     );\r
33             if(base == null)\r
34                 return null;                    \r
35         }\r
36         return base;\r
37     }\r
38     \r
39     public static RelativeReference createReference(ReadGraph graph, Resource baseType, Resource resource) throws DatabaseException {\r
40         ArrayList<String> path = new ArrayList<String>();\r
41         Layer0 L0 = Layer0.getInstance(graph);\r
42         try {\r
43             while(!graph.isInstanceOf(resource, baseType)) {\r
44                 path.add((String)graph.getRelatedValue(resource, L0.HasName));\r
45                 resource = graph.getSingleObject(resource, L0.PartOf);\r
46             }\r
47         } catch(DatabaseException e) {\r
48             return null;\r
49         }\r
50         StringBuilder b = new StringBuilder();\r
51         for(int i=path.size()-1;i>=0;--i) {\r
52             b.append(URIStringUtils.escape(path.get(i)));\r
53             if(i > 0)\r
54                 b.append('/');\r
55         }\r
56         return new RelativeReference(resource, b.toString());\r
57     }\r
58 }\r