package com.revolsys.record.io.format.wkt;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import com.revolsys.geometry.model.ClockDirection;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.io.FileUtil;
import com.revolsys.record.Record;
import com.revolsys.record.RecordFactory;
import com.revolsys.record.Records;
import com.revolsys.record.io.format.csv.AbstractRecordReader;
import com.revolsys.record.property.FieldProperties;
import com.revolsys.record.schema.FieldDefinition;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.spring.resource.Resource;
public class WktRecordReader extends AbstractRecordReader {
private BufferedReader in;
private WktParser wktParser;
public WktRecordReader(final RecordFactory<? extends Record> recordFactory,
final Resource resource) {
super(recordFactory);
this.in = resource.newBufferedReader();
final RecordDefinition recordDefinition = Records.newGeometryRecordDefinition();
setRecordDefinition(recordDefinition);
}
@Override
protected void closeDo() {
super.closeDo();
FileUtil.closeSilent(this.in);
this.in = null;
this.wktParser = null;
}
@Override
protected Record getNext() {
try {
final String wkt = this.in.readLine();
final Geometry geometry = this.wktParser.parseGeometry(wkt, false);
if (geometry == null) {
throw new NoSuchElementException();
} else {
final Record record = newRecord();
record.setGeometryValue(geometry);
return record;
}
} catch (final IOException e) {
throw new RuntimeException("Error reading geometry ", e);
}
}
@Override
public ClockDirection getPolygonRingDirection() {
return ClockDirection.COUNTER_CLOCKWISE;
}
@Override
protected void initDo() {
GeometryFactory geometryFactory;
final FieldDefinition geometryField = getRecordDefinition().getGeometryField();
if (geometryField == null) {
geometryFactory = GeometryFactory.DEFAULT_3D;
} else {
geometryFactory = geometryField.getProperty(FieldProperties.GEOMETRY_FACTORY);
if (geometryFactory == null) {
geometryFactory = getGeometryFactory();
if (geometryFactory == null) {
geometryFactory = GeometryFactory.DEFAULT_3D;
}
geometryField.setProperty(FieldProperties.GEOMETRY_FACTORY, geometryFactory);
}
}
this.wktParser = new WktParser(geometryFactory);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}