killbill-memoizeit

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index ace0c73..9a0b572 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -27,7 +27,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.account.dao.AccountModelDao;
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -153,6 +152,10 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
                 null,
                 null,
                 null,
+                null,
+                null,
+                null,
+                null,
                 Subscription.SubscriptionState.ACTIVE,
                 plan,
                 phase,
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
index c8a8bca..76ff799 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
@@ -35,12 +35,20 @@ public interface SubscriptionTransition {
 
     public SubscriptionState getNextState();
 
+    public UUID getPreviousEventId();
+
+    public DateTime getPreviousEventCreatedDate();
+
     public Plan getPreviousPlan();
 
     public Plan getNextPlan();
 
     public PlanPhase getPreviousPhase();
 
+    public UUID getNextEventId();
+
+    public DateTime getNextEventCreatedDate();
+
     public PlanPhase getNextPhase();
 
     public PriceList getPreviousPriceList();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index 47aa41e..5841a98 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -28,7 +28,6 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.ActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
@@ -517,19 +516,24 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
         this.events = inputEvents;
 
+        UUID nextUserToken = null;
+
+        UUID nextEventId = null;
+        DateTime nextCreatedDate = null;
         SubscriptionState nextState = null;
         String nextPlanName = null;
         String nextPhaseName = null;
         String nextPriceListName = null;
-        UUID nextUserToken = null;
 
+        UUID prevEventId = null;
+        DateTime prevCreatedDate = null;
         SubscriptionState previousState = null;
         PriceList previousPriceList = null;
-
-        transitions = new LinkedList<SubscriptionTransition>();
         Plan previousPlan = null;
         PlanPhase previousPhase = null;
 
+        transitions = new LinkedList<SubscriptionTransition>();
+
         for (final EntitlementEvent cur : inputEvents) {
 
             if (!cur.isActive() || cur.getActiveVersion() < activeVersion) {
@@ -540,6 +544,9 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
             boolean isFromDisk = true;
 
+            nextEventId = cur.getId();
+            nextCreatedDate = cur.getCreatedDate();
+
             switch (cur.getType()) {
 
             case PHASE:
@@ -558,6 +565,8 @@ public class SubscriptionData extends EntityBase implements Subscription {
                 case MIGRATE_ENTITLEMENT:
                 case CREATE:
                 case RE_CREATE:
+                    prevEventId = null;
+                    prevCreatedDate = null;
                     previousState = null;
                     previousPlan = null;
                     previousPhase = null;
@@ -605,8 +614,11 @@ public class SubscriptionData extends EntityBase implements Subscription {
             final SubscriptionTransitionData transition = new SubscriptionTransitionData(
                     cur.getId(), id, bundleId, cur.getType(), apiEventType,
                     cur.getRequestedDate(), cur.getEffectiveDate(),
+                    prevEventId, prevCreatedDate,
                     previousState, previousPlan, previousPhase,
-                    previousPriceList, nextState, nextPlan, nextPhase,
+                    previousPriceList,
+                    nextEventId, nextCreatedDate,
+                    nextState, nextPlan, nextPhase,
                     nextPriceList, cur.getTotalOrdering(), nextUserToken,
                     isFromDisk);
 
@@ -616,8 +628,9 @@ public class SubscriptionData extends EntityBase implements Subscription {
             previousPlan = nextPlan;
             previousPhase = nextPhase;
             previousPriceList = nextPriceList;
+            prevEventId = nextEventId;
+            prevCreatedDate = nextCreatedDate;
+
         }
     }
-
-
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
index 7e6db65..2cadced 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
@@ -40,8 +40,12 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
     private final DateTime effectiveTransitionTime;
     private final SubscriptionState previousState;
     private final PriceList previousPriceList;
+    private final UUID previousEventId;
+    private final DateTime previousEventCreatedDate;
     private final Plan previousPlan;
     private final PlanPhase previousPhase;
+    private final UUID nextEventId;
+    private final DateTime nextEventCreatedDate;
     private final SubscriptionState nextState;
     private final PriceList nextPriceList;
     private final Plan nextPlan;
@@ -57,10 +61,14 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
                                       final ApiEventType apiEventType,
                                       final DateTime requestedTransitionTime,
                                       final DateTime effectiveTransitionTime,
+                                      final UUID previousEventId,
+                                      final DateTime previousEventCreatedDate,
                                       final SubscriptionState previousState,
                                       final Plan previousPlan,
                                       final PlanPhase previousPhase,
                                       final PriceList previousPriceList,
+                                      final UUID nextEventId,
+                                      final DateTime nextEventCreatedDate,
                                       final SubscriptionState nextState,
                                       final Plan nextPlan,
                                       final PlanPhase nextPhase,
@@ -84,12 +92,16 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
         this.nextPriceList = nextPriceList;
         this.nextPhase = nextPhase;
         this.totalOrdering = totalOrdering;
+        this.previousEventId = previousEventId;
+        this.previousEventCreatedDate = previousEventCreatedDate;
+        this.nextEventId = nextEventId;
+        this.nextEventCreatedDate = nextEventCreatedDate;
         this.isFromDisk = isFromDisk;
         this.userToken = userToken;
         this.remainingEventsForUserOperation = 0;
     }
 
-    public SubscriptionTransitionData(final SubscriptionTransitionData input, final int remainingEventsForUserOperation) {
+    public SubscriptionTransitionData(final SubscriptionTransitionData input, int remainingEventsForUserOperation) {
         super();
         this.eventId = input.getId();
         this.subscriptionId = input.getSubscriptionId();
@@ -98,10 +110,14 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
         this.apiEventType = input.getApiEventType();
         this.requestedTransitionTime = input.getRequestedTransitionTime();
         this.effectiveTransitionTime = input.getEffectiveTransitionTime();
+        this.previousEventId = input.getPreviousEventId();
+        this.previousEventCreatedDate = input.getPreviousEventCreatedDate();
         this.previousState = input.getPreviousState();
         this.previousPriceList = input.getPreviousPriceList();
         this.previousPlan = input.getPreviousPlan();
         this.previousPhase = input.getPreviousPhase();
+        this.nextEventId = input.getNextEventId();
+        this.nextEventCreatedDate = input.getNextEventCreatedDate();
         this.nextState = input.getNextState();
         this.nextPlan = input.getNextPlan();
         this.nextPriceList = input.getNextPriceList();
@@ -142,6 +158,16 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
     }
 
     @Override
+    public UUID getNextEventId() {
+        return nextEventId;
+    }
+
+    @Override
+    public DateTime getNextEventCreatedDate() {
+        return nextEventCreatedDate;
+    }
+
+    @Override
     public Plan getNextPlan() {
         return nextPlan;
     }
@@ -157,6 +183,16 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
     }
 
     @Override
+    public UUID getPreviousEventId() {
+        return previousEventId;
+    }
+
+    @Override
+    public DateTime getPreviousEventCreatedDate() {
+        return previousEventCreatedDate;
+    }
+
+    @Override
     public PriceList getPreviousPriceList() {
         return previousPriceList;
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
index 87d8533..4321cd1 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
@@ -46,7 +46,7 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
         this.requestedDate = copy.requestedDate;
         this.effectiveDate = copy.effectiveDate;
         this.processedDate = copy.processedDate;
-
+        this.createdDate = copy.getCreatedDate();
         this.activeVersion = copy.activeVersion;
         this.isActive = copy.isActive;
         this.totalOrdering = copy.totalOrdering;
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index da23035..d3c1929 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -433,6 +433,7 @@ public class TestUserApiChangePlan extends EntitlementTestSuiteWithEmbeddedDB {
             PlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
+
             // MOVE 2 DAYS AHEAD
             Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(2));
             clock.addDeltaFromReality(it.toDurationMillis());
@@ -468,8 +469,8 @@ public class TestUserApiChangePlan extends EntitlementTestSuiteWithEmbeddedDB {
 
             final DateTime expectedNextPhaseDate = subscription.getStartDate().plusDays(30).plusMonths(6);
             final SubscriptionTransition nextPhase = subscription.getPendingTransition();
-            final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
 
+            final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
 
             assertListenerStatus();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
index 22a09cc..ef3e65f 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
@@ -62,15 +62,33 @@ public class TestUserApiCreate extends EntitlementTestSuiteWithEmbeddedDB {
                                                                                                        testUtil.getProductSpecifier(productName, planSetName, term, null), requestedDate, callContext);
             assertNotNull(subscription);
 
+            //
+            // In addition to Alignment phase we also test SubscriptionTransition eventIds and created dates.
+            // Keep tracks of row events to compare with ids and created dates returned by SubscriptionTransition later.
+            //
+            final List<EntitlementEvent> events = subscription.getEvents();
+            Assert.assertEquals(events.size(), 2);
+
+            final EntitlementEvent trialEvent = events.get(0);
+            final EntitlementEvent phaseEvent = events.get(1);
+
+
             assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
             //assertEquals(subscription.getAccount(), account.getId());
             assertEquals(subscription.getBundleId(), bundle.getId());
             assertEquals(subscription.getStartDate(), requestedDate);
 
             assertTrue(testListener.isCompleted(5000));
-
             assertListenerStatus();
 
+            final SubscriptionTransition transition = subscription.getPreviousTransition();
+
+            assertEquals(transition.getPreviousEventId(), trialEvent.getId());
+            assertEquals(transition.getNextEventId(), phaseEvent.getId());
+
+            assertEquals(transition.getPreviousEventCreatedDate().compareTo(trialEvent.getCreatedDate()), 0);
+            assertEquals(transition.getNextEventCreatedDate().compareTo(phaseEvent.getCreatedDate()), 0);
+
         } catch (EntitlementUserApiException e) {
             log.error("Unexpected exception", e);
             Assert.fail(e.getMessage());