]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.fileimport/src/org/simantics/fileimport/scl/DropinsSCL.java
74d2a0322f45c426e0fffa1434e888641e69632c
[simantics/platform.git] / bundles / org.simantics.fileimport / src / org / simantics / fileimport / scl / DropinsSCL.java
1 package org.simantics.fileimport.scl;
2
3 import java.io.IOException;
4 import java.nio.file.DirectoryStream;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.Map;
10 import java.util.Optional;
11
12 import org.simantics.Simantics;
13 import org.simantics.databoard.util.Base64;
14 import org.simantics.db.ReadGraph;
15 import org.simantics.db.Resource;
16 import org.simantics.db.common.request.UniqueRead;
17 import org.simantics.db.exception.DatabaseException;
18 import org.simantics.db.service.SerialisationSupport;
19 import org.simantics.fileimport.Activator;
20 import org.simantics.fileimport.FileImportService;
21 import org.simantics.fileimport.dropins.FileImportDropins;
22 import org.simantics.layer0.Layer0;
23 import org.simantics.utils.FileUtils;
24
25 /**
26  * SCL interface for Simantics File Import Functionality
27  * See <code>"Dropins/Core"</code> SCL module for more
28  * 
29  * @author Jani Simomaa
30  *
31  */
32 public class DropinsSCL {
33
34     public static void watchDropinsFolder() {
35         FileImportDropins.watchDropinsFolder();
36     }
37
38     public static void unwatchDropinsFolder() {
39         FileImportDropins.unwatchDropinsFolder();
40     }
41
42     public static void uploadToDropinsBase64(String base64, String fileName) {
43         // ensure that watcher is awake
44         FileImportDropins.watchDropinsFolder();
45         try {
46             Path rootFolder = Activator.getDropinsFolder();
47             Path newFile = rootFolder.resolve(fileName);
48             if (Files.exists(newFile)) {
49                 newFile = findFreshFileName(rootFolder, fileName);
50             }
51             byte[] bytes = Base64.decode(base64);
52             FileUtils.writeFile(newFile.toFile(), bytes);
53         } catch (IOException e) {
54             e.printStackTrace();
55         }
56     }
57
58     private static Path findFreshFileName(Path root, String fileName) throws IOException {
59         int ending = fileName.lastIndexOf('.');
60         String glob = fileName;
61         String suffix = "";
62         if (ending > -1) {
63             glob = fileName.substring(0, ending);
64             suffix = fileName.substring(ending);
65         }
66         int i = 0;
67         try (DirectoryStream<Path> stream = Files.newDirectoryStream(root, glob)) {
68             Iterator<Path> iter = stream.iterator();
69             while (iter.hasNext()) {
70                 iter.next();
71                 i++;
72             }
73         }
74         String newFileName = glob + "_" + i + suffix;
75         return root.resolve(newFileName);
76     }
77
78     public static Map<String, Long> getUploadedFiles() throws DatabaseException {
79         Map<String, String> results = FileImportService.getPathsAndResources();
80         Map<String, Long> result = Simantics.getSession().syncRequest(new UniqueRead<Map<String, Long>>() {
81
82             @Override
83             public Map<String, Long> perform(ReadGraph graph) throws DatabaseException {
84                 Map<String, Long> map = new HashMap<>();
85                 for (Map.Entry<String, String> entry : results.entrySet()) {
86                     String value = (String) entry.getValue();
87                     Long id = Long.valueOf(value);
88                     SerialisationSupport ss = graph.getService(SerialisationSupport.class);
89                     try {
90                         Resource r = ss.getResource(id);
91                         String name = graph.getRelatedValue(r, Layer0.getInstance(graph).HasName);
92                         map.put(name, id);
93                     } catch (DatabaseException e) {
94                         e.printStackTrace();
95                     }
96                 }
97                 return map;
98             }
99         });
100         return result;
101     }
102
103     public static void removeFileForId(long id) {
104         FileImportService.removeFileForResource(id, Optional.empty());
105     }
106
107 }