]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.acorn/src/org/simantics/acorn/HeadState.java
Merge branch 'feature/funcwrite'
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / HeadState.java
index c20d8e878a4eec04ebaa26ab892efa1790aea431..fd38bc98542052bbdb2e762c65d49a4cad4f3585 100644 (file)
@@ -1,7 +1,6 @@
 package org.simantics.acorn;
 
 import java.io.ByteArrayInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.file.Files;
@@ -11,13 +10,18 @@ import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import org.simantics.acorn.exception.InvalidHeadStateException;
 import org.simantics.databoard.Bindings;
+import org.simantics.databoard.adapter.AdapterConstructionException;
 import org.simantics.databoard.binding.mutable.MutableVariant;
 import org.simantics.databoard.serialization.Serializer;
 import org.simantics.databoard.util.binary.BinaryMemory;
 
 public class HeadState {
 
+    public static final String HEAD_STATE = "head.state";
+    public static final String SHA_1 = "SHA-1";
+    
     public int headChangeSetId = 0;
     public long transactionId = 1;
     public long reservedIds = 3;
@@ -28,12 +32,14 @@ public class HeadState {
     public ArrayList<String> cs = new ArrayList<>();
 //    public ArrayList<String> ccs = new ArrayList<String>();
 
+    public long tailChangeSetId = 1;
+
     public static HeadState load(Path directory) throws InvalidHeadStateException {
-        Path f = directory.resolve("head.state");
+        Path f = directory.resolve(HEAD_STATE);
         
         try {
             byte[] bytes = Files.readAllBytes(f);
-            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+            MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
             int digestLength = sha1.getDigestLength();
             
             sha1.update(bytes, digestLength, bytes.length - digestLength);
@@ -43,11 +49,16 @@ public class HeadState {
                         "Checksum " + Arrays.toString(newChecksum) + " does not match excpected "
                                 + Arrays.toString(Arrays.copyOfRange(bytes, 0, digestLength)) + " for " + f.toAbsolutePath());
             }
-            
-            HeadState object = (HeadState) org.simantics.databoard.Files.readFile(new ByteArrayInputStream(bytes, digestLength, bytes.length - digestLength), Bindings.getBindingUnchecked(HeadState.class));
-            return object;
-            
+            try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes, digestLength, bytes.length - digestLength)) {
+                HeadState object = (HeadState) org.simantics.databoard.Files.readFile(bais, Bindings.getBindingUnchecked(HeadState.class));
+                return object;
+            }
         } catch (IOException i) {
+               Throwable cause = i.getCause();
+               if(cause instanceof AdapterConstructionException) {
+                       HeadState1 old = HeadState1.load(directory);
+                       return old.migrate();
+               }
             return new HeadState();
 //            throw new InvalidHeadStateException(i);
         } catch (NoSuchAlgorithmException e) {
@@ -58,7 +69,7 @@ public class HeadState {
     }
     
     public void save(Path directory) throws IOException {
-        Path f = directory.resolve("head.state");
+        Path f = directory.resolve(HEAD_STATE);
         try {
             BinaryMemory rf = new BinaryMemory(4096);
             try {
@@ -71,7 +82,7 @@ public class HeadState {
             
             byte[] bytes = rf.toByteBuffer().array();
             
-            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+            MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
             sha1.update(bytes);
             byte[] checksum = sha1.digest();
             
@@ -88,7 +99,7 @@ public class HeadState {
     public static void validateHeadStateIntegrity(Path headState) throws InvalidHeadStateException, IOException {
         try {
             byte[] bytes = Files.readAllBytes(headState);
-            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+            MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
             int digestLength = sha1.getDigestLength();
             sha1.update(bytes, digestLength, bytes.length - digestLength);
             byte[] newChecksum = sha1.digest();