/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.geoserver.rest.format; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Collection; import java.util.Iterator; import java.util.Map; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONNull; import net.sf.json.JSONObject; import org.restlet.data.MediaType; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.resource.Representation; import org.restlet.resource.Resource; /** * A format that automatically converts a map into JSON and vice versa. * <p> * The <a href="http://json-lib.sourceforge.net/">json-lib</a> library is used to read and * write JSON. * </p> * * * @author David Winslow <dwinslow@openplans.org> */ public class MapJSONFormat extends StreamDataFormat { public MapJSONFormat(){ super(MediaType.APPLICATION_JSON); } @Override protected void write(Object object, OutputStream out) throws IOException { //TODO: character set Writer outWriter = new BufferedWriter(new OutputStreamWriter(out)); //JD: why does this initial flush occur? outWriter.flush(); JSON obj = (JSON)toJSONObject(object); obj.write(outWriter); outWriter.flush(); } public Object toJSONObject(Object obj) { if (obj instanceof Map) { Map m = (Map) obj; JSONObject json = new JSONObject(); Iterator it = m.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); json.put((String) entry.getKey(), toJSONObject(entry.getValue())); } return json; } else if (obj instanceof Collection) { Collection col = (Collection) obj; JSONArray json = new JSONArray(); Iterator it = col.iterator(); while (it.hasNext()) { json.add(toJSONObject(it.next())); } return json; } else if (obj instanceof Number) { return obj; } else if (obj == null) { return JSONNull.getInstance(); } else { return obj.toString(); } } public Representation createRepresentation(Object data, Resource resource, Request request, Response response) { return null; } @Override protected Object read(InputStream in) throws IOException { //TODO: character set BufferedReader reader = new BufferedReader( new InputStreamReader( in ) ); StringBuilder text = new StringBuilder(); String line = null; while( ( line = reader.readLine() ) != null ) { text.append( line ); } return JSONObject.fromObject(text.toString()); } }