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;
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;
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);
"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) {
}
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 {
byte[] bytes = rf.toByteBuffer().array();
- MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+ MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
sha1.update(bytes);
byte[] checksum = sha1.digest();
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();