package com.revolsys.io;
import java.util.Collections;
import java.util.Iterator;
import com.revolsys.collection.iterator.AbstractIterator;
import com.revolsys.collection.map.MapEx;
import com.revolsys.properties.ObjectWithProperties;
public class IteratorReader<T> extends AbstractReader<T> {
private Iterator<T> iterator;
private ObjectWithProperties object;
public IteratorReader() {
setIterator(null);
}
public IteratorReader(final Iterator<T> iterator) {
setIterator(iterator);
if (iterator instanceof ObjectWithProperties) {
this.object = (ObjectWithProperties)iterator;
}
}
@Override
public void close() {
try {
if (this.iterator instanceof AbstractIterator) {
final AbstractIterator<T> i = (AbstractIterator<T>)this.iterator;
i.close();
}
} finally {
setIterator(null);
}
}
@Override
public MapEx getProperties() {
if (this.object == null) {
return super.getProperties();
} else {
return this.object.getProperties();
}
}
@SuppressWarnings("unchecked")
@Override
public <C> C getProperty(final String name) {
if (this.object == null) {
return (C)super.getProperty(name);
} else {
return (C)this.object.getProperty(name);
}
}
@Override
public Iterator<T> iterator() {
return this.iterator;
}
@Override
public void open() {
this.iterator.hasNext();
}
protected void setIterator(final Iterator<T> iterator) {
if (iterator == null) {
this.iterator = Collections.<T> emptyList().iterator();
} else {
this.iterator = iterator;
}
}
@Override
public void setProperty(final String name, final Object value) {
if (this.object == null) {
super.setProperty(name, value);
} else {
this.object.setProperty(name, value);
}
}
}