Details
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 29883f1..80f8253 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
@@ -29,6 +29,7 @@ import java.util.UUID;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
@@ -81,6 +82,7 @@ public class AccountResource implements BaseJaxrsResource {
private final Context context;
private final JaxrsUriBuilder uriBuilder;
+
@Inject
public AccountResource(final JaxrsUriBuilder uriBuilder,
final AccountUserApi accountApi,
@@ -157,17 +159,22 @@ public class AccountResource implements BaseJaxrsResource {
@POST
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
- public Response createAccount(AccountJson json) {
+ 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 {
-
AccountData data = json.toAccountData();
- final Account account = accountApi.createAccount(data, null, null, context.createContext());
+ final Account account = accountApi.createAccount(data, null, null, context.createContext(createdBy, reason, comment));
URI uri = UriBuilder.fromPath(account.getId().toString()).build();
return uriBuilder.buildResponse(AccountResource.class, "getAccount", account.getId());
} catch (AccountApiException e) {
- log.info(String.format("Failed to create account %s", json), e);
- return Response.status(Status.BAD_REQUEST).build();
+ 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();
}
}
@@ -175,11 +182,15 @@ public class AccountResource implements BaseJaxrsResource {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
@Path("/{accountId:" + UUID_PATTERN + "}")
- public Response updateAccount(AccountJson json, @PathParam("accountId") String accountId) {
+ public Response updateAccount(final AccountJson json,
+ @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 {
AccountData data = json.toAccountData();
UUID uuid = UUID.fromString(accountId);
- accountApi.updateAccount(uuid, data, context.createContext());
+ 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()) {
@@ -188,6 +199,8 @@ public class AccountResource implements BaseJaxrsResource {
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();
}
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BaseJaxrsResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BaseJaxrsResource.java
index 79f4b04..0857c57 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BaseJaxrsResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BaseJaxrsResource.java
@@ -17,12 +17,22 @@ package com.ning.billing.jaxrs.resources;
public interface BaseJaxrsResource {
- public static final String API_PREFIX = "";
- public static final String API_VERSION = "/1.0";
+ public static final String API_PREFIX = "";
+ public static final String API_VERSION = "/1.0";
+ public static final String API_POSTFIX = "/kb";
+
+ public static final String PREFIX = API_PREFIX + API_VERSION + API_POSTFIX;
public static final String TIMELINE = "timeline";
/*
+ * Metadata Additional headers
+ */
+ public static String HDR_CREATED_BY = "X-Killbill-CreatedBy";
+ public static String HDR_REASON = "X-Killbill-Reason";
+ public static String HDR_COMMENT = "X-Killbill-Comment";
+
+ /*
* Patterns
*/
public static String UUID_PATTERN = "\\w+-\\w+-\\w+-\\w+-\\w+";
@@ -36,12 +46,12 @@ public interface BaseJaxrsResource {
public static final String QUERY_CALL_TIMEOUT = "call_timeout_sec";
public static final String ACCOUNTS = "accounts";
- public static final String ACCOUNTS_PATH = API_PREFIX + API_VERSION + "/" + ACCOUNTS;
+ public static final String ACCOUNTS_PATH = PREFIX + "/" + ACCOUNTS;
public static final String BUNDLES = "bundles";
- public static final String BUNDLES_PATH = API_PREFIX + API_VERSION + "/" + BUNDLES;
+ public static final String BUNDLES_PATH = PREFIX + "/" + BUNDLES;
public static final String SUBSCRIPTIONS = "subscriptions";
- public static final String SUBSCRIPTIONS_PATH = API_PREFIX + API_VERSION + "/" + SUBSCRIPTIONS;
+ public static final String SUBSCRIPTIONS_PATH = PREFIX + "/" + SUBSCRIPTIONS;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
index d3bb1a2..e62d48e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
@@ -24,6 +24,7 @@ import java.util.UUID;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -102,14 +103,20 @@ public class BundleResource implements BaseJaxrsResource {
@POST
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
- public Response createBundle(final BundleJsonNoSubsciptions json) {
+ public Response createBundle(final BundleJsonNoSubsciptions json,
+ @HeaderParam(HDR_CREATED_BY) final String createdBy,
+ @HeaderParam(HDR_REASON) final String reason,
+ @HeaderParam(HDR_COMMENT) final String comment) {
try {
UUID accountId = UUID.fromString(json.getAccountId());
- final SubscriptionBundle bundle = entitlementApi.createBundleForAccount(accountId, json.getExternalKey(), context.createContext());
+ final SubscriptionBundle bundle = entitlementApi.createBundleForAccount(accountId, json.getExternalKey(),
+ context.createContext(createdBy, reason, comment));
return uriBuilder.buildResponse(BundleResource.class, "getBundle", bundle.getId());
} catch (EntitlementUserApiException e) {
log.info(String.format("Failed to create bundle %s", json), e);
return Response.status(Status.BAD_REQUEST).build();
+ } catch (IllegalArgumentException e) {
+ return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
}
}
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 259fe9f..309b57b 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
@@ -26,6 +26,7 @@ import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
@@ -141,9 +142,12 @@ public class SubscriptionResource implements BaseJaxrsResource {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response createSubscription(final SubscriptionJsonNoEvents subscription,
- final @QueryParam(QUERY_REQUESTED_DT) String requestedDate,
- final @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") Boolean callCompletion,
- final @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") long timeoutSec) {
+ @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) {
SubscriptionCallCompletionCallback<Subscription> callback = new SubscriptionCallCompletionCallback<Subscription>() {
@@ -168,7 +172,7 @@ public class SubscriptionResource implements BaseJaxrsResource {
}
};
SubscriptionCallCompletion<Subscription> callCompletionCreation = new SubscriptionCallCompletion<Subscription>();
- return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion);
+ return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
}
@PUT
@@ -176,10 +180,13 @@ public class SubscriptionResource implements BaseJaxrsResource {
@Consumes(APPLICATION_JSON)
@Path("/{subscriptionId:" + UUID_PATTERN + "}")
public Response changeSubscriptionPlan(final SubscriptionJsonNoEvents subscription,
- final @PathParam("subscriptionId") String subscriptionId,
- final @QueryParam(QUERY_REQUESTED_DT) String requestedDate,
- final @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") Boolean callCompletion,
- final @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") long timeoutSec) {
+ @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) {
SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
@@ -222,18 +229,21 @@ public class SubscriptionResource implements BaseJaxrsResource {
}
};
SubscriptionCallCompletion<Response> callCompletionCreation = new SubscriptionCallCompletion<Response>();
- return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion);
+ return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
}
@PUT
@Path("/{subscriptionId:" + UUID_PATTERN + "}/uncancel")
@Produces(APPLICATION_JSON)
- public Response uncancelSubscriptionPlan(@PathParam("subscriptionId") String subscriptionId) {
+ 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 {
UUID uuid = UUID.fromString(subscriptionId);
Subscription current = entitlementApi.getSubscriptionFromId(uuid);
- current.uncancel(context.createContext());
+ 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()) {
@@ -249,9 +259,12 @@ public class SubscriptionResource implements BaseJaxrsResource {
@Path("/{subscriptionId:" + UUID_PATTERN + "}")
@Produces(APPLICATION_JSON)
public Response cancelSubscriptionPlan(final @PathParam("subscriptionId") String subscriptionId,
- final @QueryParam(QUERY_REQUESTED_DT) String requestedDate,
- final @QueryParam(QUERY_CALL_COMPLETION) @DefaultValue("false") Boolean callCompletion,
- final @QueryParam(QUERY_CALL_TIMEOUT) @DefaultValue("3") long timeoutSec) {
+ @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) {
SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
@@ -287,7 +300,7 @@ public class SubscriptionResource implements BaseJaxrsResource {
}
};
SubscriptionCallCompletion<Response> callCompletionCreation = new SubscriptionCallCompletion<Response>();
- return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion);
+ return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, createdBy, reason, comment);
}
private final static class CompletionUserRequestSubscription extends CompletionUserRequestBase {
@@ -332,9 +345,14 @@ public class SubscriptionResource implements BaseJaxrsResource {
private class SubscriptionCallCompletion<T> {
- public Response withSynchronization(final SubscriptionCallCompletionCallback<T> callback, final long timeoutSec, final boolean callCompletion) {
+ public Response withSynchronization(final SubscriptionCallCompletionCallback<T> callback,
+ final long timeoutSec,
+ final boolean callCompletion,
+ final String createdBy,
+ final String reason,
+ final String comment) {
- CallContext ctx = context.createContext();
+ CallContext ctx = context.createContext(createdBy, reason, comment);
CompletionUserRequestSubscription waiter = callCompletion ? new CompletionUserRequestSubscription(ctx.getUserToken()) : null;
try {
if (waiter != null) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/util/Context.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/util/Context.java
index 004a468..729f166 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/util/Context.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/util/Context.java
@@ -17,7 +17,9 @@ package com.ning.billing.jaxrs.util;
import java.util.UUID;
+import com.google.common.base.Preconditions;
import com.google.inject.Inject;
+import com.ning.billing.jaxrs.resources.BaseJaxrsResource;
import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.CallContextFactory;
import com.ning.billing.util.callcontext.CallOrigin;
@@ -37,8 +39,13 @@ public class Context {
this.contextFactory = factory;
}
- // Simplistic until we decide how to populate that
- public CallContext createContext() {
- return contextFactory.createCallContext("Unknown", origin, userType, UUID.randomUUID());
+ public CallContext createContext(final String createdBy, final String reason, final String comment)
+ throws IllegalArgumentException {
+ try {
+ Preconditions.checkNotNull(createdBy, String.format("Header %s needs to be set", BaseJaxrsResource.HDR_CREATED_BY));
+ return contextFactory.createCallContext(createdBy, origin, userType, UUID.randomUUID());
+ } catch (NullPointerException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ }
}
}
diff --git a/jaxrs/src/main/resources/.dont-let-git-remove-this-directory b/jaxrs/src/main/resources/.dont-let-git-remove-this-directory
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jaxrs/src/main/resources/.dont-let-git-remove-this-directory
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index 477005e..7feb542 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -109,6 +109,11 @@ public class TestJaxrsBase {
protected ClockMock clock;
protected TestBusHandler busHandler;
+ // Context informtation to be passed around
+ private static final String createdBy = "Toto";
+ private static final String reason = "i am god";
+ private static final String comment = "no comment";
+
public static void loadSystemPropertiesFromClasspath(final String resource) {
final URL url = TestJaxrsBase.class.getResource(resource);
assertNotNull(url);
@@ -375,7 +380,7 @@ public class TestJaxrsBase {
if (body != null) {
builder.setBody(body);
}
- return executeAndWait(builder, timeoutSec);
+ return executeAndWait(builder, timeoutSec, true);
}
protected Response doPut(final String uri, final String body, final Map<String, String> queryParams, final int timeoutSec) {
@@ -384,13 +389,13 @@ public class TestJaxrsBase {
if (body != null) {
builder.setBody(body);
}
- return executeAndWait(builder, timeoutSec);
+ return executeAndWait(builder, timeoutSec, true);
}
protected Response doDelete(final String uri, final Map<String, String> queryParams, final int timeoutSec) {
final String url = String.format("http://%s:%d%s", config.getServerHost(), config.getServerPort(), uri);
BoundRequestBuilder builder = getBuilderWithHeaderAndQuery("DELETE", url, queryParams);
- return executeAndWait(builder, timeoutSec);
+ return executeAndWait(builder, timeoutSec, true);
}
protected Response doGet(final String uri, final Map<String, String> queryParams, final int timeoutSec) {
@@ -400,10 +405,17 @@ public class TestJaxrsBase {
protected Response doGetWithUrl(final String url, final Map<String, String> queryParams, final int timeoutSec) {
BoundRequestBuilder builder = getBuilderWithHeaderAndQuery("GET", url, queryParams);
- return executeAndWait(builder, timeoutSec);
+ return executeAndWait(builder, timeoutSec, false);
}
- private Response executeAndWait(final BoundRequestBuilder builder, final int timeoutSec) {
+ private Response executeAndWait(final BoundRequestBuilder builder, final int timeoutSec, final boolean addContextHeader) {
+
+ if (addContextHeader) {
+ builder.addHeader(BaseJaxrsResource.HDR_CREATED_BY, createdBy);
+ builder.addHeader(BaseJaxrsResource.HDR_REASON, reason);
+ builder.addHeader(BaseJaxrsResource.HDR_COMMENT, comment);
+ }
+
Response response = null;
try {
ListenableFuture<Response> futureStatus =