package com.beijunyi.parallelgit.utils.io; import java.util.Iterator; import java.util.NoSuchElementException; import javax.annotation.Nonnull; import org.eclipse.jgit.dircache.DirCacheEntry; public class CacheIterator implements Iterator<CacheNode> { private final DirCacheEntry[] entries; private final int directParentLength; private CacheIterator(DirCacheEntry[] entries, int directParentLength) { this.entries = entries; this.directParentLength = directParentLength; } public CacheIterator(DirCacheEntry[] entries, String directory) { this(entries, directory.length() + 2); // ("/" + path + "/").length() } public CacheIterator(DirCacheEntry[] entries) { this(entries, -1); } private int index = 0; private CacheNode prev; private CacheNode next; public boolean findNext() { while(index < entries.length) { DirCacheEntry entry = entries[index++]; String nextPath = "/" + entry.getPathString(); if(directParentLength == -1) next = CacheNode.file(nextPath, entry); else { if(prev != null && prev.hasChild(nextPath)) continue; int end = nextPath.indexOf('/', directParentLength); next = end != -1 ? CacheNode.directory(nextPath.substring(0, end)) : CacheNode.file(nextPath, entry); } return true; } return false; } @Override public boolean hasNext() { return next != null || findNext(); } @Nonnull @Override public CacheNode next() { if(next != null || findNext()) { prev = next; next = null; return prev; } throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException(); } }