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 {