killbill-memoizeit

entitlement: fetch accountBCD once when building the EventsStream Signed-off-by:

4/19/2018 5:57:34 AM

Details

diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
index 91ddb72..f05669d 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
@@ -158,14 +158,6 @@ public class DefaultEntitlementApi extends DefaultEntitlementApiBase implements 
         return iterator.next();
     }
 
-    private EntitlementSpecifier getFirstEntitlementSpecifier(final BaseEntitlementWithAddOnsSpecifier entitlementWithAddOnsSpecifier) throws SubscriptionBaseApiException {
-        if (entitlementWithAddOnsSpecifier.getEntitlementSpecifier() == null || !entitlementWithAddOnsSpecifier.getEntitlementSpecifier().iterator().hasNext()) {
-            throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_INVALID_ENTITLEMENT_SPECIFIER);
-        } else {
-            return entitlementWithAddOnsSpecifier.getEntitlementSpecifier().iterator().next();
-        }
-    }
-
     @Override
     public List<UUID> createBaseEntitlementsWithAddOns(final UUID accountId, final Iterable<BaseEntitlementWithAddOnsSpecifier> originalBaseEntitlementWithAddOnsSpecifiers, final boolean renameCancelledBundleIfExist, final Iterable<PluginProperty> properties, final CallContext callContext) throws EntitlementApiException {
         logCreateEntitlementsWithAOs(log, originalBaseEntitlementWithAddOnsSpecifiers);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/OptimizedProxyBlockingStateDao.java b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/OptimizedProxyBlockingStateDao.java
index 7df7117..9e9ba63 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/OptimizedProxyBlockingStateDao.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/OptimizedProxyBlockingStateDao.java
@@ -69,6 +69,7 @@ public class OptimizedProxyBlockingStateDao extends ProxyBlockingStateDao {
      * @param baseSubscription                  base subscription (ProductCategory.BASE) associated with that bundle
      * @param subscription                      subscription for which to build blocking states
      * @param allSubscriptionsForBundle         all subscriptions associated with that bundle
+     * @param accountBCD                        account BCD
      * @param catalog                           full Catalog
      * @param context                           call context
      * @return blocking states for that subscription
@@ -81,6 +82,7 @@ public class OptimizedProxyBlockingStateDao extends ProxyBlockingStateDao {
                                                         @Nullable final SubscriptionBase baseSubscription,
                                                         final SubscriptionBase subscription,
                                                         final Collection<SubscriptionBase> allSubscriptionsForBundle,
+                                                        final int accountBCD,
                                                         final Catalog catalog,
                                                         final InternalTenantContext context) throws EntitlementApiException {
         // blockable id points to a subscription, but make sure it's an add-on
@@ -95,6 +97,7 @@ public class OptimizedProxyBlockingStateDao extends ProxyBlockingStateDao {
                                                                                                                             bundle,
                                                                                                                             baseSubscription,
                                                                                                                             allSubscriptionsForBundle,
+                                                                                                                            accountBCD,
                                                                                                                             catalog,
                                                                                                                             context));
 
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
index 667b114..5ff2339 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
@@ -85,9 +85,12 @@ public class DefaultEventsStream implements EventsStream {
     private BlockingState entitlementCancelEvent;
     private EntitlementState entitlementState;
 
-    public DefaultEventsStream(final ImmutableAccountData account, final SubscriptionBaseBundle bundle,
-                               final Collection<BlockingState> blockingStates, final BlockingChecker blockingChecker,
-                               @Nullable final SubscriptionBase baseSubscription, final SubscriptionBase subscription,
+    public DefaultEventsStream(final ImmutableAccountData account,
+                               final SubscriptionBaseBundle bundle,
+                               final Collection<BlockingState> blockingStates,
+                               final BlockingChecker blockingChecker,
+                               @Nullable final SubscriptionBase baseSubscription,
+                               final SubscriptionBase subscription,
                                final Collection<SubscriptionBase> allSubscriptionsForBundle,
                                final int defaultBillCycleDayLocal,
                                final InternalTenantContext contextWithValidAccountRecordId, final DateTime utcNow) {
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/EventsStreamBuilder.java b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/EventsStreamBuilder.java
index 63281e8..637ad39 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/EventsStreamBuilder.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/EventsStreamBuilder.java
@@ -149,8 +149,10 @@ public class EventsStreamBuilder {
     public AccountEventsStreams buildForAccount(final Map<UUID, List<SubscriptionBase>> subscriptions, final Catalog catalog, final InternalTenantContext internalTenantContext) throws EntitlementApiException {
         // Retrieve the account
         final ImmutableAccountData account;
+        final int accountBCD;
         try {
             account = accountInternalApi.getImmutableAccountDataByRecordId(internalTenantContext.getAccountRecordId(), internalTenantContext);
+            accountBCD = accountInternalApi.getBCD(account.getId(), internalTenantContext);
         } catch (final AccountApiException e) {
             throw new EntitlementApiException(e);
         }
@@ -227,6 +229,7 @@ public class EventsStreamBuilder {
                                                                                      baseSubscription,
                                                                                      subscription,
                                                                                      allSubscriptionsForBundle,
+                                                                                     accountBCD,
                                                                                      catalog,
                                                                                      internalTenantContext);
 
@@ -244,6 +247,7 @@ public class EventsStreamBuilder {
                                                                      subscription,
                                                                      allSubscriptionsForBundle,
                                                                      blockingStates,
+                                                                     accountBCD,
                                                                      bcdCache,
                                                                      catalog,
                                                                      internalTenantContext);
@@ -269,7 +273,25 @@ public class EventsStreamBuilder {
         return buildForEntitlement(bundle, subscription, subscriptionsForBundle, internalTenantContext);
     }
 
-    public EventsStream buildForEntitlement(final SubscriptionBaseBundle bundle, final SubscriptionBase subscription, final Collection<SubscriptionBase> allSubscriptionsForBundle, final InternalTenantContext internalTenantContext) throws EntitlementApiException {
+    public EventsStream buildForEntitlement(final SubscriptionBaseBundle bundle,
+                                            final SubscriptionBase subscription,
+                                            final Collection<SubscriptionBase> allSubscriptionsForBundle,
+                                            final InternalTenantContext internalTenantContext) throws EntitlementApiException {
+        final int accountBCD;
+        try {
+            accountBCD = accountInternalApi.getBCD(bundle.getAccountId(), internalTenantContext);
+        } catch (final AccountApiException e) {
+            throw new EntitlementApiException(e);
+        }
+
+        return buildForEntitlement(bundle, subscription, allSubscriptionsForBundle, accountBCD, internalTenantContext);
+    }
+
+    public EventsStream buildForEntitlement(final SubscriptionBaseBundle bundle,
+                                            final SubscriptionBase subscription,
+                                            final Collection<SubscriptionBase> allSubscriptionsForBundle,
+                                            final int accountBCD,
+                                            final InternalTenantContext internalTenantContext) throws EntitlementApiException {
         final SubscriptionBase baseSubscription = findBaseSubscription(allSubscriptionsForBundle);
 
         final ImmutableAccountData account;
@@ -285,7 +307,7 @@ public class EventsStreamBuilder {
         final List<BlockingState> blockingStatesForAccount = defaultBlockingStateDao.getBlockingAllForAccountRecordId(catalog, internalTenantContext);
 
         final Map<UUID, Integer> bcdCache = new HashMap<UUID, Integer>();
-        return buildForEntitlement(blockingStatesForAccount, account, bundle, baseSubscription, subscription, allSubscriptionsForBundle, bcdCache, catalog, internalTenantContext);
+        return buildForEntitlement(blockingStatesForAccount, account, bundle, baseSubscription, subscription, allSubscriptionsForBundle, accountBCD, bcdCache, catalog, internalTenantContext);
     }
 
     // Special signature for OptimizedProxyBlockingStateDao to save some DAO calls
@@ -294,10 +316,11 @@ public class EventsStreamBuilder {
                                             final SubscriptionBaseBundle bundle,
                                             final SubscriptionBase baseSubscription,
                                             final Collection<SubscriptionBase> allSubscriptionsForBundle,
+                                            final int accountBCD,
                                             final Catalog catalog,
                                             final InternalTenantContext internalTenantContext) throws EntitlementApiException {
         final Map<UUID, Integer> bcdCache = new HashMap<UUID, Integer>();
-        return buildForEntitlement(blockingStatesForAccount, account, bundle, baseSubscription, baseSubscription, allSubscriptionsForBundle, bcdCache, catalog, internalTenantContext);
+        return buildForEntitlement(blockingStatesForAccount, account, bundle, baseSubscription, baseSubscription, allSubscriptionsForBundle, accountBCD, bcdCache, catalog, internalTenantContext);
     }
 
     private EventsStream buildForEntitlement(final Collection<BlockingState> blockingStatesForAccount,
@@ -306,6 +329,7 @@ public class EventsStreamBuilder {
                                              @Nullable final SubscriptionBase baseSubscription,
                                              final SubscriptionBase subscription,
                                              final Collection<SubscriptionBase> allSubscriptionsForBundle,
+                                             final int accountBCD,
                                              final Map<UUID, Integer> bcdCache,
                                              final Catalog catalog,
                                              final InternalTenantContext internalTenantContext) throws EntitlementApiException {
@@ -350,6 +374,7 @@ public class EventsStreamBuilder {
                                                                              baseSubscription,
                                                                              subscription,
                                                                              allSubscriptionsForBundle,
+                                                                             accountBCD,
                                                                              catalog,
                                                                              internalTenantContext);
         }
@@ -360,7 +385,7 @@ public class EventsStreamBuilder {
         blockingStateSet.addAll(subscriptionBlockingStates);
         final List<BlockingState> blockingStates = ProxyBlockingStateDao.sortedCopy(blockingStateSet);
 
-        return buildForEntitlement(account, bundle, baseSubscription, subscription, allSubscriptionsForBundle, blockingStates, bcdCache, catalog, internalTenantContext);
+        return buildForEntitlement(account, bundle, baseSubscription, subscription, allSubscriptionsForBundle, blockingStates, accountBCD, bcdCache, catalog, internalTenantContext);
     }
 
     private EventsStream buildForEntitlement(final ImmutableAccountData account,
@@ -369,12 +394,12 @@ public class EventsStreamBuilder {
                                              final SubscriptionBase subscription,
                                              final Collection<SubscriptionBase> allSubscriptionsForBundle,
                                              final Collection<BlockingState> blockingStates,
+                                             final int accountBCD,
                                              final Map<UUID, Integer> bcdCache,
                                              final Catalog catalog,
                                              final InternalTenantContext internalTenantContext) throws EntitlementApiException {
 
         try {
-            final int accountBCD = accountInternalApi.getBCD(account.getId(), internalTenantContext);
             final int defaultAlignmentDay = subscriptionInternalApi.getDefaultBillCycleDayLocal(bcdCache,
                                                                                                 subscription,
                                                                                                 baseSubscription,
@@ -394,8 +419,6 @@ public class EventsStreamBuilder {
                                            clock.getUTCNow());
         } catch (final SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
-        } catch (final AccountApiException e) {
-            throw new EntitlementApiException(e);
         }
     }
 
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
index 0e1b822..610f4b1 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
+import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.entitlement.EntitlementTestSuiteWithEmbeddedDB;
 import org.killbill.billing.entitlement.api.BlockingState;
@@ -36,8 +37,8 @@ import com.google.common.collect.ImmutableMap;
 public class TestBlockingDao extends EntitlementTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow", description = "Check BlockingStateDao with a single service")
-    public void testDaoWithOneService() {
-        final UUID uuid = UUID.randomUUID();
+    public void testDaoWithOneService() throws AccountApiException {
+        final UUID uuid = createAccount(getAccountData(1)).getId();
         final String overdueStateName = "WayPassedItMan";
         final String service = "TEST";
 
@@ -71,7 +72,7 @@ public class TestBlockingDao extends EntitlementTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow", description = "Check BlockingStateDao with multiple services")
     public void testDaoWithMultipleServices() throws Exception {
-        final UUID uuid = UUID.randomUUID();
+        final UUID uuid = createAccount(getAccountData(1)).getId();
         final String overdueStateName = "WayPassedItMan";
         final String service1 = "TEST";