/* (c) 2017 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.rest.catalog; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import org.geoserver.rest.converters.BaseMessageConverter; import org.geoserver.rest.util.MediaTypeExtensions; 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.stereotype.Component; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONNull; import net.sf.json.JSONObject; /** * Convert Map to/from JSON. * @author jody * */ @Component public class MapJSONConverter extends BaseMessageConverter<Map<?, ?>> { public MapJSONConverter() { super(MediaType.APPLICATION_JSON, MediaTypeExtensions.TEXT_JSON); } @Override protected boolean supports(Class<?> clazz) { return Map.class.isAssignableFrom(clazz); } @Override public Map<?, ?> readInternal(Class<? extends Map<?, ?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { // TODO: character set BufferedReader reader = new BufferedReader(new InputStreamReader(inputMessage.getBody())); StringBuilder text = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { text.append(line); } return JSONObject.fromObject(text.toString()); } @Override public void writeInternal(Map<?, ?> map, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { // TODO: character set Writer outWriter = new BufferedWriter(new OutputStreamWriter(outputMessage.getBody())); // JD: why does this initial flush occur? outWriter.flush(); JSON obj = (JSON) toJSONObject(map); obj.write(outWriter); outWriter.flush(); } /** * Convert to JSON representation. * @param obj * @return json representation */ public Object toJSONObject(Object obj) { if (obj instanceof Map) { Map<?, ?> m = (Map<?, ?>) obj; JSONObject json = new JSONObject(); for (Entry<?, ?> entry : m.entrySet()) { String key = (String) entry.getKey(); Object value = toJSONObject(entry.getValue()); json.put(key, value); } return json; } else if (obj instanceof Collection) { Collection<?> collection = (Collection<?>) obj; JSONArray json = new JSONArray(); for (Object object : collection) { Object value = toJSONObject(object); json.add(toJSONObject(value)); } return json; } else if (obj instanceof Number) { return obj; } else if (obj instanceof Boolean) { return obj; } else if (obj == null) { return JSONNull.getInstance(); } else { return obj.toString(); } } }