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.OrientedArcLineString; import com.revolsys.util.Property; public class OrientedArcConverter extends ArcConverter { private static final String GEOMETRY_CLASS = SaifConstants.ORIENTED_ARC; private final OsnConverterRegistry converters; public OrientedArcConverter(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 OrientedArcLineString(geometryFactory, axisCount, vertexCount, coordinates); } @Override public Object read(final OsnIterator iterator) { Geometry geometry = null; final Map<String, Object> values = new TreeMap<>(); values.put("type", GEOMETRY_CLASS); String name = iterator.nextFieldName(); while (name != null) { if (name.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 { readAttribute(iterator, name, values); } name = 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, false); serializer.endAttribute(); if (line instanceof ArcLineString) { super.writeAttributes(serializer, (ArcLineString)line); } if (line instanceof OrientedArcLineString) { final OrientedArcLineString orientedLine = (OrientedArcLineString)line; final String traversalDirection = orientedLine.getTraversalDirection(); attributeEnum(serializer, "traversalDirection", traversalDirection); } serializer.endObject(); } } }