package com.revolsys.record.io;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.revolsys.datatype.DataType;
import com.revolsys.io.AbstractReader;
import com.revolsys.io.Reader;
import com.revolsys.record.ArrayRecord;
import com.revolsys.record.Record;
import com.revolsys.record.schema.FieldDefinition;
import com.revolsys.record.schema.RecordDefinition;
public class RecordDefinitionConvertRecordReader extends AbstractReader<Record>
implements RecordReader, Iterator<Record> {
private Iterator<Record> iterator;
private boolean open;
private final Reader<Record> reader;
private final RecordDefinition recordDefinition;
public RecordDefinitionConvertRecordReader(final RecordDefinition recordDefinition,
final Reader<Record> reader) {
this.recordDefinition = recordDefinition;
this.reader = reader;
}
@Override
public void close() {
this.reader.close();
}
@Override
public RecordDefinition getRecordDefinition() {
return this.recordDefinition;
}
@Override
public boolean hasNext() {
if (!this.open) {
open();
}
return this.iterator.hasNext();
}
@Override
public Iterator<Record> iterator() {
return this;
}
@Override
public Record next() {
if (hasNext()) {
final Record source = this.iterator.next();
final Record target = new ArrayRecord(this.recordDefinition);
for (final FieldDefinition attribute : this.recordDefinition.getFields()) {
final String name = attribute.getName();
final Object value = source.getValue(name);
if (value != null) {
final DataType dataType = this.recordDefinition.getFieldType(name);
final Object convertedValue = dataType.toObject(value);
target.setValue(name, convertedValue);
}
}
return target;
} else {
throw new NoSuchElementException();
}
}
@Override
public void open() {
this.open = true;
this.iterator = this.reader.iterator();
}
@Override
public void remove() {
this.iterator.remove();
}
}