package com.revolsys.record.io.format.saif.util;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.impl.LineStringDoubleBuilder;
import com.revolsys.geometry.model.impl.LineStringDoubleGf;
import com.revolsys.record.io.format.saif.SaifConstants;
import com.revolsys.record.io.format.saif.geometry.ArcLineString;
import com.revolsys.record.io.format.saif.geometry.ContourLineString;
import com.revolsys.util.Property;
public class ContourConverter extends ArcConverter {
private static final String GEOMETRY_CLASS = SaifConstants.CONTOUR;
private final OsnConverterRegistry converters;
public ContourConverter(final GeometryFactory geometryFactory,
final OsnConverterRegistry converters) {
super(geometryFactory, SaifConstants.ARC);
this.converters = converters;
}
@Override
public LineString newLineString(final GeometryFactory geometryFactory,
final LineStringDoubleBuilder line) {
final int axisCount = geometryFactory.getAxisCount();
final int vertexCount = line.getVertexCount();
final double[] coordinates = LineStringDoubleGf.getNewCoordinates(geometryFactory, line);
return new ContourLineString(geometryFactory, axisCount, vertexCount, coordinates);
}
@Override
public Object read(final OsnIterator iterator) {
final Map<String, Object> values = new TreeMap<>();
values.put(SaifConstants.TYPE, GEOMETRY_CLASS);
Geometry geometry = null;
String fieldName = iterator.nextFieldName();
while (fieldName != null) {
if (fieldName.equals("arc")) {
final String objectName = iterator.nextObjectName();
final OsnConverter osnConverter = this.converters.getConverter(objectName);
if (osnConverter == null) {
iterator.throwParseError("No Geometry Converter for " + objectName);
}
geometry = (Geometry)osnConverter.read(iterator);
} else if (fieldName.equals("value")) {
final double value = iterator.nextDoubleValue();
values.put("value", new Double(value));
} else {
readAttribute(iterator, fieldName, values);
}
fieldName = iterator.nextFieldName();
}
Property.set(geometry, values);
return geometry;
}
@Override
public void write(final OsnSerializer serializer, final Object object) throws IOException {
if (object instanceof LineString) {
final LineString line = (LineString)object;
serializer.startObject(GEOMETRY_CLASS);
serializer.fieldName("arc");
super.write(serializer, object);
serializer.endAttribute();
if (line instanceof ContourLineString) {
final ContourLineString contourLine = (ContourLineString)line;
final String form = contourLine.getForm();
attributeEnum(serializer, "form", form);
super.writeAttributes(serializer, (ArcLineString)line);
final int value = contourLine.getValue();
attributeEnum(serializer, "form", Integer.toString(value));
} else if (line instanceof ArcLineString) {
super.writeAttributes(serializer, (ArcLineString)line);
}
serializer.endObject();
}
}
}