]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java
Sync git svn branch with SVN repository r33144.
[simantics/platform.git] / bundles / org.simantics.fileimport / src / org / simantics / fileimport / SimanticsResourceFileImport.java
1 package org.simantics.fileimport;\r
2 \r
3 import java.nio.file.Path;\r
4 import java.util.Collection;\r
5 import java.util.Optional;\r
6 \r
7 import org.simantics.Simantics;\r
8 import org.simantics.databoard.Bindings;\r
9 import org.simantics.db.ReadGraph;\r
10 import org.simantics.db.Resource;\r
11 import org.simantics.db.WriteGraph;\r
12 import org.simantics.db.common.request.ObjectsWithType;\r
13 import org.simantics.db.common.request.UniqueRead;\r
14 import org.simantics.db.common.request.WriteRequest;\r
15 import org.simantics.db.exception.DatabaseException;\r
16 import org.simantics.db.exception.RuntimeDatabaseException;\r
17 import org.simantics.db.layer0.util.RemoverUtil;\r
18 import org.simantics.db.request.Read;\r
19 import org.simantics.db.service.SerialisationSupport;\r
20 import org.simantics.layer0.Layer0;\r
21 \r
22 public abstract class SimanticsResourceFileImport implements IGenericFileImport {\r
23 \r
24     @Override\r
25     final public Optional<String> perform(Path file) throws Exception {\r
26         \r
27         Path dropins = Activator.getDropinsFolder();    \r
28         Path parts = dropins.relativize(file);\r
29         Resource parent = resolveParent(null, parts);\r
30         if (parent == null)\r
31             return Optional.empty();\r
32         Optional<Resource> imported = perform(parent, file); \r
33         if (imported.isPresent()) {\r
34             return Optional.of(serialize(imported.get()));\r
35         } else {\r
36             return Optional.empty();\r
37         }\r
38     }\r
39     \r
40     public abstract Optional<Resource> perform(Resource parent, Path file);\r
41     \r
42     @Override\r
43     public void remove(String resourceId) throws Exception {\r
44         Optional<Resource> resource = deserialize(resourceId);\r
45         resource.ifPresent(res -> {\r
46             try {\r
47                 Simantics.sync(new WriteRequest() {\r
48 \r
49                     @Override\r
50                     public void perform(WriteGraph graph) throws DatabaseException {\r
51                         RemoverUtil.remove(graph, resource.get());\r
52                     }\r
53                 });\r
54             } catch (Exception e) {\r
55                 throw new RuntimeDatabaseException(e);\r
56             }\r
57         });\r
58     }\r
59 \r
60     public String serialize(Resource resource) {\r
61         return Long.toString(resource.getResourceId());\r
62     }\r
63 \r
64     public Optional<Resource> deserialize(String serialized) throws Exception {\r
65         long resourceId = Long.valueOf(serialized);\r
66 \r
67         Resource resource = Simantics.getSession().syncRequest(new Read<Resource>() {\r
68 \r
69             @Override\r
70             public Resource perform(ReadGraph graph) throws DatabaseException {\r
71                 SerialisationSupport support = graph.getService(SerialisationSupport.class);\r
72                 Resource resource = support.getResource(resourceId);\r
73                 return resource;\r
74             }\r
75         });\r
76         return Optional.ofNullable(resource);\r
77     }\r
78     \r
79     private static Resource resolveParent(Resource parent, Path name) {\r
80         if (name.getParent() == null) {\r
81             return Simantics.getProjectResource();\r
82         } else {\r
83             name = name.getParent();\r
84             parent = resolveParent(parent, name);\r
85         }\r
86         final Resource newParent = parent;\r
87         final String folderName = name.getFileName().toString();\r
88 \r
89         try {\r
90             return Simantics.getSession().syncRequest(new UniqueRead<Resource>() {\r
91 \r
92                 @Override\r
93                 public Resource perform(ReadGraph graph) throws DatabaseException {\r
94                     Layer0 L0 = Layer0.getInstance(graph);\r
95                     Collection<Resource> libraries = graph.sync(new ObjectsWithType(newParent, L0.ConsistsOf, L0.Library));\r
96                     for (Resource library : libraries) {\r
97                         String libraryName = graph.getRelatedValue2(library, L0.HasName, Bindings.STRING);\r
98                         if (libraryName.equals(folderName)) {\r
99                             return library;\r
100                         }\r
101                     }\r
102                     return null;\r
103                 }\r
104             });\r
105         } catch (DatabaseException e) {\r
106             e.printStackTrace();\r
107             return null;\r
108         }\r
109     }\r
110 \r
111 }\r