package com.revolsys.ui.web.rest.converter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; 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 com.revolsys.io.IoConstants; import com.revolsys.io.IoFactory; import com.revolsys.io.map.MapWriter; import com.revolsys.io.map.MapWriterFactory; import com.revolsys.record.io.format.json.JsonParser; import com.revolsys.ui.web.utils.HttpServletUtils; public class MapHttpMessageConverter extends AbstractHttpMessageConverter<Map> { public MapHttpMessageConverter() { super(Map.class, Collections.singleton(MediaType.APPLICATION_JSON), IoFactory.mediaTypes(MapWriterFactory.class)); } @Override public Map read(final Class<? extends Map> clazz, final HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { try { final Map<String, Object> map = new HashMap<>(); final InputStream in = inputMessage.getBody(); final Map<String, Object> readMap = JsonParser.read(in); if (readMap != null) { map.putAll(readMap); } return map; } catch (final Throwable e) { throw new HttpMessageNotReadableException(e.getMessage(), e); } } @SuppressWarnings("unchecked") @Override public void write(final Map map, final MediaType mediaType, final HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (!HttpServletUtils.getResponse().isCommitted()) { final Charset charset = HttpServletUtils.setContentTypeWithCharset(outputMessage, mediaType); final OutputStream body = outputMessage.getBody(); final String mediaTypeString = mediaType.getType() + "/" + mediaType.getSubtype(); final MapWriterFactory writerFactory = IoFactory.factoryByMediaType(MapWriterFactory.class, mediaTypeString); final MapWriter writer = writerFactory.newMapWriter(body, charset); writer.setProperty(IoConstants.INDENT, true); writer.setProperty(IoConstants.SINGLE_OBJECT_PROPERTY, true); final HttpServletRequest request = HttpServletUtils.getRequest(); String callback = request.getParameter("jsonp"); if (callback == null) { callback = request.getParameter("callback"); } if (callback != null) { writer.setProperty(IoConstants.JSONP_PROPERTY, callback); } final Object title = request.getAttribute(IoConstants.TITLE_PROPERTY); if (title != null) { writer.setProperty(IoConstants.TITLE_PROPERTY, title); } writer.write(map); writer.close(); } } }