package be.gim.belmap.entityapi.model.deserializers; import org.bson.Document; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.geo.GeoJsonLineString; import org.springframework.data.mongodb.core.geo.GeoJsonMultiPolygon; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @ReadingConverter public class GeoJsonMultiPolygonDeserializer implements Converter { @Override public GeoJsonMultiPolygon convert(Document source) { List geoJsonPolygons = new ArrayList<>(); var jsonPolygons = (List) source.get("coordinates"); for (var jsonPolygon : jsonPolygons){ Iterator it = ((List) jsonPolygon).iterator(); GeoJsonPolygon g = new GeoJsonPolygon(toListOfPoint((List) it.next())); while (it.hasNext()) g = g.withInnerRing(toListOfPoint((List) it.next())); geoJsonPolygons.add(g); } return new GeoJsonMultiPolygon(geoJsonPolygons); } private List toListOfPoint(List listOfCoordinatePairs) { List points = new ArrayList(); Iterator var2 = listOfCoordinatePairs.iterator(); while(var2.hasNext()) { Object point = var2.next(); Assert.isInstanceOf(List.class, point); List coordinatesList = (List)point; points.add(new GeoJsonPoint(toPrimitiveDoubleValue(coordinatesList.get(0)), toPrimitiveDoubleValue(coordinatesList.get(1)))); } return points; } private double toPrimitiveDoubleValue(Object value) { Assert.isInstanceOf(Number.class, value, "Argument must be a Number."); return (Double) NumberUtils.convertNumberToTargetClass((Number)value, Double.class); } }