001 /* 002 * Copyright (c) 2011, Cloudera, Inc. All Rights Reserved. 003 * 004 * Cloudera, Inc. licenses this file to you under the Apache License, 005 * Version 2.0 (the "License"). You may not use this file except in 006 * compliance with the License. You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 011 * CONDITIONS OF ANY KIND, either express or implied. See the License for 012 * the specific language governing permissions and limitations under the 013 * License. 014 */ 015 package com.cloudera.lib.wsrs; 016 017 import org.slf4j.Logger; 018 import org.slf4j.LoggerFactory; 019 020 import javax.ws.rs.core.MediaType; 021 import javax.ws.rs.core.Response; 022 import javax.ws.rs.ext.ExceptionMapper; 023 import java.io.PrintWriter; 024 import java.io.StringWriter; 025 import java.util.LinkedHashMap; 026 import java.util.Map; 027 028 public class ExceptionProvider implements ExceptionMapper<Throwable> { 029 private static Logger LOG = LoggerFactory.getLogger(ExceptionProvider.class); 030 031 private static final String ENTER = System.getProperty("line.separator"); 032 033 protected Response createResponse(Response.Status status, Throwable throwable, boolean includeTrace) { 034 Map<String, Object> json = new LinkedHashMap<String, Object>(); 035 json.put("statusCode", status.getStatusCode()); 036 json.put("reason", status.getReasonPhrase()); 037 json.put("message", getOneLineMessage(throwable)); 038 json.put("exception", throwable.getClass().getName()); 039 if (includeTrace) { 040 StringWriter writer = new StringWriter(); 041 PrintWriter printWriter = new PrintWriter(writer); 042 throwable.printStackTrace(printWriter); 043 printWriter.close(); 044 json.put("trace", writer.toString()); 045 } 046 log(status, throwable); 047 return Response.status(status).type(MediaType.APPLICATION_JSON).entity(json).build(); 048 } 049 050 protected String getOneLineMessage(Throwable throwable) { 051 String message = throwable.getMessage(); 052 if (message != null) { 053 int i = message.indexOf(ENTER); 054 if (i > -1) { 055 message = message.substring(0, i); 056 } 057 } 058 return message; 059 } 060 061 protected void log(Response.Status status, Throwable throwable) { 062 LOG.debug("{}", throwable.getMessage(), throwable); 063 } 064 065 @Override 066 public Response toResponse(Throwable throwable) { 067 return createResponse(Response.Status.BAD_REQUEST, throwable, false); 068 } 069 070 }