]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.acorn/src/org/simantics/acorn/internal/AcornDatabase.java
Improved logic in new head state creation.
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / internal / AcornDatabase.java
index db83f1395d005babeb09dbd500f5034d2326f503..a423fbdbe23b815871688fb17cb2c6fb165550f7 100644 (file)
@@ -2,16 +2,14 @@ package org.simantics.acorn.internal;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.channels.FileChannel;
+import java.io.RandomAccessFile;
 import java.nio.channels.FileLock;
 import java.nio.file.DirectoryStream;
-import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.FileVisitOption;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
-import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.EnumSet;
 import java.util.Properties;
@@ -41,7 +39,7 @@ public class AcornDatabase implements Database {
 
     private DatabaseUserAgent userAgent;
 
-    private FileChannel lockFileChannel;
+    private RandomAccessFile raLockFile;
 
     private FileLock lock;
 
@@ -119,19 +117,17 @@ public class AcornDatabase implements Database {
     @Override
     public synchronized void start() throws ProCoreException {
         try {
-            lockFileChannel = lockFile.getFileSystem().provider().newFileChannel(lockFile,
-                    EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.WRITE));
-
-            lock = lockFileChannel.tryLock();
+            raLockFile = new RandomAccessFile(lockFile.toFile(), "rw");
+            lock = raLockFile.getChannel().tryLock();
             if (lock == null) {
-                safeLoggingClose(lockFileChannel, lockFile);
+                safeLoggingClose(raLockFile, lockFile);
                 throw new ProCoreException("The database in folder " + folder.toAbsolutePath() + " is already in use!");
             }
-
             isRunning = true;
         } catch (IOException e) {
             LOGGER.error("Failed to start database at " + folder.toAbsolutePath(), e);
-            safeLoggingClose(lockFileChannel, lockFile);
+            safeLoggingClose(raLockFile, lockFile);
+            throw new ProCoreException("Failed to start database at " + folder.toAbsolutePath(), e);
         }
     }
 
@@ -147,8 +143,8 @@ public class AcornDatabase implements Database {
         try {
             safeLoggingClose(lock, lockFile);
             lock = null;
-            safeLoggingClose(lockFileChannel, lockFile);
-            lockFileChannel = null;
+            safeLoggingClose(raLockFile, lockFile);
+            raLockFile = null;
             Files.deleteIfExists(lockFile);
             isRunning = false;
         } catch (IOException e) {