use of org.locationtech.geogig.api.plumbing.diff.BoundsFilteringDiffConsumer in project GeoGig by boundlessgeo.
the class DiffTree method _call.
/**
* Finds differences between the two specified trees.
*
* @return an iterator to a set of differences between the two trees
* @see DiffEntry
*/
@Override
protected Iterator<DiffEntry> _call() throws IllegalArgumentException {
checkNotNull(oldRefSpec, "old version not specified");
checkNotNull(newRefSpec, "new version not specified");
final RevTree oldTree = resolveTree(oldRefSpec);
final RevTree newTree = resolveTree(newRefSpec);
if (oldTree.equals(newTree)) {
return Iterators.emptyIterator();
}
ObjectDatabase leftSource = resolveSource(oldTree.getId());
ObjectDatabase rightSource = resolveSource(newTree.getId());
final PreOrderDiffWalk visitor = new PreOrderDiffWalk(oldTree, newTree, leftSource, rightSource);
final BlockingQueue<DiffEntry> queue = new ArrayBlockingQueue<>(100);
final DiffEntryProducer diffProducer = new DiffEntryProducer(queue);
diffProducer.setReportTrees(this.reportTrees);
diffProducer.setRecursive(this.recursive);
final List<RuntimeException> producerErrors = new LinkedList<>();
Thread producerThread = new Thread("DiffTree producer thread") {
@Override
public void run() {
Consumer consumer = diffProducer;
if (customFilter != null) {
// evaluated the latest
consumer = new PreOrderDiffWalk.FilteringConsumer(consumer, customFilter);
}
if (changeTypeFilter != null) {
consumer = new ChangeTypeFilteringDiffConsumer(changeTypeFilter, consumer);
}
if (boundsFilter != null) {
consumer = new BoundsFilteringDiffConsumer(boundsFilter, consumer, stagingDatabase());
}
if (!pathFilters.isEmpty()) {
// evaluated the former
consumer = new PathFilteringDiffConsumer(pathFilters, consumer);
}
try {
visitor.walk(consumer);
} catch (RuntimeException e) {
LOGGER.error("Error traversing diffs", e);
producerErrors.add(e);
} finally {
diffProducer.finished = true;
}
}
};
producerThread.setDaemon(true);
producerThread.start();
Iterator<DiffEntry> consumerIterator = new AbstractIterator<DiffEntry>() {
@Override
protected DiffEntry computeNext() {
if (!producerErrors.isEmpty()) {
throw new RuntimeException("Error in producer thread", producerErrors.get(0));
}
BlockingQueue<DiffEntry> entries = queue;
boolean finished = diffProducer.isFinished();
boolean empty = entries.isEmpty();
while (!finished || !empty) {
try {
DiffEntry entry = entries.poll(10, TimeUnit.MILLISECONDS);
if (entry != null) {
return entry;
}
finished = diffProducer.isFinished();
empty = entries.isEmpty();
} catch (InterruptedException e) {
throw Throwables.propagate(e);
}
}
return endOfData();
}
@Override
protected void finalize() {
diffProducer.finished = true;
}
};
return consumerIterator;
}
Aggregations