package com.revolsys.record.io; import java.util.Iterator; import java.util.NoSuchElementException; import com.revolsys.collection.map.MapEx; import com.revolsys.datatype.DataType; import com.revolsys.io.AbstractReader; import com.revolsys.io.map.MapReader; import com.revolsys.record.ArrayRecord; import com.revolsys.record.FieldValueInvalidException; import com.revolsys.record.Record; import com.revolsys.record.schema.FieldDefinition; import com.revolsys.record.schema.RecordDefinition; public class MapReaderRecordReader extends AbstractReader<Record> implements RecordReader, Iterator<Record> { private Iterator<MapEx> mapIterator; private final MapReader mapReader; private boolean open; private final RecordDefinition recordDefinition; public MapReaderRecordReader(final RecordDefinition recordDefinition, final MapReader mapReader) { this.recordDefinition = recordDefinition; this.mapReader = mapReader; } @Override public void close() { this.mapReader.close(); } @Override public RecordDefinition getRecordDefinition() { return this.recordDefinition; } @Override public boolean hasNext() { if (!this.open) { open(); } return this.mapIterator.hasNext(); } @Override public Iterator<Record> iterator() { return this; } @Override public Record next() { if (hasNext()) { final MapEx source = this.mapIterator.next(); final Record target = new ArrayRecord(this.recordDefinition); for (final FieldDefinition field : this.recordDefinition.getFields()) { final String name = field.getName(); final Object value = source.get(name); if (value != null) { final DataType dataType = this.recordDefinition.getFieldType(name); final Object convertedValue; try { convertedValue = dataType.toObject(value); } catch (final Throwable e) { throw new FieldValueInvalidException(name, value, e); } target.setValue(name, convertedValue); } } return target; } else { throw new NoSuchElementException(); } } @Override public void open() { this.open = true; this.mapIterator = this.mapReader.iterator(); } @Override public void remove() { this.mapIterator.remove(); } }