1 package org.simantics.backup.db;
3 import java.nio.file.Path;
4 import java.util.concurrent.Callable;
5 import java.util.concurrent.Future;
6 import java.util.concurrent.FutureTask;
8 import org.simantics.backup.BackupException;
9 import org.simantics.backup.IBackupProvider;
10 import org.simantics.scl.runtime.function.Function1;
11 import org.simantics.scl.runtime.function.Function2;
12 import org.simantics.scl.runtime.tuple.Tuple0;
14 public class ModelledBackup implements IBackupProvider {
16 private final Function1<Tuple0, Object> lockFunc;
17 private final Function2<String, Integer, Function1<Tuple0, String>> backupFunc;
18 private final Function1<Tuple0, Object> unlockFunc;
19 private final Function2<String, Integer, Object> restoreFunc;
21 private ModelledBackup(
22 Function1<Tuple0, Object> lockFunc,
23 Function2<String, Integer, Function1<Tuple0, String>> backupFunc,
24 Function1<Tuple0, Object> unlockFunc,
25 Function2<String, Integer, Object> restoreFunc) {
26 this.lockFunc = lockFunc;
27 this.backupFunc = backupFunc;
28 this.unlockFunc = unlockFunc;
29 this.restoreFunc = restoreFunc;
34 lockFunc.apply(Tuple0.INSTANCE);
38 public Future<BackupException> backup(Path targetPath, int revision) {
40 final Function1<Tuple0, String> fn = backupFunc.apply(targetPath.toString(), revision);
42 final FutureTask<BackupException> futureTask = new FutureTask<BackupException>(new Callable<BackupException>() {
44 public BackupException call() throws Exception {
46 String error = fn.apply(Tuple0.INSTANCE);
48 return new BackupException(error);
52 } catch (Throwable t) {
53 return new BackupException(t);
58 Thread thread = new Thread(futureTask, "Backup Provider Thread " + backupFunc.toString());
65 public void unlock() {
66 unlockFunc.apply(Tuple0.INSTANCE);
70 public void restore(Path fromPath, int revision) {
71 restoreFunc.apply(fromPath.toString(), revision);
74 public static IBackupProvider modelledBackup(
75 Function1<Tuple0, Object> lockFunc,
76 Function2<String, Integer, Function1<Tuple0, String>> backupFunc,
77 Function1<Tuple0, Object> unlockFunc,
78 Function2<String, Integer, Object> restoreFunc) {
80 return new ModelledBackup(lockFunc, backupFunc, unlockFunc, restoreFunc);