killbill-aplcache

#219 - Fixes during code review - Updated getAccountBundles()

10/28/2016 4:44:42 PM

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())