]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java
new file mode 100644 (file)
index 0000000..2836b67
--- /dev/null
@@ -0,0 +1,111 @@
+package org.simantics.fileimport;\r
+\r
+import java.nio.file.Path;\r
+import java.util.Collection;\r
+import java.util.Optional;\r
+\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.ObjectsWithType;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.RuntimeDatabaseException;\r
+import org.simantics.db.layer0.util.RemoverUtil;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.db.service.SerialisationSupport;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public abstract class SimanticsResourceFileImport implements IGenericFileImport {\r
+\r
+    @Override\r
+    final public Optional<String> perform(Path file) throws Exception {\r
+        \r
+        Path dropins = Activator.getDropinsFolder();    \r
+        Path parts = dropins.relativize(file);\r
+        Resource parent = resolveParent(null, parts);\r
+        if (parent == null)\r
+            return Optional.empty();\r
+        Optional<Resource> imported = perform(parent, file); \r
+        if (imported.isPresent()) {\r
+            return Optional.of(serialize(imported.get()));\r
+        } else {\r
+            return Optional.empty();\r
+        }\r
+    }\r
+    \r
+    public abstract Optional<Resource> perform(Resource parent, Path file);\r
+    \r
+    @Override\r
+    public void remove(String resourceId) throws Exception {\r
+        Optional<Resource> resource = deserialize(resourceId);\r
+        resource.ifPresent(res -> {\r
+            try {\r
+                Simantics.sync(new WriteRequest() {\r
+\r
+                    @Override\r
+                    public void perform(WriteGraph graph) throws DatabaseException {\r
+                        RemoverUtil.remove(graph, resource.get());\r
+                    }\r
+                });\r
+            } catch (Exception e) {\r
+                throw new RuntimeDatabaseException(e);\r
+            }\r
+        });\r
+    }\r
+\r
+    public String serialize(Resource resource) {\r
+        return Long.toString(resource.getResourceId());\r
+    }\r
+\r
+    public Optional<Resource> deserialize(String serialized) throws Exception {\r
+        long resourceId = Long.valueOf(serialized);\r
+\r
+        Resource resource = Simantics.getSession().syncRequest(new Read<Resource>() {\r
+\r
+            @Override\r
+            public Resource perform(ReadGraph graph) throws DatabaseException {\r
+                SerialisationSupport support = graph.getService(SerialisationSupport.class);\r
+                Resource resource = support.getResource(resourceId);\r
+                return resource;\r
+            }\r
+        });\r
+        return Optional.ofNullable(resource);\r
+    }\r
+    \r
+    private static Resource resolveParent(Resource parent, Path name) {\r
+        if (name.getParent() == null) {\r
+            return Simantics.getProjectResource();\r
+        } else {\r
+            name = name.getParent();\r
+            parent = resolveParent(parent, name);\r
+        }\r
+        final Resource newParent = parent;\r
+        final String folderName = name.getFileName().toString();\r
+\r
+        try {\r
+            return Simantics.getSession().syncRequest(new UniqueRead<Resource>() {\r
+\r
+                @Override\r
+                public Resource perform(ReadGraph graph) throws DatabaseException {\r
+                    Layer0 L0 = Layer0.getInstance(graph);\r
+                    Collection<Resource> libraries = graph.sync(new ObjectsWithType(newParent, L0.ConsistsOf, L0.Library));\r
+                    for (Resource library : libraries) {\r
+                        String libraryName = graph.getRelatedValue2(library, L0.HasName, Bindings.STRING);\r
+                        if (libraryName.equals(folderName)) {\r
+                            return library;\r
+                        }\r
+                    }\r
+                    return null;\r
+                }\r
+            });\r
+        } catch (DatabaseException e) {\r
+            e.printStackTrace();\r
+            return null;\r
+        }\r
+    }\r
+\r
+}\r