package com.link_intersystems.gitdirstat.domain.walk;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.functors.FalsePredicate;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
import com.link_intersystems.gitdirstat.domain.TreeEntryWalk;
import com.link_intersystems.gitdirstat.domain.TreeEntryWalk.TreeEntry;
public class TreeParserTreeEntryWalkAdapter implements RevCommitWalk {
private ObjectReader objectReader;
private CanonicalTreeParser treeParser;
private TreeEntryWalk treeEntryWalk;
private Predicate<TreeEntry> filterPredicate = FalsePredicate
.falsePredicate();
public TreeParserTreeEntryWalkAdapter(ObjectReader objectReader,
TreeEntryWalk treeEntryWalk) {
this.objectReader = objectReader;
this.treeEntryWalk = treeEntryWalk;
treeParser = new CanonicalTreeParser();
}
@Override
public void walk(RevCommit revCommit) throws IOException {
RevTree tree = revCommit.getTree();
treeParser.reset(objectReader, tree);
processTreeParser(treeParser);
}
private void processTreeParser(CanonicalTreeParser treeParser)
throws IOException {
TreeParserTreeEntry treeParserEntry = new TreeParserTreeEntry(
treeParser, objectReader);
List<CanonicalTreeParser> subTrees = new ArrayList<CanonicalTreeParser>();
while (!treeParser.eof()) {
FileMode entryFileMode = treeParser.getEntryFileMode();
if (FileMode.TREE.equals(entryFileMode)) {
CanonicalTreeParser canonicalTreeParser = new CanonicalTreeParser();
canonicalTreeParser.reset(objectReader,
treeParser.getEntryObjectId());
subTrees.add(canonicalTreeParser);
} else {
if (!filterPredicate.evaluate(treeParserEntry)) {
treeEntryWalk.walk(treeParserEntry);
}
}
treeParser.next();
}
for (CanonicalTreeParser subTreeParser : subTrees) {
processTreeParser(subTreeParser);
}
}
public void setTreeWalkFilter(Predicate<TreeEntry> filterPredicate) {
if (filterPredicate == null) {
filterPredicate = FalsePredicate.falsePredicate();
}
this.filterPredicate = filterPredicate;
}
private static class TreeParserTreeEntry implements TreeEntry {
private AbstractTreeIterator abstractTreeIterator;
private ObjectReader objectReader;
public TreeParserTreeEntry(AbstractTreeIterator abstractTreeIterator,
ObjectReader objectReader) {
this.abstractTreeIterator = abstractTreeIterator;
this.objectReader = objectReader;
}
@Override
public FileMode getFileMode() {
return abstractTreeIterator.getEntryFileMode();
}
@Override
public String getPathString() {
return abstractTreeIterator.getEntryPathString();
}
@Override
public ObjectId getObjectId() {
return abstractTreeIterator.getEntryObjectId();
}
@Override
public long getSize() throws IOException {
long objectSize = objectReader.getObjectSize(getObjectId(),
Constants.OBJ_BLOB);
return objectSize;
}
@Override
public byte[] getRawPath() {
return abstractTreeIterator.getEntryPathBuffer();
}
@Override
public TreeEntryEquality getEqualityObject() {
return new DefaultTreeEntryEquality(getObjectId(), getRawPath());
}
}
}