killbill-memoizeit

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

7/18/2012 6:25:13 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
index d870189..22810bf 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
@@ -16,6 +16,11 @@
 
 package com.ning.billing.jaxrs.resources;
 
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeoutException;
+
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.DefaultValue;
@@ -28,12 +33,8 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.core.Response.Status;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.TimeoutException;
+import javax.ws.rs.core.UriInfo;
 
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormatter;
@@ -41,8 +42,6 @@ import org.joda.time.format.ISODateTimeFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.inject.Inject;
-import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
@@ -50,8 +49,8 @@ import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
 import com.ning.billing.invoice.api.InvoiceCreationEvent;
+import com.ning.billing.invoice.api.NullInvoiceEvent;
 import com.ning.billing.jaxrs.json.CustomFieldJson;
 import com.ning.billing.jaxrs.json.SubscriptionJsonNoEvents;
 import com.ning.billing.jaxrs.util.Context;
@@ -65,10 +64,13 @@ import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.userrequest.CompletionUserRequestBase;
 
+import com.google.inject.Inject;
+
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 @Path(JaxrsResource.SUBSCRIPTIONS_PATH)
 public class SubscriptionResource extends JaxRsResourceBase {
+
     private static final Logger log = LoggerFactory.getLogger(SubscriptionResource.class);
     private static final String ID_PARAM_NAME = "subscriptionId";
     private static final String CUSTOM_FIELD_URI = JaxrsResource.CUSTOM_FIELDS + "/{" + ID_PARAM_NAME + ":" + UUID_PATTERN + "}";
@@ -82,9 +84,12 @@ public class SubscriptionResource extends JaxRsResourceBase {
     private final KillbillEventHandler killbillHandler;
 
     @Inject
-    public SubscriptionResource(final JaxrsUriBuilder uriBuilder, final EntitlementUserApi entitlementApi,
-            final Context context, final KillbillEventHandler killbillHandler,
-            final TagUserApi tagUserApi, final CustomFieldUserApi customFieldUserApi) {
+    public SubscriptionResource(final JaxrsUriBuilder uriBuilder,
+                                final EntitlementUserApi entitlementApi,
+                                final Context context,
+                                final KillbillEventHandler killbillHandler,
+                                final TagUserApi tagUserApi,
+                                final CustomFieldUserApi customFieldUserApi) {
         super(uriBuilder, tagUserApi, customFieldUserApi);
         this.uriBuilder = uriBuilder;
         this.entitlementApi = entitlementApi;
@@ -96,34 +101,22 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Path("/{subscriptionId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getSubscription(@PathParam("subscriptionId") final String subscriptionId) throws EntitlementUserApiException {
-
-        try {
-            final UUID uuid = UUID.fromString(subscriptionId);
-            final Subscription subscription = entitlementApi.getSubscriptionFromId(uuid);
-            final SubscriptionJsonNoEvents json = new SubscriptionJsonNoEvents(subscription);
-            return Response.status(Status.OK).entity(json).build();
-        } catch (EntitlementUserApiException e) {
-            if (e.getCode() == ErrorCode.ENT_INVALID_SUBSCRIPTION_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                throw e;
-            }
-        }
+        final UUID uuid = UUID.fromString(subscriptionId);
+        final Subscription subscription = entitlementApi.getSubscriptionFromId(uuid);
+        final SubscriptionJsonNoEvents json = new SubscriptionJsonNoEvents(subscription);
+        return Response.status(Status.OK).entity(json).build();
     }
 
-
     @POST
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response createSubscription(final SubscriptionJsonNoEvents subscription,
-            @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
-            @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
-            @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") final long timeoutSec,
-            @HeaderParam(HDR_CREATED_BY) final String createdBy,
-            @HeaderParam(HDR_REASON) final String reason,
-            @HeaderParam(HDR_COMMENT) final String comment) {
-
-
+                                       @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
+                                       @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
+                                       @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") final long timeoutSec,
+                                       @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                       @HeaderParam(HDR_REASON) final String reason,
+                                       @HeaderParam(HDR_COMMENT) final String comment) {
         final SubscriptionCallCompletionCallback<Subscription> callback = new SubscriptionCallCompletionCallback<Subscription>() {
             @Override
             public Subscription doOperation(final CallContext ctx) throws EntitlementUserApiException, InterruptedException, TimeoutException {
@@ -132,8 +125,8 @@ public class SubscriptionResource extends JaxRsResourceBase {
                 final UUID uuid = UUID.fromString(subscription.getBundleId());
 
                 final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(subscription.getProductName(),
-                        ProductCategory.valueOf(subscription.getProductCategory()),
-                        BillingPeriod.valueOf(subscription.getBillingPeriod()), subscription.getPriceList(), null);
+                                                                       ProductCategory.valueOf(subscription.getProductCategory()),
+                                                                       BillingPeriod.valueOf(subscription.getBillingPeriod()), subscription.getPriceList(), null);
                 return entitlementApi.createSubscription(uuid, spec, inputDate, ctx);
             }
 
@@ -147,6 +140,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                 return uriBuilder.buildResponse(SubscriptionResource.class, "getSubscription", createdSubscription.getId());
             }
         };
+
         final SubscriptionCallCompletion<Subscription> callCompletionCreation = new SubscriptionCallCompletion<Subscription>();
         return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
     }
@@ -156,32 +150,25 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Path("/{subscriptionId:" + UUID_PATTERN + "}")
     public Response changeSubscriptionPlan(final SubscriptionJsonNoEvents subscription,
-            @PathParam("subscriptionId") final String subscriptionId,
-            @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
-            @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
-            @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") final long timeoutSec,
-            @HeaderParam(HDR_CREATED_BY) final String createdBy,
-            @HeaderParam(HDR_REASON) final String reason,
-            @HeaderParam(HDR_COMMENT) final String comment) {
-
+                                           @PathParam("subscriptionId") final String subscriptionId,
+                                           @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
+                                           @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
+                                           @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") final long timeoutSec,
+                                           @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                           @HeaderParam(HDR_REASON) final String reason,
+                                           @HeaderParam(HDR_COMMENT) final String comment) {
         final SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
 
             private boolean isImmediateOp = true;
 
             @Override
-            public Response doOperation(final CallContext ctx)
-            throws EntitlementUserApiException, InterruptedException,
-            TimeoutException {
-                try {
-                    final UUID uuid = UUID.fromString(subscriptionId);
-                    final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
-                    final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
-                    isImmediateOp = current.changePlan(subscription.getProductName(), BillingPeriod.valueOf(subscription.getBillingPeriod()), subscription.getPriceList(), inputDate, ctx);
-                    return Response.status(Status.OK).build();
-                } catch (EntitlementUserApiException e) {
-                    log.warn("Subscription not found: " + subscriptionId, e);
-                    return Response.status(Status.NO_CONTENT).build();
-                }
+            public Response doOperation(final CallContext ctx) throws EntitlementUserApiException, InterruptedException,
+                                                                      TimeoutException {
+                final UUID uuid = UUID.fromString(subscriptionId);
+                final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
+                final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
+                isImmediateOp = current.changePlan(subscription.getProductName(), BillingPeriod.valueOf(subscription.getBillingPeriod()), subscription.getPriceList(), inputDate, ctx);
+                return Response.status(Status.OK).build();
             }
 
             @Override
@@ -190,21 +177,15 @@ public class SubscriptionResource extends JaxRsResourceBase {
             }
 
             @Override
-            public Response doResponseOk(final Response operationResponse) {
+            public Response doResponseOk(final Response operationResponse) throws EntitlementUserApiException {
                 if (operationResponse.getStatus() != Status.OK.getStatusCode()) {
                     return operationResponse;
                 }
-                try {
-                    return getSubscription(subscriptionId);
-                } catch (EntitlementUserApiException e) {
-                    if (e.getCode() == ErrorCode.ENT_GET_INVALID_BUNDLE_ID.getCode()) {
-                        return Response.status(Status.NO_CONTENT).build();
-                    } else {
-                        return Response.status(Status.INTERNAL_SERVER_ERROR).build();
-                    }
-                }
+
+                return getSubscription(subscriptionId);
             }
         };
+
         final SubscriptionCallCompletion<Response> callCompletionCreation = new SubscriptionCallCompletion<Response>();
         return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
     }
@@ -213,59 +194,42 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Path("/{subscriptionId:" + UUID_PATTERN + "}/uncancel")
     @Produces(APPLICATION_JSON)
     public Response uncancelSubscriptionPlan(@PathParam("subscriptionId") final String subscriptionId,
-            @HeaderParam(HDR_CREATED_BY) final String createdBy,
-            @HeaderParam(HDR_REASON) final String reason,
-            @HeaderParam(HDR_COMMENT) final String comment) {
-        try {
-            final UUID uuid = UUID.fromString(subscriptionId);
-            final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
-
-            current.uncancel(context.createContext(createdBy, reason, comment));
-            return Response.status(Status.OK).build();
-        } catch (EntitlementUserApiException e) {
-            if (e.getCode() == ErrorCode.ENT_INVALID_SUBSCRIPTION_ID.getCode()) {
-                return Response.status(Status.NO_CONTENT).build();
-            } else {
-                log.info(String.format("Failed to uncancel plan for subscription %s", subscriptionId), e);
-                return Response.status(Status.BAD_REQUEST).build();
-            }
-        }
+                                             @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                             @HeaderParam(HDR_REASON) final String reason,
+                                             @HeaderParam(HDR_COMMENT) final String comment) throws EntitlementUserApiException {
+        final UUID uuid = UUID.fromString(subscriptionId);
+        final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
+
+        current.uncancel(context.createContext(createdBy, reason, comment));
+        return Response.status(Status.OK).build();
     }
 
     @DELETE
     @Path("/{subscriptionId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response cancelSubscriptionPlan(@PathParam("subscriptionId") final String subscriptionId,
-            @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
-            @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
-            @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("5") final long timeoutSec,
-            @HeaderParam(HDR_CREATED_BY) final String createdBy,
-            @HeaderParam(HDR_REASON) final String reason,
-            @HeaderParam(HDR_COMMENT) final String comment) {
-
+                                           @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
+                                           @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") final Boolean callCompletion,
+                                           @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("5") final long timeoutSec,
+                                           @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) {
         final SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
 
             private boolean isImmediateOp = true;
 
             @Override
             public Response doOperation(final CallContext ctx)
-            throws EntitlementUserApiException, InterruptedException,
-            TimeoutException {
-                try {
-                    final UUID uuid = UUID.fromString(subscriptionId);
-
-                    final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
-
-                    final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
-                    isImmediateOp = current.cancel(inputDate, false, ctx);
-                    return Response.status(Status.OK).build();
-                } catch (EntitlementUserApiException e) {
-                    if (e.getCode() == ErrorCode.ENT_INVALID_SUBSCRIPTION_ID.getCode()) {
-                        return Response.status(Status.NO_CONTENT).build();
-                    } else {
-                        throw e;
-                    }
-                }
+                    throws EntitlementUserApiException, InterruptedException,
+                           TimeoutException {
+                final UUID uuid = UUID.fromString(subscriptionId);
+
+                final Subscription current = entitlementApi.getSubscriptionFromId(uuid);
+
+                final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
+                isImmediateOp = current.cancel(inputDate, false, ctx);
+                return Response.status(Status.OK).build();
             }
 
             @Override
@@ -278,6 +242,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                 return operationResponse;
             }
         };
+
         final SubscriptionCallCompletion<Response> callCompletionCreation = new SubscriptionCallCompletion<Response>();
         return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
     }
@@ -289,9 +254,9 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onSubscriptionTransition(EffectiveSubscriptionEvent curEventEffective) {
+        public void onSubscriptionTransition(final EffectiveSubscriptionEvent curEventEffective) {
             log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ",
-                    curEventEffective.getUserToken(), curEventEffective.getTransitionType(),  curEventEffective.getRemainingEventsForUserOperation()));
+                                   curEventEffective.getUserToken(), curEventEffective.getTransitionType(), curEventEffective.getRemainingEventsForUserOperation()));
         }
 
         @Override
@@ -301,7 +266,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onInvoiceCreation(InvoiceCreationEvent curEvent) {
+        public void onInvoiceCreation(final InvoiceCreationEvent curEvent) {
             log.info(String.format("Got event InvoiceCreationNotification token = %s ", curEvent.getUserToken()));
             if (curEvent.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
                 notifyForCompletion();
@@ -309,34 +274,35 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onPaymentInfo(PaymentInfoEvent curEvent) {
+        public void onPaymentInfo(final PaymentInfoEvent curEvent) {
             log.info(String.format("Got event PaymentInfo token = %s ", curEvent.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onPaymentError(PaymentErrorEvent curEvent) {
+        public void onPaymentError(final PaymentErrorEvent curEvent) {
             log.info(String.format("Got event PaymentError token = %s ", curEvent.getUserToken()));
             notifyForCompletion();
         }
     }
 
     private interface SubscriptionCallCompletionCallback<T> {
+
         public T doOperation(final CallContext ctx) throws EntitlementUserApiException, InterruptedException, TimeoutException;
 
         public boolean isImmOperation();
 
-        public Response doResponseOk(final T operationResponse);
+        public Response doResponseOk(final T operationResponse) throws EntitlementUserApiException;
     }
 
     private class SubscriptionCallCompletion<T> {
 
         public Response withSynchronization(final SubscriptionCallCompletionCallback<T> callback,
-                final long timeoutSec,
-                final boolean callCompletion,
-                final String createdBy,
-                final String reason,
-                final String comment) {
+                                            final long timeoutSec,
+                                            final boolean callCompletion,
+                                            final String createdBy,
+                                            final String reason,
+                                            final String comment) {
 
             final CallContext ctx = context.createContext(createdBy, reason, comment);
             final CompletionUserRequestSubscription waiter = callCompletion ? new CompletionUserRequestSubscription(ctx.getUserToken()) : null;
@@ -376,12 +342,13 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response createCustomFields(@PathParam(ID_PARAM_NAME) final String id,
-            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,
-                context.createContext(createdBy, reason, comment));
+                                       final List<CustomFieldJson> customFields,
+                                       @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) {
+        return super.createCustomFields(UUID.fromString(id), customFields, uriInfo,
+                                        context.createContext(createdBy, reason, comment));
     }
 
     @DELETE
@@ -389,12 +356,13 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final String id,
-            @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,
-                context.createContext(createdBy, reason, comment));
+                                       @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,
+                                       @javax.ws.rs.core.Context final UriInfo uriInfo) {
+        return super.deleteCustomFields(UUID.fromString(id), customFieldList, uriInfo,
+                                        context.createContext(createdBy, reason, comment));
     }
 
     @GET
@@ -409,13 +377,13 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response createTags(@PathParam(ID_PARAM_NAME) final String id,
-            @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,
-            @javax.ws.rs.core.Context final UriInfo uriInfo) {
+                               @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,
+                               @javax.ws.rs.core.Context final UriInfo uriInfo) {
         return super.createTags(UUID.fromString(id), tagList, uriInfo,
-                context.createContext(createdBy, reason, comment));
+                                context.createContext(createdBy, reason, comment));
     }
 
     @DELETE
@@ -423,13 +391,13 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response deleteTags(@PathParam(ID_PARAM_NAME) final String id,
-            @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,
-                context.createContext(createdBy, reason, comment));
+                               @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,
+                               @javax.ws.rs.core.Context final UriInfo uriInfo) {
+        return super.deleteTags(UUID.fromString(id), tagList, uriInfo,
+                                context.createContext(createdBy, reason, comment));
     }
 
     @Override