package com.tinkerpop.pipes.filter; import com.tinkerpop.pipes.Pipe; import com.tinkerpop.pipes.util.AbstractMetaPipe; import com.tinkerpop.pipes.util.MetaPipe; import com.tinkerpop.pipes.util.PipeHelper; import com.tinkerpop.pipes.util.iterators.SingleExpandableIterator; import java.util.Arrays; import java.util.List; import java.util.NoSuchElementException; /** * BackFilterPipe will fully process the object through its internal pipe. * If the internal pipe yields results, then the original object is emitted from the BackFilterPipe. * * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class BackFilterPipe<S> extends AbstractMetaPipe<S, S> implements FilterPipe<S>, MetaPipe { private final Pipe<S, ?> pipe; private final SingleExpandableIterator<S> expando = new SingleExpandableIterator<S>(); public BackFilterPipe(final Pipe<S, ?> pipe) { this.pipe = pipe; this.pipe.setStarts(this.expando); } public S processNextStart() { while (true) { final S s = this.starts.next(); this.expando.add(s); if (this.pipe.hasNext()) { try { while (true) { this.pipe.next(); } } catch (final NoSuchElementException e) { } return s; } } } public String toString() { return PipeHelper.makePipeString(this, this.pipe); } public List<Pipe> getPipes() { return (List) Arrays.asList(this.pipe); } }