package com.tinkerpop.pipes.sideeffect;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.pipes.AbstractPipe;
import com.tinkerpop.pipes.util.AsPipe;
import com.tinkerpop.pipes.util.PipeHelper;
import java.util.ArrayList;
import java.util.List;
/**
* LinkPipe supports the creation of an edge between the current vertex in the pipe and some other vertex.
* That other vertex is either defined by an AsPipe or a specifically specified vertex.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class LinkPipe extends AbstractPipe<Vertex, Vertex> implements SideEffectPipe.LazySideEffectPipe<Vertex, Object> {
final private Direction direction;
final private String label;
private AsPipe<?, Vertex> asPipe;
private Vertex other;
private Object sideEffect;
private LinkPipe(final Direction direction, final String label) {
this.direction = direction;
this.label = label;
if (direction.equals(Direction.BOTH))
this.sideEffect = new ArrayList<Edge>();
}
public LinkPipe(final Direction direction, final String label, final Vertex other) {
this(direction, label);
this.other = other;
}
public LinkPipe(final Direction direction, final String label, final AsPipe<?, Vertex> asPipe) {
this(direction, label);
this.asPipe = asPipe;
}
public Object getSideEffect() {
return this.sideEffect;
}
protected Vertex processNextStart() {
final Vertex vertex = this.starts.next();
if (null != this.asPipe)
this.other = asPipe.getCurrentEnd();
if (this.direction.equals(Direction.BOTH))
((List) this.sideEffect).clear();
if (this.direction.equals(Direction.IN) || this.direction.equals(Direction.BOTH)) {
final Edge edge = this.other.addEdge(this.label, vertex);
if (this.direction.equals(Direction.BOTH))
((List<Edge>) this.sideEffect).add(edge);
else
this.sideEffect = edge;
}
if (this.direction.equals(Direction.OUT) || this.direction.equals(Direction.BOTH)) {
final Edge edge = vertex.addEdge(this.label, this.other);
if (this.direction.equals(Direction.BOTH))
((List<Edge>) this.sideEffect).add(edge);
else
this.sideEffect = edge;
}
return vertex;
}
public void reset() {
super.reset();
this.sideEffect = null;
}
public String toString() {
return PipeHelper.makePipeString(this, this.direction.name(), this.label, null == this.asPipe ? this.other : this.asPipe.getName());
}
}