]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graphfile/src/org/simantics/graphfile/util/GraphFileUtil.java
Merge commit '0b471805f017da83d715a0d8409f53bdd009d31e'
[simantics/platform.git] / bundles / org.simantics.graphfile / src / org / simantics / graphfile / util / GraphFileUtil.java
index d106f474663d0de50b2fbef0916238f1da162d81..9fdbf62c7b5ba4c96c5ce2d5fc5781de000496b6 100644 (file)
  *******************************************************************************/\r
 package org.simantics.graphfile.util;\r
 \r
+import java.io.ByteArrayInputStream;\r
 import java.io.File;\r
 import java.io.FileInputStream;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
+import java.io.InputStream;\r
 import java.nio.ByteBuffer;\r
 import java.nio.channels.FileChannel;\r
+import java.nio.file.Path;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
@@ -29,6 +32,7 @@ import org.simantics.db.Resource;
 import org.simantics.db.WriteGraph;\r
 import org.simantics.db.common.request.ReadRequest;\r
 import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.request.WriteResultRequest;\r
 import org.simantics.db.common.utils.LiteralFileUtil;\r
 import org.simantics.db.exception.DatabaseException;\r
 import org.simantics.db.exception.DoesNotContainValueException;\r
@@ -237,11 +241,25 @@ public class GraphFileUtil {
                \r
        }\r
        \r
-       public static void writeDataToGraph(WriteGraph graph, byte data[], Resource graphFile) throws IOException, ManyObjectsForFunctionalRelationException, ServiceException {\r
-               \r
+       public static void writeDataToGraph(WriteGraph graph, byte data[], Resource graphFile) throws IOException, DatabaseException {\r
                GraphFileResource gf = GraphFileResource.getInstance(graph);\r
-               graph.claimLiteral(graphFile, gf.HasFiledata, data);\r
-               graph.claimLiteral(graphFile, gf.LastModified, 0L);\r
+               if (USE_RANDOM_ACCESS_BINARY) {\r
+                       Resource fileData = graph.getPossibleObject(graphFile, gf.HasFiledata);\r
+                       if (fileData == null) {\r
+                               Layer0 l0 = Layer0.getInstance(graph);\r
+                               ClusteringSupport cs = graph.getService(ClusteringSupport.class);\r
+                               fileData = graph.newResource(cs.createCluster());\r
+                               graph.claim(fileData, l0.InstanceOf, l0.ByteArray);\r
+                               graph.claim(graphFile, gf.HasFiledata, fileData);\r
+                               graph.createRandomAccessBinary(fileData, Bindings.BYTE_ARRAY.type(), data);\r
+                       } else {\r
+                               InputStream input = new ByteArrayInputStream(data);\r
+                               LiteralFileUtil.copyStreamToRandomAccessBinary(graph, input, fileData);\r
+                       }\r
+               } else {\r
+                       graph.claimLiteral(graphFile, gf.HasFiledata, data);\r
+               }\r
+               graph.claimLiteral(graphFile, gf.LastModified, System.currentTimeMillis());\r
        }\r
        \r
        /**\r
@@ -540,4 +558,22 @@ public class GraphFileUtil {
                        }\r
                }\r
        }\r
+\r
+    public static Resource createFileReference(final Resource parent, final Path path) throws DatabaseException {\r
+        return Simantics.getSession().syncRequest(new WriteResultRequest<Resource>() {\r
+\r
+            @Override\r
+            public Resource perform(WriteGraph graph) throws DatabaseException {\r
+                Layer0 L0 = Layer0.getInstance(graph);\r
+                GraphFileResource GF = GraphFileResource.getInstance(graph);\r
+                Resource file = graph.newResource();\r
+                graph.claim(file, L0.PartOf, parent);\r
+                graph.claim(file, L0.InstanceOf, GF.File);\r
+                String name = path.getFileName().toString();\r
+                graph.claimLiteral(file, L0.HasName, name, Bindings.STRING);\r
+                graph.claimLiteral(file, GF.SystemPath, path.toAbsolutePath().toString(), Bindings.STRING);\r
+                return file;\r
+            }\r
+        });\r
+    }\r
 }\r