package com.revolsys.gis.web.rest.converter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletWebRequest; import com.revolsys.geometry.io.GeometryReaderFactory; import com.revolsys.geometry.io.GeometryWriter; import com.revolsys.geometry.io.GeometryWriterFactory; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.io.IoConstants; import com.revolsys.io.IoFactory; import com.revolsys.io.Reader; import com.revolsys.logging.Logs; import com.revolsys.spring.resource.InputStreamResource; import com.revolsys.ui.web.rest.converter.AbstractHttpMessageConverter; import com.revolsys.ui.web.utils.HttpServletUtils; public class GeometryHttpMessageConverter extends AbstractHttpMessageConverter<Geometry> { private GeometryFactory geometryFactory = GeometryFactory.floating3(4326); public GeometryHttpMessageConverter() { super(Geometry.class, IoFactory.mediaTypes(GeometryReaderFactory.class), IoFactory.mediaTypes(GeometryWriterFactory.class)); } public GeometryFactory getGeometryFactory() { return this.geometryFactory; } @Override public Geometry read(final Class<? extends Geometry> clazz, final HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { final HttpHeaders headers = inputMessage.getHeaders(); final MediaType mediaType = headers.getContentType(); try { Charset charset = mediaType.getCharSet(); if (charset == null) { charset = StandardCharsets.UTF_8; } final InputStream body = inputMessage.getBody(); final String mediaTypeString = mediaType.getType() + "/" + mediaType.getSubtype(); final GeometryReaderFactory readerFactory = IoFactory .factoryByMediaType(GeometryReaderFactory.class, mediaTypeString); if (readerFactory == null) { throw new HttpMessageNotReadableException("Cannot read data in format" + mediaType); } else { final Reader<Geometry> reader = readerFactory .newGeometryReader(new InputStreamResource("geometryUpload", body)); GeometryFactory factory = this.geometryFactory; final ServletWebRequest requestAttributes = (ServletWebRequest)RequestContextHolder .getRequestAttributes(); final String srid = requestAttributes.getParameter("srid"); if (srid != null && srid.trim().length() > 0) { factory = GeometryFactory.floating3(Integer.parseInt(srid)); } reader.setProperty(IoConstants.GEOMETRY_FACTORY, factory); for (final Geometry geometry : reader) { if (clazz.isAssignableFrom(geometry.getClass())) { return geometry; } } return null; } } catch (final Throwable e) { Logs.error(this, "Error reading data using " + mediaType, e); throw new HttpMessageNotReadableException("Error reading data using" + mediaType); } } public void setGeometryFactory(final GeometryFactory geometryFactory) { this.geometryFactory = geometryFactory; } @Override public void write(final Geometry geometry, final MediaType mediaType, final HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (!HttpServletUtils.getResponse().isCommitted()) { MediaType actualMediaType; if (mediaType == null) { actualMediaType = getDefaultMediaType(); } else { actualMediaType = mediaType; } if (actualMediaType != null) { final Charset charset = HttpServletUtils.setContentTypeWithCharset(outputMessage, actualMediaType); final OutputStream body = outputMessage.getBody(); final String mediaTypeString = actualMediaType.getType() + "/" + actualMediaType.getSubtype(); final GeometryWriterFactory writerFactory = IoFactory .factoryByMediaType(GeometryWriterFactory.class, mediaTypeString); if (writerFactory == null) { throw new IllegalArgumentException("Media type " + actualMediaType + " not supported"); } else { final String baseName = HttpServletUtils.getRequestBaseFileName(); final GeometryWriter writer = writerFactory.newGeometryWriter(baseName, body, charset); writer.write(geometry); writer.close(); } } } } }