package com.revolsys.record.io.format.saif.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.Punctual;
import com.revolsys.record.io.format.saif.SaifConstants;
import com.revolsys.record.io.format.saif.geometry.TextLinePoint;
import com.revolsys.record.io.format.saif.geometry.TextOnCurve;
public class TextOnCurveConverter implements OsnConverter {
private final OsnConverterRegistry converters;
private final GeometryFactory geometryFactory;
public TextOnCurveConverter(final GeometryFactory geometryFactory,
final OsnConverterRegistry converters) {
this.geometryFactory = geometryFactory;
this.converters = converters;
}
@Override
public Object read(final OsnIterator iterator) {
final List<Point> points = new ArrayList<>();
String fieldName = iterator.nextFieldName();
while (fieldName != null) {
if (fieldName.equals("characters")) {
while (iterator.next() != OsnIterator.END_LIST) {
final String objectName = iterator.nextObjectName();
final OsnConverter osnConverter = this.converters.getConverter(objectName);
if (osnConverter == null) {
iterator.throwParseError("No Geometry Converter for " + objectName);
}
points.add((TextLinePoint)osnConverter.read(iterator));
}
}
fieldName = iterator.nextFieldName();
}
final Geometry geometry = new TextOnCurve(this.geometryFactory, points);
return geometry;
}
protected void readAttribute(final OsnIterator iterator, final String fieldName,
final Map<String, Object> values) {
iterator.next();
values.put(fieldName, iterator.getValue());
}
@Override
public void write(final OsnSerializer serializer, final Object object) throws IOException {
if (object instanceof Punctual) {
final Punctual punctual = (Punctual)object;
serializer.startObject(SaifConstants.TEXT_ON_CURVE);
serializer.fieldName("characters");
serializer.startCollection("List");
final OsnConverter osnConverter = this.converters.getConverter(SaifConstants.TEXT_LINE);
for (final Point point : punctual.points()) {
osnConverter.write(serializer, point);
}
serializer.endCollection();
serializer.endAttribute();
serializer.endObject();
}
}
@Override
public void writeAttribute(final OsnSerializer serializer, final Object object, final String name)
throws IOException {
}
}