package com.beijunyi.parallelgit.utils.io; import java.io.IOException; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectInserter.Formatter; import org.eclipse.jgit.lib.Repository; public abstract class ObjectSnapshot<Data> { protected final ObjectId id; protected Data data; protected ObjectSnapshot(Data data, @Nullable ObjectId id) { this.data = data; this.id = id != null ? id : new Formatter().idFor(getType(), toByteArray(data)); } @Nonnull public Data getData() throws IOException { return data; } @Nonnull public ObjectId getId() { return id; } @Nonnull public ObjectId save(Repository repo) throws IOException { try(ObjectInserter inserter = repo.newObjectInserter()) { ObjectId ret = save(inserter); inserter.flush(); return ret; } } @Nonnull public abstract ObjectId save(ObjectInserter inserter) throws IOException; protected abstract int getType(); @Nonnull protected abstract byte[] toByteArray(Data data); @Override public boolean equals(@Nullable Object that) { return this == that || that != null && that instanceof ObjectSnapshot && id.equals(((ObjectSnapshot)that).id); } @Override public int hashCode() { return id.hashCode(); } }