killbill-memoizeit

entitlement: add RESUME_ENTITLEMENT events for RE_CREATE This

10/29/2013 7:14:43 PM

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundleTimeline.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundleTimeline.java
index 4248ef9..14bc8fb 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundleTimeline.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundleTimeline.java
@@ -17,6 +17,7 @@
 package com.ning.billing.entitlement.api;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -226,24 +227,16 @@ public class DefaultSubscriptionBundleTimeline implements SubscriptionBundleTime
         return result;
     }
 
-
     private LinkedList<SubscriptionEvent> computeSubscriptionBaseEvents(final List<Entitlement> entitlements, final DateTimeZone accountTimeZone) {
-
         final LinkedList<SubscriptionEvent> result = new LinkedList<SubscriptionEvent>();
-        for (Entitlement cur : entitlements) {
+        for (final Entitlement cur : entitlements) {
             final SubscriptionBase base = ((DefaultEntitlement) cur).getSubscriptionBase();
             final List<SubscriptionBaseTransition> baseTransitions = base.getAllTransitions();
-            for (SubscriptionBaseTransition tr : baseTransitions) {
-                final SubscriptionEventType eventType = toEventType(tr.getTransitionType());
-                if (eventType == null) {
-                    continue;
-                }
-                final SubscriptionEvent event = toSubscriptionEvent(tr, eventType, accountTimeZone);
-                insertSubscriptionEvent(event, result);
-                if (tr.getTransitionType() == SubscriptionBaseTransitionType.CREATE ||
-                    tr.getTransitionType() == SubscriptionBaseTransitionType.TRANSFER) {
-                    final SubscriptionEvent billingEvent = toSubscriptionEvent(tr, SubscriptionEventType.START_BILLING, accountTimeZone);
-                    insertSubscriptionEvent(billingEvent, result);
+            for (final SubscriptionBaseTransition tr : baseTransitions) {
+                final List<SubscriptionEventType> eventTypes = toEventTypes(tr.getTransitionType());
+                for (final SubscriptionEventType eventType : eventTypes) {
+                    final SubscriptionEvent event = toSubscriptionEvent(tr, eventType, accountTimeZone);
+                    insertSubscriptionEvent(event, result);
                 }
             }
         }
@@ -251,14 +244,12 @@ public class DefaultSubscriptionBundleTimeline implements SubscriptionBundleTime
         return result;
     }
 
-
     //
-    // Old version of code would use CANCEL/ RE_CREATE to simulate PAUSE_BILLING/RESUME_BILLING
+    // Old version of code would use CANCEL/RE_CREATE to simulate PAUSE_BILLING/RESUME_BILLING
     //
     private void sanitizeForBaseRecreateEvents(final LinkedList<SubscriptionEvent> input) {
-
-        final Set<UUID> guiltyEntitlementIds = new TreeSet<UUID>();
-        ListIterator<SubscriptionEvent> it = input.listIterator(input.size());
+        final Collection<UUID> guiltyEntitlementIds = new TreeSet<UUID>();
+        final ListIterator<SubscriptionEvent> it = input.listIterator(input.size());
         while (it.hasPrevious()) {
             final SubscriptionEvent cur = it.previous();
             if (cur.getSubscriptionEventType() == SubscriptionEventType.RESUME_BILLING) {
@@ -268,13 +259,16 @@ public class DefaultSubscriptionBundleTimeline implements SubscriptionBundleTime
             if (cur.getSubscriptionEventType() == SubscriptionEventType.STOP_BILLING &&
                 guiltyEntitlementIds.contains(cur.getEntitlementId())) {
                 guiltyEntitlementIds.remove(cur.getEntitlementId());
-                final SubscriptionEvent correctedEvent = new DefaultSubscriptionEvent((DefaultSubscriptionEvent) cur, SubscriptionEventType.PAUSE_BILLING);
-                it.set(correctedEvent);
+                final SubscriptionEvent correctedBillingEvent = new DefaultSubscriptionEvent((DefaultSubscriptionEvent) cur, SubscriptionEventType.PAUSE_BILLING);
+                it.set(correctedBillingEvent);
+
+                // Old versions of the code won't have an associated event in blocking_states - we need to add one on the fly
+                final SubscriptionEvent correctedEntitlementEvent = new DefaultSubscriptionEvent((DefaultSubscriptionEvent) cur, SubscriptionEventType.PAUSE_ENTITLEMENT);
+                it.add(correctedEntitlementEvent);
             }
         }
     }
 
-
     private void insertSubscriptionEvent(final SubscriptionEvent event, final LinkedList<SubscriptionEvent> result) {
         int index = 0;
         for (SubscriptionEvent cur : result) {
@@ -374,25 +368,25 @@ public class DefaultSubscriptionBundleTimeline implements SubscriptionBundleTime
         }
     }
 
-    private SubscriptionEventType toEventType(final SubscriptionBaseTransitionType in) {
+    private List<SubscriptionEventType> toEventTypes(final SubscriptionBaseTransitionType in) {
         switch (in) {
             case CREATE:
-                return SubscriptionEventType.START_ENTITLEMENT;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.START_ENTITLEMENT, SubscriptionEventType.START_BILLING);
             case MIGRATE_ENTITLEMENT:
-                return SubscriptionEventType.START_ENTITLEMENT;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.START_ENTITLEMENT, SubscriptionEventType.START_BILLING);
             case TRANSFER:
-                return SubscriptionEventType.START_ENTITLEMENT;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.START_ENTITLEMENT, SubscriptionEventType.START_BILLING);
             case MIGRATE_BILLING:
-                return SubscriptionEventType.START_BILLING;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.START_BILLING);
             case CHANGE:
-                return SubscriptionEventType.CHANGE;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.CHANGE);
             case CANCEL:
-                return SubscriptionEventType.STOP_BILLING;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.STOP_BILLING);
             case PHASE:
-                return SubscriptionEventType.PHASE;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.PHASE);
             // STEPH This is the old way of pausing billing; not used any longer, but kept for compatibility reason
             case RE_CREATE:
-                return SubscriptionEventType.RESUME_BILLING;
+                return ImmutableList.<SubscriptionEventType>of(SubscriptionEventType.RESUME_ENTITLEMENT, SubscriptionEventType.RESUME_BILLING);
             /*
              * Those can be ignored:
              */
@@ -402,11 +396,10 @@ public class DefaultSubscriptionBundleTimeline implements SubscriptionBundleTime
             case START_BILLING_DISABLED:
             case END_BILLING_DISABLED:
             default:
-                return null;
+                return ImmutableList.<SubscriptionEventType>of();
         }
     }
 
-
     @Override
     public UUID getAccountId() {
         return accountId;
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
index e367272..05d9adc 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultSubscriptionBundleTimeline.java
@@ -36,12 +36,12 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.entitlement.DefaultEntitlementService;
 import com.ning.billing.entitlement.EntitlementTestSuiteNoDB;
+import com.ning.billing.junction.DefaultBlockingState;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventType;
-import com.ning.billing.junction.DefaultBlockingState;
 
 import static org.testng.Assert.assertEquals;
 
@@ -116,11 +116,8 @@ public class TestDefaultSubscriptionBundleTimeline extends EntitlementTestSuiteN
         assertEquals(events.get(3).getNextPhase(), null);
     }
 
-
-
     @Test(groups = "fast")
     public void testOneEntitlementWithRecreate() throws CatalogApiException {
-
         clock.setDay(new LocalDate(2013, 1, 1));
 
         final DateTimeZone accountTimeZone = DateTimeZone.UTC;
@@ -128,7 +125,6 @@ public class TestDefaultSubscriptionBundleTimeline extends EntitlementTestSuiteN
         final UUID bundleId = UUID.randomUUID();
         final String externalKey = "foo";
 
-
         final UUID entitlementId = UUID.randomUUID();
 
         final List<SubscriptionBaseTransition> allTransitions = new ArrayList<SubscriptionBaseTransition>();
@@ -143,7 +139,6 @@ public class TestDefaultSubscriptionBundleTimeline extends EntitlementTestSuiteN
         final SubscriptionBaseTransition tr2 = createTransition(entitlementId, EventType.PHASE, null, requestedDate, effectiveDate, clock.getUTCNow(), "trial", "phase");
         allTransitions.add(tr2);
 
-
         effectiveDate = effectiveDate.plusDays(15);
         clock.addDays(15);
         final SubscriptionBaseTransition tr3 = createTransition(entitlementId, EventType.API_USER, ApiEventType.CANCEL, requestedDate, effectiveDate, clock.getUTCNow(), "phase", null);
@@ -154,41 +149,44 @@ public class TestDefaultSubscriptionBundleTimeline extends EntitlementTestSuiteN
         final SubscriptionBaseTransition tr4 = createTransition(entitlementId, EventType.API_USER, ApiEventType.RE_CREATE, requestedDate, effectiveDate, clock.getUTCNow(), null, "phase");
         allTransitions.add(tr4);
 
-
         final List<Entitlement> entitlements = new ArrayList<Entitlement>();
         final Entitlement entitlement = createEntitlement(entitlementId, allTransitions);
         entitlements.add(entitlement);
 
-        final DefaultSubscriptionBundleTimeline timeline = new DefaultSubscriptionBundleTimeline(accountTimeZone, accountId, bundleId, externalKey, entitlements, Collections.<BlockingState>emptyList());
+        final SubscriptionBundleTimeline timeline = new DefaultSubscriptionBundleTimeline(accountTimeZone, accountId, bundleId, externalKey, entitlements, Collections.<BlockingState>emptyList());
 
         assertEquals(timeline.getAccountId(), accountId);
         assertEquals(timeline.getBundleId(), bundleId);
         assertEquals(timeline.getExternalKey(), externalKey);
 
-        List<SubscriptionEvent> events = timeline.getSubscriptionEvents();
-        assertEquals(events.size(), 5);
+        final List<SubscriptionEvent> events = timeline.getSubscriptionEvents();
+        assertEquals(events.size(), 7);
 
         assertEquals(events.get(0).getEffectiveDate().compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0);
         assertEquals(events.get(1).getEffectiveDate().compareTo(new LocalDate(tr1.getEffectiveTransitionTime(), accountTimeZone)), 0);
         assertEquals(events.get(2).getEffectiveDate().compareTo(new LocalDate(tr2.getEffectiveTransitionTime(), accountTimeZone)), 0);
         assertEquals(events.get(3).getEffectiveDate().compareTo(new LocalDate(tr3.getEffectiveTransitionTime(), accountTimeZone)), 0);
-        assertEquals(events.get(4).getEffectiveDate().compareTo(new LocalDate(tr4.getEffectiveTransitionTime(), accountTimeZone)), 0);
+        assertEquals(events.get(4).getEffectiveDate().compareTo(new LocalDate(tr3.getEffectiveTransitionTime(), accountTimeZone)), 0);
+        assertEquals(events.get(5).getEffectiveDate().compareTo(new LocalDate(tr4.getEffectiveTransitionTime(), accountTimeZone)), 0);
+        assertEquals(events.get(6).getEffectiveDate().compareTo(new LocalDate(tr4.getEffectiveTransitionTime(), accountTimeZone)), 0);
 
         assertEquals(events.get(0).getSubscriptionEventType(), SubscriptionEventType.START_ENTITLEMENT);
         assertEquals(events.get(1).getSubscriptionEventType(), SubscriptionEventType.START_BILLING);
         assertEquals(events.get(2).getSubscriptionEventType(), SubscriptionEventType.PHASE);
-        assertEquals(events.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING);
-        assertEquals(events.get(4).getSubscriptionEventType(), SubscriptionEventType.RESUME_BILLING);
+        assertEquals(events.get(3).getSubscriptionEventType(), SubscriptionEventType.PAUSE_ENTITLEMENT);
+        assertEquals(events.get(4).getSubscriptionEventType(), SubscriptionEventType.PAUSE_BILLING);
+        assertEquals(events.get(5).getSubscriptionEventType(), SubscriptionEventType.RESUME_ENTITLEMENT);
+        assertEquals(events.get(6).getSubscriptionEventType(), SubscriptionEventType.RESUME_BILLING);
 
         assertEquals(events.get(0).getNextPhase().getName(), "trial");
         assertEquals(events.get(1).getNextPhase().getName(), "trial");
         assertEquals(events.get(2).getNextPhase().getName(), "phase");
         assertEquals(events.get(3).getNextPhase(), null);
-        assertEquals(events.get(4).getNextPhase().getName(), "phase");
+        assertEquals(events.get(4).getNextPhase(), null);
+        assertEquals(events.get(5).getNextPhase().getName(), "phase");
+        assertEquals(events.get(6).getNextPhase().getName(), "phase");
     }
 
-
-
     @Test(groups = "fast")
     public void testOneEntitlementWithInitialBlockingState() throws CatalogApiException {