killbill-memoizeit

Remove limitation to pass a requestedDate in the future when

8/27/2013 11:46:51 PM

Details

diff --git a/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java b/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
index 85b0d7e..d7856dc 100644
--- a/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
+++ b/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
@@ -57,9 +57,6 @@ public interface SubscriptionBase extends Entity, Blockable {
                                         final BillingActionPolicy policy, final CallContext context)
             throws SubscriptionBaseApiException;
 
-    public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionBaseApiException;
-
     public UUID getBundleId();
 
     public EntitlementState getState();
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionBaseApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionBaseApiService.java
index 2164fae..ff0e37b 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionBaseApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionBaseApiService.java
@@ -36,7 +36,8 @@ public interface SubscriptionBaseApiService {
                                        CallContext context)
             throws SubscriptionBaseApiException;
 
-    public boolean recreatePlan(DefaultSubscriptionBase subscription, PlanPhaseSpecifier spec, DateTime requestedDate, CallContext context)
+    @Deprecated
+    public boolean recreatePlan(final DefaultSubscriptionBase subscription, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final CallContext context)
             throws SubscriptionBaseApiException;
 
     public boolean cancel(DefaultSubscriptionBase subscription, DateTime requestedDate, CallContext context)
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index af3bae2..824f22e 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -113,11 +113,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
                     if (baseSubscription != null) {
                         if (baseSubscription.getState() == EntitlementState.ACTIVE) {
                             throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
-                        } else {
-                            // If we do create on an existing CANCELLED BP, this is equivalent to call recreate on that SubscriptionBase.
-                            final SubscriptionBase recreatedSubscriptionForApiUse = createSubscriptionForApiUse(baseSubscription);
-                            recreatedSubscriptionForApiUse.recreate(spec, requestedDate, context.toCallContext());
-                            return recreatedSubscriptionForApiUse;
                         }
                     }
                     bundleStartDate = requestedDate;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
index 8969799..8041933 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -39,11 +39,10 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.clock.Clock;
-import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.entitlement.api.Entitlement.EntitlementSourceType;
 import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
-import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIterator.Kind;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIterator.Order;
@@ -209,6 +208,11 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
         return null;
     }
 
+    public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate,
+                            final CallContext context) throws SubscriptionBaseApiException {
+        return apiService.recreatePlan(this, spec, requestedDate, context);
+    }
+
     @Override
     public boolean cancel(final DateTime requestedDate, final CallContext context) throws SubscriptionBaseApiException {
         return apiService.cancel(this, requestedDate, context);
@@ -238,12 +242,6 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
     @Override
-    public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate,
-                            final CallContext context) throws SubscriptionBaseApiException {
-        return apiService.recreatePlan(this, spec, requestedDate, context);
-    }
-
-    @Override
     public SubscriptionBaseTransition getPendingTransition() {
         if (transitions == null) {
             return null;
@@ -452,11 +450,11 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
         }
 
         final SubscriptionBaseTransitionDataIterator it = new SubscriptionBaseTransitionDataIterator(clock,
-                                                                                             transitions,
-                                                                                             Order.DESC_FROM_FUTURE,
-                                                                                             Kind.SUBSCRIPTION,
-                                                                                             Visibility.ALL,
-                                                                                             TimeLimit.PAST_OR_PRESENT_ONLY);
+                                                                                                     transitions,
+                                                                                                     Order.DESC_FROM_FUTURE,
+                                                                                                     Kind.SUBSCRIPTION,
+                                                                                                     Visibility.ALL,
+                                                                                                     TimeLimit.PAST_OR_PRESENT_ONLY);
 
         while (it.hasNext()) {
             final SubscriptionBaseTransitionData cur = (SubscriptionBaseTransitionData) it.next();
@@ -479,9 +477,11 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     public DateTime getPlanChangeEffectiveDate(final BillingActionPolicy policy,
                                                final DateTime requestedDate) {
 
+        // Return requested date to potentially honor date in the past, or NOW
         if (policy == BillingActionPolicy.IMMEDIATE) {
-            return requestedDate;
+            return requestedDate.compareTo(clock.getUTCNow()) < 0 ? requestedDate : clock.getUTCNow();
         }
+
         if (policy != BillingActionPolicy.END_OF_TERM) {
             throw new SubscriptionBaseError(String.format(
                     "Unexpected policy type %s", policy.toString()));
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
index 526db3c..a9977e3 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
@@ -97,6 +97,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
         return subscription;
     }
 
+    @Deprecated
     @Override
     public boolean recreatePlan(final DefaultSubscriptionBase subscription, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final CallContext context)
             throws SubscriptionBaseApiException {
@@ -411,13 +412,10 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
         return subscriptionsToBeCancelled.size();
     }
 
+
     private void validateRequestedDate(final DefaultSubscriptionBase subscription, final DateTime now, final DateTime requestedDate)
             throws SubscriptionBaseApiException {
 
-        if (requestedDate.isAfter(now)) {
-            throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
-        }
-
         final SubscriptionBaseTransition previousTransition = subscription.getPreviousTransition();
         if (previousTransition != null && previousTransition.getEffectiveTransitionTime().isAfter(requestedDate)) {
             throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE,
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
index 7166ab2..8b3d55e 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
@@ -81,21 +81,6 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
     }
 
     @Test(groups = "fast")
-    public void testRecreateSubscriptionBPNotCancelled() {
-        try {
-            final DefaultSubscriptionBase subscription = testUtil.createSubscription(bundle, "Shotgun", BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME);
-            try {
-                subscription.recreate(testUtil.getProductSpecifier("Pistol", PriceListSet.DEFAULT_PRICELIST_NAME, BillingPeriod.MONTHLY, null), clock.getUTCNow(), callContext);
-                Assert.assertFalse(true);
-            } catch (SubscriptionBaseApiException e) {
-                assertEquals(e.getCode(), ErrorCode.SUB_RECREATE_BAD_STATE.getCode());
-            }
-        } catch (Exception e) {
-            Assert.fail(e.toString());
-        }
-    }
-
-    @Test(groups = "fast")
     public void testCreateSubscriptionAddOnNotAvailable() {
         try {
             final UUID accountId = UUID.randomUUID();
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index a498cea..8d39a0b 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -104,12 +104,6 @@ public class MockSubscription implements SubscriptionBase {
     }
 
     @Override
-    public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionBaseApiException {
-        return sub.recreate(spec, requestedDate, context);
-    }
-
-    @Override
     public UUID getId() {
         return id;
     }