package org.karmaexchange.util; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URI; import java.net.URISyntaxException; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.apache.commons.httpclient.HttpURL; import org.apache.commons.httpclient.HttpsURL; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class ServletUtil { private static final Logger logger = Logger.getLogger(ServletUtil.class.getName()); public static void setResponse(HttpServletResponse resp, WebApplicationException err) throws IOException { Response errMsg = err.getResponse(); resp.setStatus(errMsg.getStatus()); resp.setContentType("application/json"); PrintWriter writer = new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), "UTF-8")); writer.print(getExceptionResponseAsJsonString(err)); writer.flush(); } public static String getExceptionResponseAsJsonString(WebApplicationException errToDump) { Response errMsg = errToDump.getResponse(); StringWriter sw = new StringWriter(); Throwable errWhileDumping = null; try { ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(sw, errMsg.getEntity()); } catch (JsonGenerationException e) { errWhileDumping = e; } catch (JsonMappingException e) { errWhileDumping = e; } catch (IOException e) { errWhileDumping = e; } if (errWhileDumping != null) { logger.log(Level.WARNING, "Failed to error response to json: " + errWhileDumping.getMessage()); return "Failed to convert response to json: " + errWhileDumping.getMessage(); } else { return sw.toString(); } } public static URI getRequestUri(HttpServletRequest req) { try { return new URI(req.getRequestURL().toString()); } catch (URISyntaxException e) { // Impossible. throw new RuntimeException(e); } } public static String getBaseUri(HttpServletRequest req) { return getBaseUri(req, false); } public static String getBaseUriWithPort(HttpServletRequest req) { return getBaseUri(req, true); } private static String getBaseUri(HttpServletRequest req, boolean alwaysSpecifyPort) { URI requestUri = getRequestUri(req); int port = requestUri.getPort(); String scheme = requestUri.getScheme(); if ((port == -1) && alwaysSpecifyPort) { if (scheme.equalsIgnoreCase(new String(HttpURL.DEFAULT_SCHEME))) { port = HttpURL.DEFAULT_PORT; } else if (scheme.equalsIgnoreCase(new String(HttpsURL.DEFAULT_SCHEME))) { port = HttpsURL.DEFAULT_PORT; } } String portString = port == -1 ? "" : ":" + port; return scheme + "://" + requestUri.getHost() + portString; } public static Cookie getCookie(HttpServletRequest req, String cookieName) { Cookie[] cookies = req.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equalsIgnoreCase(cookieName)) { return cookie; } } } return null; } }