killbill-memoizeit

jaxrs: revisit exception handling for AccountResource Signed-off-by:

7/18/2012 6:17:19 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementRepairExceptionMapper.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementRepairExceptionMapper.java
index b6495dc..6152550 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementRepairExceptionMapper.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementRepairExceptionMapper.java
@@ -16,17 +16,58 @@
 
 package com.ning.billing.jaxrs.mappers;
 
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
 
+import com.ning.billing.ErrorCode;
 import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
 
 @Provider
 public class EntitlementRepairExceptionMapper extends ExceptionMapperBase implements ExceptionMapper<EntitlementRepairException> {
 
+    private final UriInfo uriInfo;
+
+    public EntitlementRepairExceptionMapper(@Context final UriInfo uriInfo) {
+        this.uriInfo = uriInfo;
+    }
+
     @Override
     public Response toResponse(final EntitlementRepairException exception) {
-        return null;
+        if (exception.getCode() == ErrorCode.ENT_REPAIR_AO_CREATE_BEFORE_BP_START.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_BP_RECREATE_MISSING_AO.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_BP_RECREATE_MISSING_AO_CREATE.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_INVALID_DELETE_SET.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_MISSING_AO_DELETE_EVENT.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NEW_EVENT_BEFORE_LAST_AO_REMAINING.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NEW_EVENT_BEFORE_LAST_BP_REMAINING.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NON_EXISTENT_DELETE_EVENT.getCode()) {
+            return buildNotFoundResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_SUB_EMPTY.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_SUB_RECREATE_NOT_EMPTY.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_BUNDLE.getCode()) {
+            return buildNotFoundResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_SUBSCRIPTION.getCode()) {
+            return buildNotFoundResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_TYPE.getCode()) {
+            return buildNotFoundResponse(exception, uriInfo);
+        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_VIEW_CHANGED.getCode()) {
+            return buildBadRequestResponse(exception, uriInfo);
+        } else {
+            return buildBadRequestResponse(exception, uriInfo);
+        }
     }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementUserApiExceptionMapper.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementUserApiExceptionMapper.java
index f40d505..aaeb86f 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementUserApiExceptionMapper.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/EntitlementUserApiExceptionMapper.java
@@ -78,37 +78,7 @@ public class EntitlementUserApiExceptionMapper extends ExceptionMapperBase imple
             return buildNotFoundResponse(exception, uriInfo);
         } else if (exception.getCode() == ErrorCode.ENT_RECREATE_BAD_STATE.getCode()) {
             return buildInternalErrorResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_AO_CREATE_BEFORE_BP_START.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_BP_RECREATE_MISSING_AO.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_BP_RECREATE_MISSING_AO_CREATE.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_INVALID_DELETE_SET.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_MISSING_AO_DELETE_EVENT.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NEW_EVENT_BEFORE_LAST_AO_REMAINING.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NEW_EVENT_BEFORE_LAST_BP_REMAINING.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_NON_EXISTENT_DELETE_EVENT.getCode()) {
-            return buildNotFoundResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_SUB_EMPTY.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_SUB_RECREATE_NOT_EMPTY.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_BUNDLE.getCode()) {
-            return buildNotFoundResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_SUBSCRIPTION.getCode()) {
-            return buildNotFoundResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_UNKNOWN_TYPE.getCode()) {
-            return buildNotFoundResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_REPAIR_VIEW_CHANGED.getCode()) {
-            return buildBadRequestResponse(exception, uriInfo);
-        } else if (exception.getCode() == ErrorCode.ENT_UNCANCEL_BAD_STATE.getCode()) {
+        }  else if (exception.getCode() == ErrorCode.ENT_UNCANCEL_BAD_STATE.getCode()) {
             return buildInternalErrorResponse(exception, uriInfo);
         } else {
             return buildBadRequestResponse(exception, uriInfo);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
index d251e80..1c260ec 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.jaxrs.resources;
 
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
@@ -38,10 +37,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 com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountData;
@@ -80,7 +75,6 @@ import com.ning.billing.util.dao.ObjectType;
 import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Collections2;
-import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -91,7 +85,6 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 @Path(JaxrsResource.ACCOUNTS_PATH)
 public class AccountResource extends JaxRsResourceBase {
 
-    private static final Logger log = LoggerFactory.getLogger(AccountResource.class);
     private static final String ID_PARAM_NAME = "accountId";
 
     private final AccountUserApi accountApi;
@@ -101,7 +94,6 @@ public class AccountResource extends JaxRsResourceBase {
     private final InvoicePaymentApi invoicePaymentApi;
     private final PaymentApi paymentApi;
     private final Context context;
-    private final JaxrsUriBuilder uriBuilder;
 
     @Inject
     public AccountResource(final JaxrsUriBuilder uriBuilder,
@@ -111,11 +103,10 @@ public class AccountResource extends JaxRsResourceBase {
                            final InvoicePaymentApi invoicePaymentApi,
                            final PaymentApi paymentApi,
                            final EntitlementTimelineApi timelineApi,
-                           final CustomFieldUserApi customFieldUserApi,
                            final TagUserApi tagUserApi,
+                           final CustomFieldUserApi customFieldUserApi,
                            final Context context) {
         super(uriBuilder, tagUserApi, customFieldUserApi);
-        this.uriBuilder = uriBuilder;
         this.accountApi = accountApi;
         this.entitlementApi = entitlementApi;
         this.invoiceApi = invoiceApi;
@@ -128,67 +119,37 @@ public class AccountResource extends JaxRsResourceBase {
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
-    public Response getAccount(@PathParam("accountId") final String accountId) {
-        try {
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-
-            final AccountJson json = new AccountJson(account);
-            return Response.status(Status.OK).entity(json).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        }
+    public Response getAccount(@PathParam("accountId") final String accountId) throws AccountApiException {
+        final Account account = accountApi.getAccountById(UUID.fromString(accountId));
 
+        final AccountJson json = new AccountJson(account);
+        return Response.status(Status.OK).entity(json).build();
     }
 
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}/" + BUNDLES)
     @Produces(APPLICATION_JSON)
-    public Response getAccountBundles(@PathParam("accountId") final String accountId) {
-        try {
-            final UUID uuid = UUID.fromString(accountId);
-            accountApi.getAccountById(uuid);
-
-            final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(uuid);
-            final Collection<BundleJsonNoSubscriptions> result = Collections2.transform(bundles, new Function<SubscriptionBundle, BundleJsonNoSubscriptions>() {
-                @Override
-                public BundleJsonNoSubscriptions apply(final SubscriptionBundle input) {
-                    return new BundleJsonNoSubscriptions(input);
-                }
-            });
-            return Response.status(Status.OK).entity(result).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
+    public Response getAccountBundles(@PathParam("accountId") final String accountId) throws AccountApiException {
+        final UUID uuid = UUID.fromString(accountId);
+        accountApi.getAccountById(uuid);
+
+        final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(uuid);
+        final Collection<BundleJsonNoSubscriptions> result = Collections2.transform(bundles, new Function<SubscriptionBundle, BundleJsonNoSubscriptions>() {
+            @Override
+            public BundleJsonNoSubscriptions apply(final SubscriptionBundle input) {
+                return new BundleJsonNoSubscriptions(input);
             }
-        }
+        });
+        return Response.status(Status.OK).entity(result).build();
     }
 
     @GET
     @Produces(APPLICATION_JSON)
-    public Response getAccountByKey(@QueryParam(QUERY_EXTERNAL_KEY) final String externalKey) {
-        try {
-            Account account = null;
-            if (externalKey != null) {
-                account = accountApi.getAccountByKey(externalKey);
-            }
-            if (account == null) {
-                return Response.status(Status.NO_CONTENT).build();
-            }
-            final AccountJson json = new AccountJson(account);
-            return Response.status(Status.OK).entity(json).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_KEY.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        }
+    public Response getAccountByKey(@QueryParam(QUERY_EXTERNAL_KEY) final String externalKey) throws AccountApiException {
+        final Account account = accountApi.getAccountByKey(externalKey);
+        final AccountJson json = new AccountJson(account);
+
+        return Response.status(Status.OK).entity(json).build();
     }
 
     @POST
@@ -197,19 +158,10 @@ public class AccountResource extends JaxRsResourceBase {
     public Response createAccount(final AccountJson json,
                                   @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                   @HeaderParam(HDR_REASON) final String reason,
-                                  @HeaderParam(HDR_COMMENT) final String comment) {
-
-        try {
-            final AccountData data = json.toAccountData();
-            final Account account = accountApi.createAccount(data, context.createContext(createdBy, reason, comment));
-            return uriBuilder.buildResponse(AccountResource.class, "getAccount", account.getId());
-        } catch (AccountApiException e) {
-            final String error = String.format("Failed to create account %s", json);
-            log.info(error, e);
-            return Response.status(Status.BAD_REQUEST).entity(error).build();
-        } catch (IllegalArgumentException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+                                  @HeaderParam(HDR_COMMENT) final String comment) throws AccountApiException {
+        final AccountData data = json.toAccountData();
+        final Account account = accountApi.createAccount(data, context.createContext(createdBy, reason, comment));
+        return uriBuilder.buildResponse(AccountResource.class, "getAccount", account.getId());
     }
 
     @PUT
@@ -220,22 +172,11 @@ public class AccountResource extends JaxRsResourceBase {
                                   @PathParam("accountId") final String accountId,
                                   @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                   @HeaderParam(HDR_REASON) final String reason,
-                                  @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final AccountData data = json.toAccountData();
-            final UUID uuid = UUID.fromString(accountId);
-            accountApi.updateAccount(uuid, data, context.createContext(createdBy, reason, comment));
-            return getAccount(accountId);
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                log.info(String.format("Failed to update account %s with %s", accountId, json), e);
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        } catch (IllegalArgumentException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+                                  @HeaderParam(HDR_COMMENT) final String comment) throws AccountApiException {
+        final AccountData data = json.toAccountData();
+        final UUID uuid = UUID.fromString(accountId);
+        accountApi.updateAccount(uuid, data, context.createContext(createdBy, reason, comment));
+        return getAccount(accountId);
     }
 
     // Not supported
@@ -258,55 +199,41 @@ public class AccountResource extends JaxRsResourceBase {
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}/" + TIMELINE)
     @Produces(APPLICATION_JSON)
-    public Response getAccountTimeline(@PathParam("accountId") final String accountIdString) {
-        try {
-            final UUID accountId = UUID.fromString(accountIdString);
-            final Account account = accountApi.getAccountById(accountId);
+    public Response getAccountTimeline(@PathParam("accountId") final String accountIdString) throws AccountApiException, PaymentApiException, EntitlementRepairException {
+        final UUID accountId = UUID.fromString(accountIdString);
+        final Account account = accountApi.getAccountById(accountId);
 
-            // Get the invoices
-            final List<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());
+        // Get the invoices
+        final List<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());
 
-            // Get the payments
-            final List<Payment> payments = paymentApi.getAccountPayments(accountId);
+        // Get the payments
+        final List<Payment> payments = paymentApi.getAccountPayments(accountId);
 
-            // Get the refunds
-            final List<Refund> refunds = paymentApi.getAccountRefunds(account);
-            final Multimap<UUID, Refund> refundsByPayment = ArrayListMultimap.<UUID, Refund>create();
-            for (final Refund refund : refunds) {
-                refundsByPayment.put(refund.getPaymentId(), refund);
-            }
+        // Get the refunds
+        final List<Refund> refunds = paymentApi.getAccountRefunds(account);
+        final Multimap<UUID, Refund> refundsByPayment = ArrayListMultimap.<UUID, Refund>create();
+        for (final Refund refund : refunds) {
+            refundsByPayment.put(refund.getPaymentId(), refund);
+        }
 
-            // Get the chargebacks
-            final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId);
-            final Multimap<UUID, InvoicePayment> chargebacksByPayment = ArrayListMultimap.<UUID, InvoicePayment>create();
-            for (final InvoicePayment chargeback : chargebacks) {
-                chargebacksByPayment.put(chargeback.getPaymentId(), chargeback);
-            }
+        // Get the chargebacks
+        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId);
+        final Multimap<UUID, InvoicePayment> chargebacksByPayment = ArrayListMultimap.<UUID, InvoicePayment>create();
+        for (final InvoicePayment chargeback : chargebacks) {
+            chargebacksByPayment.put(chargeback.getPaymentId(), chargeback);
+        }
 
-            // Get the bundles
-            final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(account.getId());
-            final List<BundleTimeline> bundlesTimeline = new LinkedList<BundleTimeline>();
-            for (final SubscriptionBundle cur : bundles) {
-                bundlesTimeline.add(timelineApi.getBundleRepair(cur.getId()));
-            }
+        // Get the bundles
+        final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(account.getId());
+        final List<BundleTimeline> bundlesTimeline = new LinkedList<BundleTimeline>();
+        for (final SubscriptionBundle cur : bundles) {
+            bundlesTimeline.add(timelineApi.getBundleRepair(cur.getId()));
+        }
 
-            final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundlesTimeline,
-                                                                     refundsByPayment, chargebacksByPayment);
+        final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundlesTimeline,
+                                                                 refundsByPayment, chargebacksByPayment);
 
-            return Response.status(Status.OK).entity(json).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        } catch (PaymentApiException e) {
-            log.error(e.getMessage());
-            return Response.status(Status.INTERNAL_SERVER_ERROR).build();
-        } catch (EntitlementRepairException e) {
-            log.error(e.getMessage());
-            return Response.status(Status.INTERNAL_SERVER_ERROR).build();
-        }
+        return Response.status(Status.OK).entity(json).build();
     }
 
     /*
@@ -316,19 +243,11 @@ public class AccountResource extends JaxRsResourceBase {
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}/" + EMAIL_NOTIFICATIONS)
     @Produces(APPLICATION_JSON)
-    public Response getEmailNotificationsForAccount(@PathParam("accountId") final String accountId) {
-        try {
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-            final InvoiceEmailJson invoiceEmailJson = new InvoiceEmailJson(accountId, account.isNotifiedForInvoices());
+    public Response getEmailNotificationsForAccount(@PathParam("accountId") final String accountId) throws AccountApiException {
+        final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+        final InvoiceEmailJson invoiceEmailJson = new InvoiceEmailJson(accountId, account.isNotifiedForInvoices());
 
-            return Response.status(Status.OK).entity(invoiceEmailJson).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        }
+        return Response.status(Status.OK).entity(invoiceEmailJson).build();
     }
 
     @PUT
@@ -339,23 +258,15 @@ public class AccountResource extends JaxRsResourceBase {
                                                     @PathParam("accountId") final String accountIdString,
                                                     @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                                     @HeaderParam(HDR_REASON) final String reason,
-                                                    @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final UUID accountId = UUID.fromString(accountIdString);
-            final Account account = accountApi.getAccountById(accountId);
+                                                    @HeaderParam(HDR_COMMENT) final String comment) throws AccountApiException {
+        final UUID accountId = UUID.fromString(accountIdString);
+        final Account account = accountApi.getAccountById(accountId);
 
-            final MutableAccountData mutableAccountData = account.toMutableAccountData();
-            mutableAccountData.setIsNotifiedForInvoices(json.isNotifiedForInvoices());
-            accountApi.updateAccount(accountId, mutableAccountData, context.createContext(createdBy, reason, comment));
+        final MutableAccountData mutableAccountData = account.toMutableAccountData();
+        mutableAccountData.setIsNotifiedForInvoices(json.isNotifiedForInvoices());
+        accountApi.updateAccount(accountId, mutableAccountData, context.createContext(createdBy, reason, comment));
 
-            return Response.status(Status.OK).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        }
+        return Response.status(Status.OK).build();
     }
 
     /*
@@ -367,17 +278,13 @@ public class AccountResource extends JaxRsResourceBase {
     @Produces(APPLICATION_JSON)
     public Response getPayments(@PathParam("accountId") final String accountId,
                                 @QueryParam(QUERY_PAYMENT_LAST4_CC) final String last4CC,
-                                @QueryParam(QUERY_PAYMENT_NAME_ON_CC) final String nameOnCC) {
-        try {
-            final List<Payment> payments = paymentApi.getAccountPayments(UUID.fromString(accountId));
-            final List<PaymentJsonSimple> result = new ArrayList<PaymentJsonSimple>(payments.size());
-            for (final Payment cur : payments) {
-                result.add(new PaymentJsonSimple(cur));
-            }
-            return Response.status(Status.OK).entity(result).build();
-        } catch (PaymentApiException e) {
-            return Response.status(Status.BAD_REQUEST).build();
+                                @QueryParam(QUERY_PAYMENT_NAME_ON_CC) final String nameOnCC) throws PaymentApiException {
+        final List<Payment> payments = paymentApi.getAccountPayments(UUID.fromString(accountId));
+        final List<PaymentJsonSimple> result = new ArrayList<PaymentJsonSimple>(payments.size());
+        for (final Payment cur : payments) {
+            result.add(new PaymentJsonSimple(cur));
         }
+        return Response.status(Status.OK).entity(result).build();
     }
 
     @POST
@@ -389,26 +296,12 @@ public class AccountResource extends JaxRsResourceBase {
                                         @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                         @HeaderParam(HDR_REASON) final String reason,
                                         @HeaderParam(HDR_COMMENT) final String comment,
-                                        @javax.ws.rs.core.Context final UriInfo uriInfo) {
-        try {
-            final PaymentMethod data = json.toPaymentMethod();
-            final Account account = accountApi.getAccountById(data.getAccountId());
+                                        @javax.ws.rs.core.Context final UriInfo uriInfo) throws AccountApiException, PaymentApiException {
+        final PaymentMethod data = json.toPaymentMethod();
+        final Account account = accountApi.getAccountById(data.getAccountId());
 
-            final UUID paymentMethodId = paymentApi.addPaymentMethod(data.getPluginName(), account, isDefault, data.getPluginDetail(), context.createContext(createdBy, reason, comment));
-            return uriBuilder.buildResponse(PaymentMethodResource.class, "getPaymentMethod", paymentMethodId, uriInfo.getBaseUri().toString());
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        } catch (PaymentApiException e) {
-            final String error = String.format("Failed to create payment Method  %s", json);
-            log.info(error, e);
-            return Response.status(Status.BAD_REQUEST).entity(error).build();
-        } catch (IllegalArgumentException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+        final UUID paymentMethodId = paymentApi.addPaymentMethod(data.getPluginName(), account, isDefault, data.getPluginDetail(), context.createContext(createdBy, reason, comment));
+        return uriBuilder.buildResponse(PaymentMethodResource.class, "getPaymentMethod", paymentMethodId, uriInfo.getBaseUri().toString());
     }
 
     @GET
@@ -417,28 +310,17 @@ public class AccountResource extends JaxRsResourceBase {
     public Response getPaymentMethods(@PathParam("accountId") final String accountId,
                                       @QueryParam(QUERY_PAYMENT_METHOD_PLUGIN_INFO) @DefaultValue("false") final Boolean withPluginInfo,
                                       @QueryParam(QUERY_PAYMENT_LAST4_CC) final String last4CC,
-                                      @QueryParam(QUERY_PAYMENT_NAME_ON_CC) final String nameOnCC) {
-
-        try {
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-            final List<PaymentMethod> methods = paymentApi.getPaymentMethods(account, withPluginInfo);
-            final List<PaymentMethodJson> json = new ArrayList<PaymentMethodJson>(Collections2.transform(methods, new Function<PaymentMethod, PaymentMethodJson>() {
-                @Override
-                public PaymentMethodJson apply(final PaymentMethod input) {
-                    return PaymentMethodJson.toPaymentMethodJson(account, input);
-                }
-            }));
-            return Response.status(Status.OK).entity(json).build();
-
-        } catch (PaymentApiException e) {
-            return Response.status(Status.NOT_FOUND).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
+                                      @QueryParam(QUERY_PAYMENT_NAME_ON_CC) final String nameOnCC) throws AccountApiException, PaymentApiException {
+        final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+        final List<PaymentMethod> methods = paymentApi.getPaymentMethods(account, withPluginInfo);
+        final List<PaymentMethodJson> json = new ArrayList<PaymentMethodJson>(Collections2.transform(methods, new Function<PaymentMethod, PaymentMethodJson>() {
+            @Override
+            public PaymentMethodJson apply(final PaymentMethod input) {
+                return PaymentMethodJson.toPaymentMethodJson(account, input);
             }
-        }
+        }));
+
+        return Response.status(Status.OK).entity(json).build();
     }
 
     @PUT
@@ -449,22 +331,10 @@ public class AccountResource extends JaxRsResourceBase {
                                             @PathParam("paymentMethodId") final String paymentMethodId,
                                             @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                             @HeaderParam(HDR_REASON) final String reason,
-                                            @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-            paymentApi.setDefaultPaymentMethod(account, UUID.fromString(paymentMethodId), context.createContext(createdBy, reason, comment));
-            return Response.status(Status.OK).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        } catch (PaymentApiException e) {
-            return Response.status(Status.NOT_FOUND).build();
-        } catch (IllegalArgumentException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+                                            @HeaderParam(HDR_COMMENT) final String comment) throws AccountApiException, PaymentApiException {
+        final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+        paymentApi.setDefaultPaymentMethod(account, UUID.fromString(paymentMethodId), context.createContext(createdBy, reason, comment));
+        return Response.status(Status.OK).build();
     }
 
     /*
@@ -473,27 +343,17 @@ public class AccountResource extends JaxRsResourceBase {
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}/" + REFUNDS)
     @Produces(APPLICATION_JSON)
-    public Response getRefunds(@PathParam("accountId") final String accountId) {
-
-        try {
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-            List<Refund> refunds = paymentApi.getAccountRefunds(account);
-            List<RefundJson> result = new ArrayList<RefundJson>(Collections2.transform(refunds, new Function<Refund, RefundJson>() {
-                @Override
-                public RefundJson apply(Refund input) {
-                    return new RefundJson(input);
-                }
-            }));
-            return Response.status(Status.OK).entity(result).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Status.BAD_REQUEST).build();
+    public Response getRefunds(@PathParam("accountId") final String accountId) throws AccountApiException, PaymentApiException {
+        final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+        final List<Refund> refunds = paymentApi.getAccountRefunds(account);
+        final List<RefundJson> result = new ArrayList<RefundJson>(Collections2.transform(refunds, new Function<Refund, RefundJson>() {
+            @Override
+            public RefundJson apply(Refund input) {
+                return new RefundJson(input);
             }
-        } catch (PaymentApiException e) {
-            return Response.status(Status.BAD_REQUEST).build();
-        }
+        }));
+
+        return Response.status(Status.OK).entity(result).build();
     }
 
     /*
@@ -515,8 +375,9 @@ public class AccountResource extends JaxRsResourceBase {
                                        final List<CustomFieldJson> customFields,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
-                                       @HeaderParam(HDR_COMMENT) final String comment) {
-        return super.createCustomFields(UUID.fromString(id), customFields,
+                                       @HeaderParam(HDR_COMMENT) final String comment,
+                                       @javax.ws.rs.core.Context final UriInfo uriInfo) {
+        return super.createCustomFields(UUID.fromString(id), customFields, uriInfo,
                                         context.createContext(createdBy, reason, comment));
     }
 
@@ -528,8 +389,9 @@ public class AccountResource extends JaxRsResourceBase {
                                        @QueryParam(QUERY_CUSTOM_FIELDS) final String customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
-                                       @HeaderParam(HDR_COMMENT) final String comment) {
-        return super.deleteCustomFields(UUID.fromString(id), customFieldList,
+                                       @HeaderParam(HDR_COMMENT) final String comment,
+                                       @javax.ws.rs.core.Context final UriInfo uriInfo) {
+        return super.deleteCustomFields(UUID.fromString(id), customFieldList, uriInfo,
                                         context.createContext(createdBy, reason, comment));
     }
 
@@ -565,9 +427,9 @@ public class AccountResource extends JaxRsResourceBase {
                                @QueryParam(QUERY_TAGS) final String tagList,
                                @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                @HeaderParam(HDR_REASON) final String reason,
-                               @HeaderParam(HDR_COMMENT) final String comment) {
-
-        return super.deleteTags(UUID.fromString(id), tagList,
+                               @HeaderParam(HDR_COMMENT) final String comment,
+                               @javax.ws.rs.core.Context final UriInfo uriInfo) {
+        return super.deleteTags(UUID.fromString(id), tagList, uriInfo,
                                 context.createContext(createdBy, reason, comment));
     }
 
@@ -586,7 +448,7 @@ public class AccountResource extends JaxRsResourceBase {
         for (final AccountEmail email : emails) {
             emailsJson.add(new AccountEmailJson(email.getAccountId().toString(), email.getEmail()));
         }
-        return Response.status(Response.Status.OK).entity(emailsJson).build();
+        return Response.status(Status.OK).entity(emailsJson).build();
     }
 
     @POST
@@ -597,27 +459,16 @@ public class AccountResource extends JaxRsResourceBase {
                              @PathParam(ID_PARAM_NAME) final String id,
                              @HeaderParam(HDR_CREATED_BY) final String createdBy,
                              @HeaderParam(HDR_REASON) final String reason,
-                             @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final UUID accountId = UUID.fromString(id);
+                             @HeaderParam(HDR_COMMENT) final String comment,
+                             @javax.ws.rs.core.Context final UriInfo uriInfo) throws AccountApiException {
+        final UUID accountId = UUID.fromString(id);
 
-            // Make sure the account exist or we will confuse the history and auditing code
-            if (accountApi.getAccountById(accountId) == null) {
-                return Response.status(Response.Status.BAD_REQUEST).entity("Account id " + accountId + " does not exist").build();
-            }
+        // Make sure the account exist or we will confuse the history and auditing code
+        accountApi.getAccountById(accountId);
 
-            accountApi.addEmail(accountId, json.toAccountEmail(), context.createContext(createdBy, reason, comment));
+        accountApi.addEmail(accountId, json.toAccountEmail(), context.createContext(createdBy, reason, comment));
 
-            return uriBuilder.buildResponse(AccountResource.class, "getEmails", json.getAccountId());
-        } catch (RuntimeException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        } catch (AccountApiException e) {
-            if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            }
-        }
+        return uriBuilder.buildResponse(AccountResource.class, "getEmails", json.getAccountId());
     }
 
     @DELETE
@@ -628,16 +479,12 @@ public class AccountResource extends JaxRsResourceBase {
                                 @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                 @HeaderParam(HDR_REASON) final String reason,
                                 @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final UUID accountId = UUID.fromString(id);
-            final AccountEmailJson accountEmailJson = new AccountEmailJson(id, email);
-            final AccountEmail accountEmail = accountEmailJson.toAccountEmail();
-            accountApi.removeEmail(accountId, accountEmail, context.createContext(createdBy, reason, comment));
-
-            return Response.status(Response.Status.OK).build();
-        } catch (RuntimeException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+        final UUID accountId = UUID.fromString(id);
+        final AccountEmailJson accountEmailJson = new AccountEmailJson(id, email);
+        final AccountEmail accountEmail = accountEmailJson.toAccountEmail();
+        accountApi.removeEmail(accountId, accountEmail, context.createContext(createdBy, reason, comment));
+
+        return Response.status(Status.OK).build();
     }
 
     @Override