package com.tinkerpop.pipes.transform;
import com.tinkerpop.pipes.Pipe;
import com.tinkerpop.pipes.sideeffect.SideEffectPipe;
import com.tinkerpop.pipes.util.AbstractMetaPipe;
import com.tinkerpop.pipes.util.FastNoSuchElementException;
import com.tinkerpop.pipes.util.MetaPipe;
import com.tinkerpop.pipes.util.PipeHelper;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
/**
* The SideEffectCapPipe will yield an E that is the side effect of the provided SideEffectPipe.
* This is useful for when the side effect of a Pipe is desired in a computational stream.
* Note that LazySideEffectPipes are handled differently from GreedySideEffectPipes.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class SideEffectCapPipe<S, T> extends AbstractMetaPipe<S, T> implements MetaPipe, TransformPipe<S, T> {
private final SideEffectPipe<S, T> pipeToCap;
private boolean alive = true;
public SideEffectCapPipe(final SideEffectPipe<S, T> pipeToCap) {
this.pipeToCap = pipeToCap;
}
public void setStarts(final Iterator<S> starts) {
this.pipeToCap.setStarts(starts);
}
protected T processNextStart() {
if (this.pipeToCap instanceof SideEffectPipe.LazySideEffectPipe) {
this.pipeToCap.next();
return this.pipeToCap.getSideEffect();
} else {
if (this.alive) {
try {
while (true) {
this.pipeToCap.next();
}
} catch (final NoSuchElementException e) {
}
this.alive = false;
return this.pipeToCap.getSideEffect();
} else {
throw FastNoSuchElementException.instance();
}
}
}
public List getCurrentPath() {
if (this.pathEnabled) {
final List list = this.pipeToCap.getCurrentPath();
list.add(this.currentEnd);
return list;
} else {
throw new RuntimeException(Pipe.NO_PATH_MESSAGE);
}
}
public String toString() {
return PipeHelper.makePipeString(this, this.pipeToCap);
}
public List<Pipe> getPipes() {
return Arrays.asList((Pipe) this.pipeToCap);
}
public void reset() {
this.alive = true;
super.reset();
}
}