killbill-uncached

jaxrs: fix Content-Type in ExceptionMapperBase Make sure

9/22/2014 9:29:14 AM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/ExceptionMapperBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/ExceptionMapperBase.java
index 469153a..7e32c1d 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/ExceptionMapperBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/ExceptionMapperBase.java
@@ -21,9 +21,6 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.killbill.billing.BillingExceptionBase;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.catalog.api.CatalogApiException;
@@ -41,6 +38,8 @@ import org.killbill.billing.util.api.TagApiException;
 import org.killbill.billing.util.api.TagDefinitionApiException;
 import org.killbill.billing.util.email.EmailApiException;
 import org.killbill.billing.util.jackson.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 
@@ -113,86 +112,64 @@ public abstract class ExceptionMapperBase {
     protected Response buildConflictingRequestResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
         log.warn("Conflicting request", e);
-        return buildConflictingRequestResponse(exceptionToString(e), uriInfo);
-    }
 
-    private Response buildConflictingRequestResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.CONFLICT)
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.CONFLICT);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
     protected Response buildNotFoundResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
         log.info("Not found", e);
-        return buildNotFoundResponse(exceptionToString(e), uriInfo);
-    }
 
-    private Response buildNotFoundResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.NOT_FOUND)
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.NOT_FOUND);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
     protected Response buildBadRequestResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
         log.warn("Bad request", e);
-        return buildBadRequestResponse(exceptionToString(e), uriInfo);
-    }
 
-    private Response buildBadRequestResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.BAD_REQUEST)
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.BAD_REQUEST);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
     protected Response buildAuthorizationErrorResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
         log.warn("Authorization error", e);
-        return buildAuthorizationErrorResponse(exceptionToString(e), uriInfo);
-    }
 
-    private Response buildAuthorizationErrorResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.UNAUTHORIZED) // TODO Forbidden?
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        // TODO Forbidden?
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.UNAUTHORIZED);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
     protected Response buildInternalErrorResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
         log.warn("Internal error", e);
-        return buildInternalErrorResponse(exceptionToString(e), uriInfo);
-    }
 
-    private Response buildInternalErrorResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.INTERNAL_SERVER_ERROR)
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
     protected Response buildPluginTimeoutResponse(final Exception e, final UriInfo uriInfo) {
-        return buildPluginTimeoutResponse(exceptionToString(e), uriInfo);
-    }
-
-    private Response buildPluginTimeoutResponse(final String error, final UriInfo uriInfo) {
-        return Response.status(Status.ACCEPTED)
-                       .entity(error)
-                       .type(MediaType.TEXT_PLAIN_TYPE)
-                       .build();
+        final Response.ResponseBuilder responseBuilder = Response.status(Status.ACCEPTED);
+        serializeException(e, responseBuilder);
+        return responseBuilder.build();
     }
 
+    private void serializeException(final Exception e, final Response.ResponseBuilder responseBuilder) {
+        final BillingExceptionJson billingExceptionJson = new BillingExceptionJson(e);
 
-    private String exceptionToString(final Exception e) {
         try {
-            return mapper.writeValueAsString(new BillingExceptionJson(e));
-        } catch (final JsonProcessingException jsonException) {
+            final String billingExceptionJsonAsString = mapper.writeValueAsString(billingExceptionJson);
+            responseBuilder.entity(billingExceptionJsonAsString).type(MediaType.APPLICATION_JSON);
+        } catch (JsonProcessingException jsonException) {
             log.warn("Unable to serialize exception", jsonException);
+            responseBuilder.entity(e.toString()).type(MediaType.TEXT_PLAIN_TYPE);
         }
-        return e.toString();
     }
 }