1 package org.simantics.backup.db;
\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
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
14 public class ModelledBackup implements IBackupProvider {
\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
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
33 public void lock() {
\r
34 lockFunc.apply(Tuple0.INSTANCE);
\r
38 public Future<BackupException> backup(Path targetPath, int revision) {
\r
40 final Function1<Tuple0, String> fn = backupFunc.apply(targetPath.toString(), revision);
\r
42 final FutureTask<BackupException> futureTask = new FutureTask<BackupException>(new Callable<BackupException>() {
\r
44 public BackupException call() throws Exception {
\r
46 String error = fn.apply(Tuple0.INSTANCE);
\r
47 if (error != null) {
\r
48 return new BackupException(error);
\r
52 } catch (Throwable t) {
\r
53 return new BackupException(t);
\r
58 Thread thread = new Thread(futureTask, "Backup Provider Thread " + backupFunc.toString());
\r
65 public void unlock() {
\r
66 unlockFunc.apply(Tuple0.INSTANCE);
\r
70 public void restore(Path fromPath, int revision) {
\r
71 restoreFunc.apply(fromPath.toString(), revision);
\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
80 return new ModelledBackup(lockFunc, backupFunc, unlockFunc, restoreFunc);
\r