Java tutorial
/* * Weblounge: Web Content Management System * Copyright (c) 2003 - 2011 The Weblounge Team * http://entwinemedia.com/weblounge * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package ch.entwine.weblounge.kernel.publisher; import org.apache.commons.lang.StringUtils; import org.json.JSONException; import org.json.JSONObject; import org.json.XML; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * Servlet response wrapper that will convert the response from <code>xml</code> * to <code>json</code>. */ public class JSONResponseWrapper extends HttpServletResponseWrapper { /** Byte array used to buffer the servlet output */ private ByteArrayServletOutputStream servletOutputStream = null; /** Print writer */ private PrintWriter printWriter = null; /** The character encoding */ protected String encoding = null; /** * Creates a new response wrapper that will convert the response from * <code>xml</code> to <code>json</code>. * * @param response * the response to wrap */ public JSONResponseWrapper(HttpServletResponse response) { super(response); response.setContentType("application/json"); } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#setContentLength(int) */ @Override public void setContentLength(int len) { // ignore } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#setContentType(java.lang.String) */ @Override public void setContentType(String type) { // ignore } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#getOutputStream() */ @Override public ServletOutputStream getOutputStream() throws IOException { if (printWriter != null) throw new IllegalStateException("Servlet already accessed print writer"); if (servletOutputStream == null) { servletOutputStream = new ByteArrayServletOutputStream(); } return servletOutputStream; } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#getWriter() */ @Override public PrintWriter getWriter() throws IOException { if (printWriter == null && servletOutputStream != null) throw new IllegalStateException("Servlet already accessed output stream"); if (printWriter == null) { servletOutputStream = new ByteArrayServletOutputStream(); encoding = getResponse().getCharacterEncoding(); Writer writer = new OutputStreamWriter(servletOutputStream, encoding); printWriter = new PrintWriter(writer); } return printWriter; } /** * Finishes the response by converting the current content of the buffered * servlet output stream to json and writing it to the original response. * * @throws IOException * if writing the response fails * @throws JSONException * if the conversion to json failed */ public void finishResponse() throws IOException, JSONException { if (servletOutputStream != null) { if (printWriter != null) { printWriter.flush(); } // Make sure there is a default encoding if (encoding == null) encoding = "utf-8"; // Convert the current xml content to json Writer responseWriter = getResponse().getWriter(); String xml = null; if (StringUtils.isNotBlank(encoding)) { xml = new String(servletOutputStream.getBytes(), encoding); } else { xml = new String(servletOutputStream.getBytes(), "utf-8"); } JSONObject json = XML.toJSONObject(xml); // Write json back to the response responseWriter.write(json.toString()); } } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#resetBuffer() */ @Override public void resetBuffer() { servletOutputStream = null; printWriter = null; super.resetBuffer(); } /** * {@inheritDoc} * * @see javax.servlet.ServletResponseWrapper#reset() */ @Override public void reset() { servletOutputStream = null; printWriter = null; super.reset(); } }