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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class HeadState {
+ private static transient final Logger LOGGER = LoggerFactory.getLogger(HeadState.class);
+
public static final String HEAD_STATE = "head.state";
public static final String SHA_1 = "SHA-1";
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);
byte[] bytes = Files.readAllBytes(f);
MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
int digestLength = sha1.getDigestLength();
-
sha1.update(bytes, digestLength, bytes.length - digestLength);
byte[] newChecksum = sha1.digest();
if (!Arrays.equals(newChecksum, Arrays.copyOfRange(bytes, 0, digestLength))) {
return object;
}
} catch (IOException i) {
- return new HeadState();
-// throw new InvalidHeadStateException(i);
+ Throwable cause = i.getCause();
+ if(cause instanceof AdapterConstructionException) {
+ HeadState1 old = HeadState1.load(directory);
+ return old.migrate();
+ }
+ throw new InvalidHeadStateException(i);
} catch (NoSuchAlgorithmException e) {
throw new Error("SHA-1 Algorithm not found", e);
} catch (Throwable t) {
}
}
- public static void validateHeadStateIntegrity(Path headState) throws InvalidHeadStateException, IOException {
+ public static boolean validateHeadStateIntegrity(Path headState) {
+ if (!Files.exists(headState))
+ return false;
try {
byte[] bytes = Files.readAllBytes(headState);
MessageDigest sha1 = MessageDigest.getInstance(SHA_1);
sha1.update(bytes, digestLength, bytes.length - digestLength);
byte[] newChecksum = sha1.digest();
if (!Arrays.equals(newChecksum, Arrays.copyOfRange(bytes, 0, digestLength))) {
- throw new InvalidHeadStateException(
- "Checksum " + Arrays.toString(newChecksum) + " does not match excpected "
- + Arrays.toString(Arrays.copyOfRange(bytes, 0, digestLength)) + " for " + headState.toAbsolutePath());
+ LOGGER.error("Checksum " + Arrays.toString(newChecksum) + " does not match excpected " + Arrays.toString(Arrays.copyOfRange(bytes, 0, digestLength)) + " for " + headState.toAbsolutePath());
+ return false;
}
+ return true;
+ } catch (IOException e) {
+ LOGGER.error("An I/O error occured while validating integrity of head.state", e);
+ return false;
} catch (NoSuchAlgorithmException e) {
+ LOGGER.error("SHA-1 digest not found, should not happen", e);
throw new Error("SHA-1 digest not found, should not happen", e);
}
}
+
}