package com.tinkerpop.pipes.transform;
import com.tinkerpop.pipes.AbstractPipe;
import com.tinkerpop.pipes.util.FastNoSuchElementException;
import com.tinkerpop.pipes.util.PipeHelper;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
/**
* ToStringPipe turns an stream of objects into their Object.toString() representation.
*
* @author Pieter Martin
*/
public class ToStringPipe<S> extends AbstractPipe<S, String> implements TransformPipe<S, String> {
private Iterator<Object> tempIterator = PipeHelper.emptyIterator();
private static final String NULL = "null";
@Override
protected String processNextStart() throws NoSuchElementException {
while (true) {
if (this.tempIterator.hasNext()) {
final Object object = this.tempIterator.next();
return (null == object) ? NULL : object.toString();
} else {
final Object result = this.starts.next();
if (result instanceof Iterator) {
this.tempIterator = (Iterator) result;
} else if (result instanceof Iterable) {
this.tempIterator = ((Iterable) result).iterator();
} else if (result instanceof Object[]) {
this.tempIterator = new ArrayIterator((Object[]) result);
} else if (result instanceof Map) {
this.tempIterator = ((Map) result).entrySet().iterator();
} else {
return (null == result) ? NULL : result.toString();
}
}
}
}
@Override
public void reset() {
this.tempIterator = PipeHelper.emptyIterator();
super.reset();
}
class ArrayIterator implements Iterator {
private final Object[] array;
private int count = 0;
public ArrayIterator(final Object[] array) {
this.array = array;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Object next() {
if (count > array.length)
throw new FastNoSuchElementException();
return array[count++];
}
public boolean hasNext() {
return count < array.length;
}
}
}