]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.backup.db/src/org/simantics/backup/db/ModelledBackup.java
added backup.db and backup.ontology plugins
[simantics/platform.git] / bundles / org.simantics.backup.db / src / org / simantics / backup / db / ModelledBackup.java
1 package org.simantics.backup.db;\r
2 \r
3 import java.nio.file.Path;\r
4 import java.util.concurrent.Callable;\r
5 import java.util.concurrent.Future;\r
6 import java.util.concurrent.FutureTask;\r
7 \r
8 import org.simantics.backup.BackupException;\r
9 import org.simantics.backup.IBackupProvider;\r
10 import org.simantics.scl.runtime.function.Function1;\r
11 import org.simantics.scl.runtime.function.Function2;\r
12 import org.simantics.scl.runtime.tuple.Tuple0;\r
13 \r
14 public class ModelledBackup implements IBackupProvider {\r
15 \r
16     private final Function1<Tuple0, Object> lockFunc;\r
17     private final Function2<String, Integer, Function1<Tuple0, String>> backupFunc;\r
18     private final Function1<Tuple0, Object> unlockFunc;\r
19     private final Function2<String, Integer, Object> restoreFunc;\r
20 \r
21     private ModelledBackup(\r
22             Function1<Tuple0, Object> lockFunc,\r
23             Function2<String, Integer, Function1<Tuple0, String>> backupFunc,\r
24             Function1<Tuple0, Object> unlockFunc,\r
25             Function2<String, Integer, Object> restoreFunc) {\r
26         this.lockFunc = lockFunc;\r
27         this.backupFunc = backupFunc;\r
28         this.unlockFunc = unlockFunc;\r
29         this.restoreFunc = restoreFunc;\r
30     }\r
31 \r
32     @Override\r
33     public void lock() {\r
34         lockFunc.apply(Tuple0.INSTANCE);\r
35     }\r
36 \r
37     @Override\r
38     public Future<BackupException> backup(Path targetPath, int revision) {\r
39 \r
40         final Function1<Tuple0, String> fn = backupFunc.apply(targetPath.toString(), revision);\r
41         \r
42         final FutureTask<BackupException> futureTask = new FutureTask<BackupException>(new Callable<BackupException>() {\r
43                         @Override\r
44                         public BackupException call() throws Exception {\r
45                                 try {\r
46                                         String error = fn.apply(Tuple0.INSTANCE);\r
47                                         if (error != null) {\r
48                                                 return new BackupException(error);\r
49                                         } else {\r
50                                                 return null;\r
51                                         }\r
52                                 } catch (Throwable t) {\r
53                                         return new BackupException(t);\r
54                                 }\r
55                         }\r
56         });\r
57         \r
58         Thread thread = new Thread(futureTask, "Backup Provider Thread " + backupFunc.toString());\r
59         thread.start();\r
60 \r
61         return futureTask;\r
62     }\r
63 \r
64     @Override\r
65     public void unlock() {\r
66         unlockFunc.apply(Tuple0.INSTANCE);\r
67     }\r
68 \r
69     @Override\r
70     public void restore(Path fromPath, int revision) {\r
71         restoreFunc.apply(fromPath.toString(), revision);\r
72     }\r
73 \r
74     public static IBackupProvider modelledBackup(\r
75             Function1<Tuple0, Object> lockFunc,\r
76             Function2<String, Integer, Function1<Tuple0, String>> backupFunc,\r
77             Function1<Tuple0, Object> unlockFunc,\r
78             Function2<String, Integer, Object> restoreFunc) {\r
79 \r
80         return new ModelledBackup(lockFunc, backupFunc, unlockFunc, restoreFunc);\r
81     }\r
82 }\r