killbill-uncached

Migration bug fixes

12/26/2011 10:13:57 PM

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/MigrationPlanAligner.java b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/MigrationPlanAligner.java
index 66613d3..4290f73 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/MigrationPlanAligner.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/MigrationPlanAligner.java
@@ -181,7 +181,8 @@ public class MigrationPlanAligner {
         if (input.length != 2) {
             return false;
         }
-        return isSamePlan(input[0].getPlanPhaseSpecifer(), input[1].getPlanPhaseSpecifer());
+        return (isSamePlan(input[0].getPlanPhaseSpecifer(), input[1].getPlanPhaseSpecifer()) &&
+                !isSamePhase(input[0].getPlanPhaseSpecifer(), input[1].getPlanPhaseSpecifer()));
     }
 
     private boolean isPlanChangeMigratedSubscription(EntitlementSubscriptionMigrationCase [] input) {
@@ -198,4 +199,11 @@ public class MigrationPlanAligner {
         }
         return false;
     }
+
+    private boolean isSamePhase(PlanPhaseSpecifier plan0, PlanPhaseSpecifier plan1) {
+        if (plan0.getPhaseType() == plan1.getPhaseType()) {
+            return true;
+        }
+        return false;
+    }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
index aa16ac7..d8a0100 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
@@ -80,7 +80,7 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
     public void migrate(EntitlementAccountMigration toBeMigrated)
     throws EntitlementMigrationApiException {
         AccountMigrationData accountMigrationData = createAccountMigrationData(toBeMigrated);
-        dao.migrate(accountMigrationData);
+        dao.migrate(toBeMigrated.getAccountKey(), accountMigrationData);
     }
 
     @Override
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
index 4998379..92be3e7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
@@ -72,7 +72,7 @@ public interface EntitlementDao {
 
     public void changePlan(UUID subscriptionId, List<EntitlementEvent> changeEvents);
 
-    public void migrate(AccountMigrationData data);
+    public void migrate(UUID acountId, AccountMigrationData data);
 
     public void undoMigration(UUID accountId);
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
index aa31964..b88f4ef 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
@@ -349,7 +349,7 @@ public class EntitlementSqlDao implements EntitlementDao {
     }
 
     @Override
-    public void migrate(final AccountMigrationData accountData) {
+    public void migrate(final UUID accountId, final AccountMigrationData accountData) {
 
         eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
 
@@ -360,6 +360,9 @@ public class EntitlementSqlDao implements EntitlementDao {
                 SubscriptionSqlDao transSubDao = transEventDao.become(SubscriptionSqlDao.class);
                 BundleSqlDao transBundleDao = transEventDao.become(BundleSqlDao.class);
 
+                // First get rid of any data from account
+                undoMigrationFromTransaction(accountId, transEventDao, transBundleDao, transSubDao);
+
                 for (BundleMigrationData curBundle : accountData.getData()) {
                     SubscriptionBundleData bundleData = curBundle.getData();
                     for (SubscriptionMigrationData curSubscription : curBundle.getSubscriptions()) {
@@ -387,18 +390,21 @@ public class EntitlementSqlDao implements EntitlementDao {
 
                 SubscriptionSqlDao transSubDao = transEventDao.become(SubscriptionSqlDao.class);
                 BundleSqlDao transBundleDao = transEventDao.become(BundleSqlDao.class);
-
-                final List<SubscriptionBundle> bundles = transBundleDao.getBundleFromAccount(accountId.toString());
-                for (SubscriptionBundle curBundle : bundles) {
-                    List<Subscription> subscriptions = transSubDao.getSubscriptionsFromBundleId(curBundle.getId().toString());
-                    for (Subscription cur : subscriptions) {
-                        eventsDao.removeEvents(cur.getId().toString());
-                        transSubDao.removeSubscription(cur.getId().toString());
-                    }
-                    transBundleDao.removeBundle(curBundle.getId().toString());
-                }
+                undoMigrationFromTransaction(accountId, transEventDao, transBundleDao, transSubDao);
                 return null;
             }
         });
     }
+
+    private void undoMigrationFromTransaction(final UUID accountId, EventSqlDao transEventDao, BundleSqlDao transBundleDao, SubscriptionSqlDao transSubDao) {
+        final List<SubscriptionBundle> bundles = transBundleDao.getBundleFromAccount(accountId.toString());
+        for (SubscriptionBundle curBundle : bundles) {
+            List<Subscription> subscriptions = transSubDao.getSubscriptionsFromBundleId(curBundle.getId().toString());
+            for (Subscription cur : subscriptions) {
+                eventsDao.removeEvents(cur.getId().toString());
+                transSubDao.removeSubscription(cur.getId().toString());
+            }
+            transBundleDao.removeBundle(curBundle.getId().toString());
+        }
+    }
 }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
index 4c2ee17..e14c91d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
@@ -365,8 +365,11 @@ public class MockEntitlementDaoMemory implements EntitlementDao, MockEntitlement
 
 
     @Override
-    public void migrate(final AccountMigrationData accountData) {
+    public void migrate(final UUID accountId, final AccountMigrationData accountData) {
         synchronized(events) {
+
+            undoMigration(accountId);
+
             for (BundleMigrationData curBundle : accountData.getData()) {
                 SubscriptionBundleData bundleData = curBundle.getData();
                 for (SubscriptionMigrationData curSubscription : curBundle.getSubscriptions()) {