package com.link_intersystems.gitdirstat.domain.walk;
import java.io.IOException;
import org.apache.commons.collections4.Predicate;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
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.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import com.link_intersystems.gitdirstat.domain.TreeEntryWalk;
import com.link_intersystems.gitdirstat.domain.TreeEntryWalk.TreeEntry;
public class TreeWalkTreeEntryWalkAdapter implements RevCommitWalk {
private TreeEntryWalk treeEntryWalk;
private TreeWalk treeWalk;
private TreeWalkTreeEntry treeWalkTreeEntry;
public TreeWalkTreeEntryWalkAdapter(ObjectReader objectReader,
TreeEntryWalk treeEntryWalk) {
this.treeEntryWalk = treeEntryWalk;
treeWalk = new TreeWalk(objectReader);
treeWalk.setRecursive(true);
treeWalkTreeEntry = new TreeWalkTreeEntry(treeWalk);
}
@Override
public void walk(RevCommit revCommit) throws IOException {
treeWalk.reset(revCommit.getTree());
while (treeWalk.next()) {
treeEntryWalk.walk(treeWalkTreeEntry);
}
}
public void setTreeWalkFilter(final Predicate<TreeEntry> filterPredicate) {
TreeFilter treeFilter = null;
if (filterPredicate != null) {
treeFilter = new TreeWalkFilterPredicateAdapter(filterPredicate,
treeWalkTreeEntry);
}
treeWalk.setFilter(treeFilter);
}
static class TreeWalkFilterPredicateAdapter extends TreeFilter {
private TreeEntry treeEntry;
private Predicate<TreeEntry> filterPredicate;
public TreeWalkFilterPredicateAdapter(
Predicate<TreeEntry> filterPredicate, TreeEntry treeEntry) {
this.filterPredicate = filterPredicate;
this.treeEntry = treeEntry;
}
@Override
public boolean include(TreeWalk walker) throws MissingObjectException,
IncorrectObjectTypeException, IOException {
return !filterPredicate.evaluate(treeEntry);
}
@Override
public boolean shouldBeRecursive() {
return true;
}
@Override
public TreeFilter clone() {
return this;
}
}
static class TreeWalkTreeEntry implements TreeEntry {
private TreeWalk treeWalk;
private ObjectReader objectReader;
public TreeWalkTreeEntry(TreeWalk treeWalk) {
this.treeWalk = treeWalk;
this.objectReader = treeWalk.getObjectReader();
}
public boolean isTree() {
return FileMode.TREE.equals(getFileMode());
}
@Override
public FileMode getFileMode() {
return treeWalk.getFileMode(0);
}
@Override
public String getPathString() {
return treeWalk.getPathString();
}
@Override
public ObjectId getObjectId() {
return treeWalk.getObjectId(0);
}
@Override
public long getSize() throws IOException {
long objectSize = objectReader.getObjectSize(getObjectId(),
Constants.OBJ_BLOB);
return objectSize;
}
@Override
public byte[] getRawPath() {
return treeWalk.getRawPath();
}
@Override
public TreeEntryEquality getEqualityObject() {
return new DefaultTreeEntryEquality(getObjectId(), getRawPath());
}
}
}