killbill-aplcache

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/RepairEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/RepairEntitlementDao.java
index ed9cf13..069a325 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/RepairEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/RepairEntitlementDao.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -16,6 +16,7 @@
 
 package com.ning.billing.entitlement.engine.dao;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -26,6 +27,8 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.UUID;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.ning.billing.entitlement.api.SubscriptionFactory;
 import com.ning.billing.entitlement.api.migration.AccountMigrationData;
 import com.ning.billing.entitlement.api.timeline.RepairEntitlementLifecycleDao;
@@ -43,27 +46,69 @@ public class RepairEntitlementDao implements EntitlementDao, RepairEntitlementLi
 
     private final ThreadLocal<Map<UUID, SubscriptionRepairEvent>> preThreadsInRepairSubscriptions = new ThreadLocal<Map<UUID, SubscriptionRepairEvent>>();
 
+
+    private final static class EntitlementEventWithOrderingId {
+
+        private final EntitlementEvent event;
+        private final long orderingId;
+
+        public EntitlementEventWithOrderingId(EntitlementEvent event, long orderingId) {
+            this.event = event;
+            this.orderingId = orderingId;
+        }
+
+        public EntitlementEvent getEvent() {
+            return event;
+        }
+        public long getOrderingId() {
+            return orderingId;
+        }
+
+    }
+
     private static final class SubscriptionRepairEvent {
-        private final Set<EntitlementEvent> events;
+
+        private final Set<EntitlementEventWithOrderingId> events;
+        private long curOrderingId;
 
         public SubscriptionRepairEvent(final List<EntitlementEvent> initialEvents) {
-            events = new TreeSet<EntitlementEvent>(new Comparator<EntitlementEvent>() {
+            this.events = new TreeSet<EntitlementEventWithOrderingId>(new Comparator<EntitlementEventWithOrderingId>() {
                 @Override
-                public int compare(final EntitlementEvent o1, final EntitlementEvent o2) {
-                    return o1.compareTo(o2);
+                public int compare(final EntitlementEventWithOrderingId o1, final EntitlementEventWithOrderingId o2) {
+                    int result = o1.getEvent().getEffectiveDate().compareTo(o2.getEvent().getEffectiveDate());
+                    if (result == 0) {
+                        if (o1.getOrderingId() < o2.getOrderingId()) {
+                            return -1;
+                        } else if (o1.getOrderingId() > o2.getOrderingId()) {
+                            return 1;
+                        } else {
+                            throw new RuntimeException("Repair entitlement events should not have the same orderingId");
+                        }
+                    }
+                    return result;
                 }
             });
+
+            this.curOrderingId = 0;
+
             if (initialEvents != null) {
-                events.addAll(initialEvents);
+                addEvents(initialEvents);
             }
         }
 
-        public Set<EntitlementEvent> getEvents() {
-            return events;
+        public List<EntitlementEvent> getEvents() {
+            return new ArrayList<EntitlementEvent>(Collections2.transform(events, new Function<EntitlementEventWithOrderingId, EntitlementEvent>() {
+                @Override
+                public EntitlementEvent apply(EntitlementEventWithOrderingId in) {
+                    return in.getEvent();
+                }
+            }));
         }
 
         public void addEvents(final List<EntitlementEvent> newEvents) {
-            events.addAll(newEvents);
+            for (EntitlementEvent cur : newEvents) {
+                events.add(new EntitlementEventWithOrderingId(cur, curOrderingId++));
+            }
         }
     }
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestRepairBP.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestRepairBP.java
index a81d71b..3cb3a01 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestRepairBP.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestRepairBP.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -122,8 +122,7 @@ public class TestRepairBP extends TestApiBaseRepair {
         assertListenerStatus();
     }
 
-    //TODO MDW: Temporary disable need to look at this with Stephane
-    @Test(groups = "slow", enabled = false)
+    @Test(groups = "slow")
     public void testBPRepairWithCancellationOnstart() throws Exception {
         final String baseProduct = "Shotgun";
         final DateTime startDate = clock.getUTCNow();
@@ -585,7 +584,7 @@ public class TestRepairBP extends TestApiBaseRepair {
         // SET CTD to BASE SUBSCRIPTION SP CANCEL OCCURS EOT
         final DateTime newChargedThroughDate = baseSubscription.getStartDate().plusDays(30).plusMonths(1);
         billingApi.setChargedThroughDate(baseSubscription.getId(), newChargedThroughDate, context);
-        baseSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(baseSubscription.getId());
+        baseSubscription = entitlementApi.getSubscriptionFromId(baseSubscription.getId());
 
         final DateTime requestedChange = clock.getUTCNow();
         baseSubscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, requestedChange, context);
@@ -617,7 +616,7 @@ public class TestRepairBP extends TestApiBaseRepair {
         repairApi.repairBundle(bRepair, dryRun, context);
         assertTrue(testListener.isCompleted(5000));
 
-        baseSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(baseSubscription.getId());
+        baseSubscription = entitlementApi.getSubscriptionFromId(baseSubscription.getId());
 
         assertEquals(((SubscriptionData) baseSubscription).getActiveVersion(), SubscriptionEvents.INITIAL_VERSION + 1);
         assertEquals(baseSubscription.getBundleId(), bundle.getId());