package com.revolsys.record.io; import java.util.Iterator; import java.util.NoSuchElementException; import com.revolsys.geometry.io.GeometryReader; import com.revolsys.geometry.model.ClockDirection; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.io.BaseCloseable; import com.revolsys.record.Record; import com.revolsys.record.RecordFactory; import com.revolsys.record.io.format.csv.AbstractRecordReader; import com.revolsys.record.schema.RecordDefinition; public class GeometryRecordReader extends AbstractRecordReader { private GeometryReader geometryReader; private Iterator<Geometry> geometryIterator; private final String baseName; public GeometryRecordReader(final String baseName, final GeometryReader geometryReader, final RecordFactory<? extends Record> recordFactory) { super(recordFactory); this.baseName = baseName; this.geometryReader = geometryReader; } @Override protected void closeDo() { final Iterator<Geometry> geometryIterator = this.geometryIterator; this.geometryIterator = null; if (geometryIterator instanceof BaseCloseable) { final BaseCloseable closeable = (BaseCloseable)geometryIterator; closeable.close(); } final GeometryReader geometryReader = this.geometryReader; this.geometryReader = null; if (geometryReader != null) { geometryReader.close(); } super.closeDo(); } @Override protected Record getNext() throws NoSuchElementException { if (this.geometryIterator.hasNext()) { final Geometry geometry = this.geometryIterator.next(); final Record record = newRecord(); record.setGeometryValue(geometry); return record; } else { throw new NoSuchElementException(); } } @Override public ClockDirection getPolygonRingDirection() { if (this.geometryReader == null) { return ClockDirection.NONE; } else { return this.geometryReader.getPolygonRingDirection(); } } @Override protected void initDo() { this.geometryIterator = this.geometryReader.iterator(); this.geometryIterator.hasNext(); final GeometryFactory geometryFactory = this.geometryReader.getGeometryFactory(); setGeometryFactory(geometryFactory); final RecordDefinition recordDefinition = this.geometryReader .newRecordDefinition(this.baseName); setRecordDefinition(recordDefinition); } }