Details
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/EntitlementService.java b/api/src/main/java/com/ning/billing/entitlement/api/EntitlementService.java
index b325d6b..53854d1 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/EntitlementService.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/EntitlementService.java
@@ -17,13 +17,13 @@
package com.ning.billing.entitlement.api;
import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi;
import com.ning.billing.entitlement.api.test.EntitlementTestApi;
import com.ning.billing.entitlement.api.user.EntitlementUserApi;
import com.ning.billing.lifecycle.KillbillService;
public interface EntitlementService extends KillbillService {
-
@Override
public String getName();
@@ -33,5 +33,5 @@ public interface EntitlementService extends KillbillService {
public EntitlementTestApi getTestApi();
-
+ public EntitlementMigrationApi getMigrationApi();
}
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 e50988b..da1eb4d 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
@@ -70,11 +70,10 @@ public class MigrationPlanAligner {
}
public TimedMigration [] getEventsOnFuturePlanChangeMigration(SubscriptionData subscription,
- Plan currentPlan, PlanPhase currentPhase, Plan newPlan, String priceList, DateTime effectiveDate, DateTime effectiveDateForChangePlan) {
+ Plan currentPlan, PlanPhase currentPhase, Plan newPlan, PlanPhase newPhase, String priceList, DateTime effectiveDate, DateTime effectiveDateForChangePlan) {
TimedMigration [] result = new TimedMigration[2];
result[0] = new TimedMigration(effectiveDate, EventType.API_USER, ApiEventType.MIGRATE_ENTITLEMENT, currentPlan, currentPhase, priceList);
- PlanPhase newPlanPhase = newPlan.getAllPhases()[0];
- result[1] = new TimedMigration(effectiveDate, EventType.API_USER, ApiEventType.CHANGE, newPlan, newPlanPhase, priceList);
+ result[1] = new TimedMigration(effectiveDateForChangePlan, EventType.API_USER, ApiEventType.CHANGE, newPlan, newPhase, priceList);
return result;
}
@@ -82,7 +81,7 @@ public class MigrationPlanAligner {
Plan plan, PlanPhase initialPhase, String priceList, DateTime effectiveDate, DateTime effectiveDateForCancellation) {
TimedMigration [] result = new TimedMigration[2];
result[0] = new TimedMigration(effectiveDate, EventType.API_USER, ApiEventType.MIGRATE_ENTITLEMENT, plan, initialPhase, priceList);
- result[1] = new TimedMigration(effectiveDate, EventType.API_USER, ApiEventType.CANCEL, null, null, null);
+ result[1] = new TimedMigration(effectiveDateForCancellation, EventType.API_USER, ApiEventType.CANCEL, null, null, null);
return result;
}
}
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 abb5214..b847ebb 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
@@ -130,7 +130,6 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
throws EntitlementMigrationApiException {
try {
- // STEPH ah... what is that exactly?
final DateTime bundleStartDate = now;
List<EntitlementEvent> emptyEvents = Collections.emptyList();
@@ -140,8 +139,7 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
.setBundleId(bundleId)
.setCategory(productCategory)
.setBundleStartDate(bundleStartDate)
- // STEPH
- /* .setStartDate(effectiveDate) */,
+ .setStartDate(now),
emptyEvents);
TimedMigration [] events = null;
@@ -184,6 +182,7 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
plan0,
getPlanPhase(plan0, input[0].getPlanPhaseSpecifer().getPhaseType()),
plan1,
+ getPlanPhase(plan1, input[1].getPlanPhaseSpecifer().getPhaseType()),
input[0].getPlanPhaseSpecifer().getPriceListName(),
now,
input[1].getEffectiveDate());
@@ -221,8 +220,8 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
ApiEventBuilder builder = new ApiEventBuilder()
.setSubscriptionId(subscriptionData.getId())
- .setEventPlan(cur.getPlan().getName())
- .setEventPlanPhase(cur.getPhase().getName())
+ .setEventPlan((cur.getPlan() != null) ? cur.getPlan().getName() : null)
+ .setEventPlanPhase((cur.getPhase() != null) ? cur.getPhase().getName() : null)
.setEventPriceList(cur.getPriceList())
.setActiveVersion(subscriptionData.getActiveVersion())
.setEffectiveDate(cur.getEventTime())
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 12333a2..8ae9cec 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
@@ -355,6 +355,7 @@ public class SubscriptionData implements Subscription {
ApiEvent userEV = (ApiEvent) cur;
apiEventType = userEV.getEventType();
switch(apiEventType) {
+ case MIGRATE_ENTITLEMENT:
case CREATE:
nextState = SubscriptionState.ACTIVE;
nextPlanName = userEV.getEventPlan();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
index 9cda86d..721c476 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
@@ -24,11 +24,14 @@ import com.google.inject.Inject;
import com.ning.billing.catalog.api.CatalogApiException;
import com.ning.billing.config.EntitlementConfig;
+import com.ning.billing.entitlement.alignment.MigrationPlanAligner;
import com.ning.billing.entitlement.alignment.PlanAligner;
import com.ning.billing.entitlement.alignment.TimedPhase;
import com.ning.billing.entitlement.api.EntitlementService;
import com.ning.billing.entitlement.api.billing.DefaultEntitlementBillingApi;
import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
+import com.ning.billing.entitlement.api.migration.DefaultEntitlementMigrationApi;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi;
import com.ning.billing.entitlement.api.test.DefaultEntitlementTestApi;
import com.ning.billing.entitlement.api.test.EntitlementTestApi;
import com.ning.billing.entitlement.api.user.DefaultEntitlementUserApi;
@@ -64,6 +67,7 @@ public class Engine implements EventListener, EntitlementService {
private final EntitlementUserApi userApi;
private final EntitlementBillingApi billingApi;
private final EntitlementTestApi testApi;
+ private final EntitlementMigrationApi migrationApi;
private final EventBus eventBus;
private boolean startedNotificationThread;
@@ -71,7 +75,8 @@ public class Engine implements EventListener, EntitlementService {
@Inject
public Engine(Clock clock, EntitlementDao dao, EventNotifier apiEventProcessor,
PlanAligner planAligner, EntitlementConfig config, DefaultEntitlementUserApi userApi,
- DefaultEntitlementBillingApi billingApi, DefaultEntitlementTestApi testApi, EventBus eventBus) {
+ DefaultEntitlementBillingApi billingApi, DefaultEntitlementTestApi testApi,
+ DefaultEntitlementMigrationApi migrationApi, EventBus eventBus) {
super();
this.clock = clock;
this.dao = dao;
@@ -80,6 +85,7 @@ public class Engine implements EventListener, EntitlementService {
this.userApi = userApi;
this.testApi = testApi;
this.billingApi = billingApi;
+ this.migrationApi = migrationApi;
this.eventBus = eventBus;
this.startedNotificationThread = false;
@@ -124,6 +130,12 @@ public class Engine implements EventListener, EntitlementService {
}
@Override
+ public EntitlementMigrationApi getMigrationApi() {
+ return migrationApi;
+ }
+
+
+ @Override
public void processEventReady(EntitlementEvent event) {
SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(event.getSubscriptionId());
if (subscription == null) {
@@ -190,4 +202,5 @@ public class Engine implements EventListener, EntitlementService {
log.error(String.format("Failed to insert next phase for subscription %s", subscription.getId()), e);
}
}
+
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
index 300b841..27e06a0 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
@@ -49,6 +49,7 @@ import com.ning.billing.entitlement.events.user.ApiEventBuilder;
import com.ning.billing.entitlement.events.user.ApiEventCancel;
import com.ning.billing.entitlement.events.user.ApiEventChange;
import com.ning.billing.entitlement.events.user.ApiEventCreate;
+import com.ning.billing.entitlement.events.user.ApiEventMigrate;
import com.ning.billing.entitlement.events.user.ApiEventPause;
import com.ning.billing.entitlement.events.user.ApiEventResume;
import com.ning.billing.entitlement.events.user.ApiEventType;
@@ -179,6 +180,8 @@ public interface EventSqlDao extends Transactional<EventSqlDao>, CloseMe, Transm
if (userType == ApiEventType.CREATE) {
result = new ApiEventCreate(builder);
+ } else if (userType == ApiEventType.MIGRATE_ENTITLEMENT) {
+ result = new ApiEventMigrate(builder);
} else if (userType == ApiEventType.CHANGE) {
result = new ApiEventChange(builder);
} else if (userType == ApiEventType.CANCEL) {
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
index f79666e..4540ad8 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
@@ -3,7 +3,7 @@ CREATE TABLE events (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
event_id char(36) NOT NULL,
event_type varchar(9) NOT NULL,
- user_type varchar(10) DEFAULT NULL,
+ user_type varchar(25) DEFAULT NULL,
created_dt datetime NOT NULL,
updated_dt datetime NOT NULL,
requested_dt datetime NOT NULL,
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
index b14bf38..8f90bc7 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
@@ -40,6 +40,7 @@ public class ApiTestListener {
private volatile boolean completed;
public enum NextEvent {
+ MIGRATE_ENTITLEMENT,
CREATE,
CHANGE,
CANCEL,
@@ -56,6 +57,9 @@ public class ApiTestListener {
@Subscribe
public void handleEntitlementEvent(SubscriptionTransition event) {
switch (event.getTransitionType()) {
+ case MIGRATE_ENTITLEMENT:
+ subscriptionMigrated(event);
+ break;
case CREATE:
subscriptionCreated(event);
break;
@@ -139,6 +143,12 @@ public class ApiTestListener {
}
+ public void subscriptionMigrated(SubscriptionTransition migrated) {
+ log.debug("-> Got event MIGRATED");
+ assertEqualsNicely(NextEvent.MIGRATE_ENTITLEMENT);
+ notifyIfStackEmpty();
+ }
+
public void subscriptionCreated(SubscriptionTransition created) {
log.debug("-> Got event CREATED");
assertEqualsNicely(NextEvent.CREATE);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
index 09a70f2..4691404 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
@@ -32,10 +32,11 @@ import com.ning.billing.catalog.api.Plan;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PriceListSet;
import com.ning.billing.catalog.api.PhaseType;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.util.clock.DefaultClock;
-public abstract class TestUserApiCancel extends TestUserApiBase {
+public abstract class TestUserApiCancel extends TestApiBase {
protected void testCancelSubscriptionIMMReal() {
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 14a46aa..dfa2bc7 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
@@ -34,12 +34,13 @@ import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PriceListSet;
import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.events.EntitlementEvent;
import com.ning.billing.entitlement.events.user.ApiEvent;
import com.ning.billing.util.clock.DefaultClock;
-public abstract class TestUserApiChangePlan extends TestUserApiBase {
+public abstract class TestUserApiChangePlan extends TestApiBase {
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 4ae0432..de1dbf9 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
@@ -31,12 +31,13 @@ import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PriceListSet;
import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.events.EntitlementEvent;
import com.ning.billing.entitlement.events.phase.PhaseEvent;
import com.ning.billing.util.clock.DefaultClock;
-public abstract class TestUserApiCreate extends TestUserApiBase {
+public abstract class TestUserApiCreate extends TestApiBase {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
index 2476629..feb4b54 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
@@ -39,11 +39,12 @@ import com.ning.billing.catalog.api.Plan;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.glue.MockEngineModuleSql;
import com.ning.billing.util.clock.DefaultClock;
-public class TestUserApiDemos extends TestUserApiBase {
+public class TestUserApiDemos extends TestApiBase {
@Override
protected Injector getInjector() {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
index 799e1f9..3c1c489 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
@@ -34,11 +34,12 @@ import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.Duration;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PriceListSet;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.glue.MockEngineModuleMemory;
import com.ning.billing.util.clock.DefaultClock;
-public class TestUserApiError extends TestUserApiBase {
+public class TestUserApiError extends TestApiBase {
@Override
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiPriceList.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiPriceList.java
index d6a2b12..a1a0dc7 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiPriceList.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiPriceList.java
@@ -17,8 +17,9 @@
package com.ning.billing.entitlement.api.user;
import com.google.inject.Injector;
+import com.ning.billing.entitlement.api.TestApiBase;
-public class TestUserApiPriceList extends TestUserApiBase {
+public class TestUserApiPriceList extends TestApiBase {
@Override
protected Injector getInjector() {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
index 69fcd08..6ebd238 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
@@ -31,11 +31,12 @@ import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.Duration;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.PhaseType;
+import com.ning.billing.entitlement.api.TestApiBase;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.glue.MockEngineModuleSql;
import com.ning.billing.util.clock.DefaultClock;
-public class TestUserApiScenarios extends TestUserApiBase {
+public class TestUserApiScenarios extends TestApiBase {
@Override
protected Injector getInjector() {
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 c821edb..bb5b4ce 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
@@ -36,6 +36,8 @@ import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.catalog.api.TimeUnit;
import com.ning.billing.config.EntitlementConfig;
import com.ning.billing.entitlement.api.migration.AccountMigrationData;
+import com.ning.billing.entitlement.api.migration.AccountMigrationData.BundleMigrationData;
+import com.ning.billing.entitlement.api.migration.AccountMigrationData.SubscriptionMigrationData;
import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.entitlement.api.user.SubscriptionApiService;
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
@@ -350,8 +352,22 @@ public class MockEntitlementDaoMemory implements EntitlementDao, MockEntitlement
}
}
+
@Override
- public void migrate(AccountMigrationData data) {
+ public void migrate(final AccountMigrationData accountData) {
+ synchronized(events) {
+ for (BundleMigrationData curBundle : accountData.getData()) {
+ SubscriptionBundleData bundleData = curBundle.getData();
+ for (SubscriptionMigrationData curSubscription : curBundle.getSubscriptions()) {
+ SubscriptionData subData = curSubscription.getData();
+ for (EntitlementEvent curEvent : curSubscription.getInitialEvents()) {
+ events.add(curEvent);
+ }
+ subscriptions.add(subData);
+ }
+ bundles.add(bundleData);
+ }
+ }
}
@Override