package com.beijunyi.parallelgit.utils.io;
import java.io.IOException;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.beijunyi.parallelgit.utils.TreeUtils;
import org.eclipse.jgit.lib.*;
import org.eclipse.jgit.treewalk.TreeWalk;
import static com.beijunyi.parallelgit.utils.io.GitFileEntry.*;
import static java.util.Collections.unmodifiableSortedMap;
import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
public class TreeSnapshot extends ObjectSnapshot<SortedMap<String, GitFileEntry>> {
private TreeFormatter formatter;
private TreeSnapshot(SortedMap<String, GitFileEntry> data, @Nullable ObjectId id) {
super(unmodifiableSortedMap(data), id);
}
private TreeSnapshot(SortedMap<String, GitFileEntry> data) {
this(data, null);
}
@Nonnull
@Override
public ObjectId save(ObjectInserter inserter) throws IOException {
return inserter.insert(format(data));
}
@Override
protected int getType() {
return OBJ_TREE;
}
@Nonnull
@Override
protected byte[] toByteArray(SortedMap<String, GitFileEntry> stringGitFileEntrySortedMap) {
return format(data).toByteArray();
}
public boolean hasChild(String name) {
return data.containsKey(name);
}
@Nonnull
public GitFileEntry getChild(String name) {
GitFileEntry entry = data.get(name);
return entry != null ? entry : missingEntry();
}
@Nonnull
public static TreeSnapshot load(ObjectId id, ObjectReader reader) throws IOException {
SortedMap<String, GitFileEntry> ret = new TreeMap<>();
try(TreeWalk tw = TreeUtils.newTreeWalk(id, reader)) {
while(tw.next()) ret.put(tw.getNameString(), newEntry(tw));
}
return new TreeSnapshot(ret, id);
}
@Nonnull
public static TreeSnapshot load(ObjectId id, Repository repo) throws IOException {
try(ObjectReader reader = repo.newObjectReader()) {
return load(id, reader);
}
}
@Nonnull
public static TreeSnapshot capture(SortedMap<String, GitFileEntry> children) {
return new TreeSnapshot(children);
}
@Nonnull
private synchronized TreeFormatter format(SortedMap<String, GitFileEntry> data) {
if(formatter == null) {
formatter = new TreeFormatter();
for(Map.Entry<String, GitFileEntry> child : data.entrySet()) {
String name = child.getKey();
GitFileEntry entry = child.getValue();
formatter.append(name, entry.getMode(), entry.getId());
}
}
return formatter;
}
}