Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index c988902..ef004a4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -21,6 +21,7 @@ package org.killbill.billing.jaxrs.resources;
import java.math.BigDecimal;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
@@ -265,15 +266,19 @@ public class AccountResource extends JaxRsResourceBase {
@ApiResponse(code = 404, message = "Account not found")})
public Response getAccountBundles(@PathParam("accountId") final String accountId,
@QueryParam(QUERY_EXTERNAL_KEY) final String externalKey,
+ @QueryParam(QUERY_BUNDLES_FILTER) final String bundlesFilter,
@javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, SubscriptionApiException {
final TenantContext tenantContext = context.createContext(request);
final UUID uuid = UUID.fromString(accountId);
- final Account account = accountUserApi.getAccountById(uuid, tenantContext);
+ final Account account = accountUserApi.getAccountById(uuid, tenantContext);
+ boolean filter = (null != bundlesFilter && !bundlesFilter.isEmpty());
final List<SubscriptionBundle> bundles = (externalKey != null) ?
- subscriptionApi.getSubscriptionBundlesForAccountIdAndExternalKey(uuid, externalKey, tenantContext) :
- subscriptionApi.getSubscriptionBundlesForAccountId(uuid, tenantContext);
+ ((filter) ? filterBundles(subscriptionApi.getSubscriptionBundlesForAccountIdAndExternalKey(uuid, externalKey, tenantContext), Arrays.asList(bundlesFilter.split(","))) :
+ subscriptionApi.getSubscriptionBundlesForAccountIdAndExternalKey(uuid, externalKey, tenantContext)):
+ ((filter) ? filterBundles(subscriptionApi.getSubscriptionBundlesForAccountId(uuid, tenantContext), Arrays.asList(bundlesFilter.split(","))) :
+ subscriptionApi.getSubscriptionBundlesForAccountId(uuid, tenantContext));
final Collection<BundleJson> result = Collections2.transform(bundles, new Function<SubscriptionBundle, BundleJson>() {
@Override
@@ -289,6 +294,16 @@ public class AccountResource extends JaxRsResourceBase {
return Response.status(Status.OK).entity(result).build();
}
+ private List<SubscriptionBundle> filterBundles(final List<SubscriptionBundle> subscriptionBundlesForAccountId, final List<String> bundlesFilter) {
+ List<SubscriptionBundle> result = new ArrayList<SubscriptionBundle>();
+ for (SubscriptionBundle subscription : subscriptionBundlesForAccountId) {
+ if (bundlesFilter.contains(subscription.getId().toString())) {
+ result.add(subscription);
+ }
+ }
+ return result;
+ }
+
@TimedResource
@GET
@Produces(APPLICATION_JSON)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index 071fbd0..cecf4f7 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -132,6 +132,7 @@ public interface JaxrsResource {
public static final String QUERY_BUNDLE_TRANSFER_ADDON = "transferAddOn";
public static final String QUERY_BUNDLE_TRANSFER_CANCEL_IMM = "cancelImmediately";
+ public static final String QUERY_BUNDLES_FILTER = "bundlesFilter";
public static final String QUERY_DELETE_DEFAULT_PM_WITH_AUTO_PAY_OFF = "deleteDefaultPmWithAutoPayOff";
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
index ce30ab9..591dbfc 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -609,7 +609,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
}
private URI getPaymentLocation(final UriInfo uriInfo, final Payment payment) {
- return uriBuilder.buildLocation(uriInfo, PaymentResource.class, "getPayment", payment.getId());
+ return uriBuilder.buildLocation(uriInfo, PaymentResource.class, "getPayment", payment.getId(), null);
}
private PaymentTransaction findCreatedTransaction(final Payment payment, final TransactionType transactionType, @Nullable final String transactionExternalKey) {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index ec148ab..2d08e15 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -20,7 +20,9 @@ package org.killbill.billing.jaxrs.resources;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeoutException;
@@ -262,6 +264,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final UriInfo uriInfo) throws EntitlementApiException, AccountApiException, SubscriptionApiException {
+
Preconditions.checkArgument(Iterables.size(entitlements) > 0, "Subscription list mustn't be null or empty.");
for (SubscriptionJson entitlement : entitlements) {
@@ -493,14 +496,36 @@ public class SubscriptionResource extends JaxRsResourceBase {
return true;
}
@Override
- public Response doResponseOk(final List<Entitlement> entitlement) {
- return Response.status(Status.CREATED).build();
+ public Response doResponseOk(final List<Entitlement> entitlements) {
+ return uriBuilder.buildResponse(uriInfo, AccountResource.class, "getAccountBundles", entitlements.get(0).getAccountId(), buildQueryParams(buildBundleIdList(entitlements)));
}
};
final EntitlementCallCompletion<List<Entitlement>> callCompletionCreation = new EntitlementCallCompletion<List<Entitlement>>();
return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, callContext);
}
+ private List<String> buildBundleIdList(final List<Entitlement> entitlements) {
+ List<String> result = new ArrayList<String>();
+ for (Entitlement entitlement : entitlements) {
+ if (!result.contains(entitlement.getBundleId().toString())) {
+ result.add(entitlement.getBundleId().toString());
+ }
+ }
+ return result;
+ }
+
+ private Map<String, String> buildQueryParams(final List<String> bundleIdList) {
+ Map<String, String> queryParams = new HashMap<String, String>();
+ String value = "";
+ for (String bundleId : bundleIdList) {
+ if (value.equals("")) {
+ value += bundleId;
+ } else value+="," + bundleId;
+ }
+ queryParams.put(QUERY_BUNDLES_FILTER, value);
+ return queryParams;
+ }
+
@TimedResource
@PUT
@Path("/{subscriptionId:" + UUID_PATTERN + "}/uncancel")
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
index ee09c1a..23d28b4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
@@ -46,16 +46,30 @@ public class JaxrsUriBuilder {
public Response buildResponse(final UriInfo uriInfo, final Class<? extends JaxrsResource> theClass,
final String getMethodName, final Object objectId) {
- final URI location = buildLocation(uriInfo, theClass, getMethodName, objectId);
+ final URI location = buildLocation(uriInfo, theClass, getMethodName, objectId, null);
+ return !jaxrsConfig.isJaxrsLocationFullUrl() ?
+ Response.status(Response.Status.CREATED).header("Location", location.getPath()).build() :
+ Response.created(location).build();
+ }
+
+ public Response buildResponse(final UriInfo uriInfo, final Class<? extends JaxrsResource> theClass,
+ final String getMethodName, final Object objectId, final Map<String, String> params) {
+ final URI location = buildLocation(uriInfo, theClass, getMethodName, objectId, params);
return !jaxrsConfig.isJaxrsLocationFullUrl() ?
Response.status(Response.Status.CREATED).header("Location", location.getPath()).build() :
Response.created(location).build();
}
public URI buildLocation(final UriInfo uriInfo, final Class<? extends JaxrsResource> theClass,
- final String getMethodName, final Object objectId) {
+ final String getMethodName, final Object objectId, final Map<String, String> params) {
final UriBuilder uriBuilder = getUriBuilder(uriInfo.getBaseUri().getPath(), theClass, getMethodName);
+ if (null != params && !params.isEmpty()) {
+ for (final String key : params.keySet()) {
+ uriBuilder.queryParam(key, params.get(key));
+ }
+ }
+
if (jaxrsConfig.isJaxrsLocationFullUrl()) {
uriBuilder.scheme(uriInfo.getAbsolutePath().getScheme())
.host(uriInfo.getAbsolutePath().getHost())