killbill-uncached

Code review for #99 Add new overdue config parameter initialReevaluationInterval

10/10/2013 12:33:29 AM

Details

diff --git a/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java b/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
index 989fd51..47de144 100644
--- a/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
+++ b/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
@@ -17,16 +17,16 @@
 package com.ning.billing.overdue.config.api;
 
 import org.joda.time.LocalDate;
+import org.joda.time.Period;
 
-import com.ning.billing.entitlement.api.Blockable;
 import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.OverdueState;
 
 public interface OverdueStateSet {
 
-    public abstract OverdueState getClearState() throws OverdueApiException;
+    public OverdueState getClearState() throws OverdueApiException;
 
-    public abstract OverdueState findState(String stateName) throws OverdueApiException;
+    public OverdueState findState(String stateName) throws OverdueApiException;
 
     /**
      * Compute an overdue state, given a billing state, at a given day.
@@ -36,9 +36,11 @@ public interface OverdueStateSet {
      * @return the overdue state
      * @throws OverdueApiException
      */
-    public abstract OverdueState calculateOverdueState(BillingState billingState, LocalDate now) throws OverdueApiException;
+    public OverdueState calculateOverdueState(BillingState billingState, LocalDate now) throws OverdueApiException;
 
-    public abstract int size();
+    public int size();
 
-    public abstract OverdueState getFirstState();
+    public OverdueState getFirstState();
+
+    public Period getInitialReevaluationInterval();
 }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index cba122d..54e870b 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -52,6 +52,9 @@ public class TestOverdueIntegration extends TestOverdueBase {
     public String getOverdueConfig() {
         final String configXml = "<overdueConfig>" +
                                  "   <accountOverdueStates>" +
+                                 "       <initialReevaluationInterval>" +
+                                 "           <unit>DAYS</unit><number>5</number>" +
+                                 "       </initialReevaluationInterval>" +
                                  "       <state name=\"OD3\">" +
                                  "           <condition>" +
                                  "               <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithOverdueEnforcementOffTag.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithOverdueEnforcementOffTag.java
index 604b4fc..ec8a989 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithOverdueEnforcementOffTag.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithOverdueEnforcementOffTag.java
@@ -39,6 +39,9 @@ public class TestOverdueWithOverdueEnforcementOffTag extends TestOverdueBase {
     public String getOverdueConfig() {
         final String configXml = "<overdueConfig>" +
                                  "   <accountOverdueStates>" +
+                                 "       <initialReevaluationInterval>" +
+                                 "           <unit>DAYS</unit><number>5</number>" +
+                                 "       </initialReevaluationInterval>" +
                                  "       <state name=\"OD1\">" +
                                  "           <condition>" +
                                  "               <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
index 1051226..67a23ad 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
@@ -41,6 +41,9 @@ public class TestOverdueWithSubscriptionCancellation extends TestOverdueBase {
     public String getOverdueConfig() {
         final String configXml = "<overdueConfig>" +
                                  "   <accountOverdueStates>" +
+                                 "       <initialReevaluationInterval>" +
+                                 "           <unit>DAYS</unit><number>5</number>" +
+                                 "       </initialReevaluationInterval>" +
                                  "       <state name=\"OD1\">" +
                                  "           <condition>" +
                                  "               <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
diff --git a/overdue/src/main/java/com/ning/billing/overdue/api/DefaultOverdueUserApi.java b/overdue/src/main/java/com/ning/billing/overdue/api/DefaultOverdueUserApi.java
index 2903845..5d16dd7 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/api/DefaultOverdueUserApi.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/api/DefaultOverdueUserApi.java
@@ -62,7 +62,7 @@ public class DefaultOverdueUserApi implements OverdueUserApi {
     public OverdueState getOverdueStateFor(final Account overdueable, final TenantContext context) throws OverdueException {
         try {
             final String stateName = accessApi.getBlockingStateForService(overdueable, OverdueService.OVERDUE_SERVICE_NAME, internalCallContextFactory.createInternalTenantContext(context)).getStateName();
-            final OverdueStateSet states = overdueConfig.getBundleStateSet();
+            final OverdueStateSet states = overdueConfig.getStateSet();
             return states.findState(stateName);
         } catch (OverdueApiException e) {
             throw new OverdueException(e, ErrorCode.OVERDUE_CAT_ERROR_ENCOUNTERED, overdueable.getId(), overdueable.getClass().getSimpleName());
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index 371b839..7ce6f08 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -31,7 +31,10 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.AccountInternalApi;
 import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.callcontext.InternalCallContext;
+import com.ning.billing.callcontext.InternalTenantContext;
 import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.entitlement.api.BlockingApiException;
@@ -39,9 +42,11 @@ import com.ning.billing.entitlement.api.BlockingStateType;
 import com.ning.billing.entitlement.api.Entitlement;
 import com.ning.billing.entitlement.api.EntitlementApi;
 import com.ning.billing.entitlement.api.EntitlementApiException;
+import com.ning.billing.events.OverdueChangeInternalEvent;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceInternalApi;
-import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.junction.BlockingInternalApi;
+import com.ning.billing.junction.DefaultBlockingState;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.OverdueCancellationPolicy;
@@ -49,18 +54,13 @@ import com.ning.billing.overdue.OverdueService;
 import com.ning.billing.overdue.OverdueState;
 import com.ning.billing.overdue.config.api.BillingState;
 import com.ning.billing.overdue.config.api.OverdueException;
-import com.ning.billing.callcontext.InternalCallContext;
-import com.ning.billing.callcontext.InternalTenantContext;
+import com.ning.billing.overdue.config.api.OverdueStateSet;
+import com.ning.billing.tag.TagInternalApi;
 import com.ning.billing.util.dao.NonEntityDao;
 import com.ning.billing.util.email.DefaultEmailSender;
 import com.ning.billing.util.email.EmailApiException;
 import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
-import com.ning.billing.events.OverdueChangeInternalEvent;
-import com.ning.billing.account.api.AccountInternalApi;
-import com.ning.billing.junction.BlockingInternalApi;
-import com.ning.billing.junction.DefaultBlockingState;
-import com.ning.billing.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 
@@ -85,10 +85,18 @@ public class OverdueStateApplicator {
     private final NonEntityDao nonEntityDao;
 
     @Inject
-    public OverdueStateApplicator(final BlockingInternalApi accessApi, final AccountInternalApi accountApi, final EntitlementApi entitlementApi,
+    public OverdueStateApplicator(final BlockingInternalApi accessApi,
+                                  final AccountInternalApi accountApi,
+                                  final EntitlementApi entitlementApi,
                                   final InvoiceInternalApi invoiceInternalApi,
-                                  final Clock clock, final OverdueCheckPoster poster, final OverdueEmailGenerator overdueEmailGenerator,
-                                  final EmailConfig config, final PersistentBus bus, final NonEntityDao nonEntityDao,  final TagInternalApi tagApi) {
+                                  final Clock clock,
+                                  final OverdueCheckPoster poster,
+                                  final OverdueEmailGenerator overdueEmailGenerator,
+                                  final EmailConfig config,
+                                  final PersistentBus bus,
+                                  final NonEntityDao nonEntityDao,
+                                  final TagInternalApi tagApi) {
+
         this.blockingApi = accessApi;
         this.accountApi = accountApi;
         this.entitlementApi = entitlementApi;
@@ -103,7 +111,7 @@ public class OverdueStateApplicator {
     }
 
 
-    public void apply(final OverdueState firstOverdueState, final BillingState billingState,
+    public void apply(final OverdueStateSet overdueStateSet, final BillingState billingState,
                       final Account account, final OverdueState previousOverdueState,
                       final OverdueState nextOverdueState, final InternalCallContext context) throws OverdueException {
         try {
@@ -115,12 +123,16 @@ public class OverdueStateApplicator {
 
             log.debug("OverdueStateApplicator:apply <enter> : time = " + clock.getUTCNow() + ", previousState = " + previousOverdueState.getName() + ", nextState = " + nextOverdueState);
 
+            final OverdueState firstOverdueState = overdueStateSet.getFirstState();
+            final Period initialReevaluationPeriod = overdueStateSet.getInitialReevaluationInterval() != null ?
+                                                     overdueStateSet.getInitialReevaluationInterval() : new Period(24, 0, 0, 0);
+
             final boolean conditionForNextNotfication = !nextOverdueState.isClearState() ||
                                                         // We did not reach the first state yet but we have an unpaid invoice
                                                         (firstOverdueState != null && billingState != null && billingState.getDateOfEarliestUnpaidInvoice() != null);
 
             if (conditionForNextNotfication) {
-                final Period reevaluationInterval = nextOverdueState.isClearState() ? firstOverdueState.getReevaluationInterval() : nextOverdueState.getReevaluationInterval();
+                final Period reevaluationInterval = nextOverdueState.isClearState() ? initialReevaluationPeriod : nextOverdueState.getReevaluationInterval();
                 createFutureNotification(account, clock.getUTCNow().plus(reevaluationInterval), context);
 
                 log.debug("OverdueStateApplicator <notificationQ> : inserting notification for time = " + clock.getUTCNow().plus(reevaluationInterval));
@@ -149,7 +161,7 @@ public class OverdueStateApplicator {
         }
 
         try {
-            bus.post(createOverdueEvent(account, previousOverdueState.getName(), nextOverdueState.getName(),isBlockBillingTransition(previousOverdueState, nextOverdueState),
+            bus.post(createOverdueEvent(account, previousOverdueState.getName(), nextOverdueState.getName(), isBlockBillingTransition(previousOverdueState, nextOverdueState),
                                         isUnblockBillingTransition(previousOverdueState, nextOverdueState), context));
         } catch (Exception e) {
             log.error("Error posting overdue change event to bus", e);
diff --git a/overdue/src/main/java/com/ning/billing/overdue/config/OverdueConfig.java b/overdue/src/main/java/com/ning/billing/overdue/config/OverdueConfig.java
index 9d8a697..aeece23 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/config/OverdueConfig.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/config/OverdueConfig.java
@@ -32,7 +32,7 @@ public class OverdueConfig extends ValidatingConfig<OverdueConfig> {
     @XmlElement(required = true, name = "accountOverdueStates")
     private OverdueStatesAccount accountOverdueStates = new OverdueStatesAccount();
 
-    public DefaultOverdueStateSet getBundleStateSet() {
+    public DefaultOverdueStateSet getStateSet() {
         return accountOverdueStates;
     }
 
@@ -42,8 +42,8 @@ public class OverdueConfig extends ValidatingConfig<OverdueConfig> {
         return accountOverdueStates.validate(root, errors);
     }
 
-    public OverdueConfig setOverdueStatesBundle(final OverdueStatesAccount bundleODS) {
-        this.accountOverdueStates = bundleODS;
+    public OverdueConfig setOverdueStates(final OverdueStatesAccount accountOverdueStates) {
+        this.accountOverdueStates = accountOverdueStates;
         return this;
     }
 
diff --git a/overdue/src/main/java/com/ning/billing/overdue/config/OverdueStatesAccount.java b/overdue/src/main/java/com/ning/billing/overdue/config/OverdueStatesAccount.java
index 669f84b..a95725d 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/config/OverdueStatesAccount.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/config/OverdueStatesAccount.java
@@ -18,8 +18,15 @@ package com.ning.billing.overdue.config;
 
 import javax.xml.bind.annotation.XmlElement;
 
+import org.joda.time.Period;
+
+import com.ning.billing.catalog.api.TimeUnit;
+
 public class OverdueStatesAccount extends DefaultOverdueStateSet {
 
+    @XmlElement(required = false, name = "initialReevaluationInterval")
+    private DefaultDuration initialReevaluationInterval;
+
     @SuppressWarnings("unchecked")
     @XmlElement(required = true, name = "state")
     private DefaultOverdueState[] accountOverdueStates = new DefaultOverdueState[0];
@@ -29,8 +36,21 @@ public class OverdueStatesAccount extends DefaultOverdueStateSet {
         return accountOverdueStates;
     }
 
-    protected OverdueStatesAccount setBundleOverdueStates(final DefaultOverdueState[] bundleOverdueStates) {
-        this.accountOverdueStates = bundleOverdueStates;
+    @Override
+    public Period getInitialReevaluationInterval() {
+        if (initialReevaluationInterval == null || initialReevaluationInterval.getUnit() == TimeUnit.UNLIMITED || initialReevaluationInterval.getNumber() == 0) {
+            return null;
+        }
+        return initialReevaluationInterval.toJodaPeriod();
+    }
+
+    protected OverdueStatesAccount setAccountOverdueStates(final DefaultOverdueState[] accountOverdueStates) {
+        this.accountOverdueStates = accountOverdueStates;
+        return this;
+    }
+
+    protected OverdueStatesAccount setInitialReevaluationInterval(final DefaultDuration initialReevaluationInterval) {
+        this.initialReevaluationInterval = initialReevaluationInterval;
         return this;
     }
 }
diff --git a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
index a8b07da..2959b65 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
@@ -62,7 +62,7 @@ public class OverdueWrapper {
         final OverdueState currentOverdueState = overdueStateSet.findState(previousOverdueStateName);
         final OverdueState nextOverdueState = overdueStateSet.calculateOverdueState(billingState, clock.getToday(billingState.getAccountTimeZone()));
 
-        overdueStateApplicator.apply(overdueStateSet.getFirstState(), billingState, overdueable, currentOverdueState, nextOverdueState, context);
+        overdueStateApplicator.apply(overdueStateSet, billingState, overdueable, currentOverdueState, nextOverdueState, context);
 
         return nextOverdueState;
     }
diff --git a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
index f358102..5e188be 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
@@ -18,6 +18,7 @@ package com.ning.billing.overdue.wrapper;
 
 import java.util.UUID;
 
+import org.joda.time.Period;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,6 +27,7 @@ import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.overdue.applicator.OverdueStateApplicator;
 import com.ning.billing.overdue.calculator.BillingStateCalculator;
+import com.ning.billing.overdue.config.DefaultDuration;
 import com.ning.billing.overdue.config.DefaultOverdueState;
 import com.ning.billing.overdue.config.DefaultOverdueStateSet;
 import com.ning.billing.overdue.config.OverdueConfig;
@@ -62,7 +64,7 @@ public class OverdueWrapperFactory {
 
     @SuppressWarnings("unchecked")
     public OverdueWrapper createOverdueWrapperFor(final Account blockable) throws OverdueException {
-        return (OverdueWrapper) new OverdueWrapper(blockable, api, getOverdueStateSetBundle(),
+        return (OverdueWrapper) new OverdueWrapper(blockable, api, getOverdueStateSet(),
                                                    clock, billingStateCalculator, overdueStateApplicator);
     }
 
@@ -71,7 +73,7 @@ public class OverdueWrapperFactory {
 
         try {
             Account account = accountApi.getAccountById(id, context);
-            return new OverdueWrapper(account, api, getOverdueStateSetBundle(),
+            return new OverdueWrapper(account, api, getOverdueStateSet(),
                                       clock, billingStateCalculator, overdueStateApplicator);
 
         } catch (AccountApiException e) {
@@ -79,8 +81,8 @@ public class OverdueWrapperFactory {
         }
     }
 
-    private OverdueStateSet getOverdueStateSetBundle() {
-        if (config == null || config.getBundleStateSet() == null) {
+    private OverdueStateSet getOverdueStateSet() {
+        if (config == null || config.getStateSet() == null) {
             return new DefaultOverdueStateSet() {
 
                 @SuppressWarnings("unchecked")
@@ -88,9 +90,14 @@ public class OverdueWrapperFactory {
                 protected DefaultOverdueState[] getStates() {
                     return new DefaultOverdueState[0];
                 }
+
+                @Override
+                public Period getInitialReevaluationInterval() {
+                    return null;
+                }
             };
         } else {
-            return config.getBundleStateSet();
+            return config.getStateSet();
         }
     }
 
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
index 5f9b236..f98528b 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
@@ -30,6 +30,7 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.overdue.OverdueState;
 import com.ning.billing.overdue.OverdueTestSuiteWithEmbeddedDB;
 import com.ning.billing.overdue.config.OverdueConfig;
+import com.ning.billing.overdue.config.api.OverdueStateSet;
 import com.ning.billing.util.config.catalog.XMLLoader;
 import com.ning.billing.events.OverdueChangeInternalEvent;
 import com.ning.billing.junction.DefaultBlockingState;
@@ -48,21 +49,22 @@ public class TestOverdueStateApplicator extends OverdueTestSuiteWithEmbeddedDB {
         final Account account = Mockito.mock(Account.class);
         Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
 
-        final OverdueState clearState = config.getBundleStateSet().findState(DefaultBlockingState.CLEAR_STATE_NAME);
+        final OverdueStateSet overdueStateSet = config.getStateSet();
+        final OverdueState clearState = config.getStateSet().findState(DefaultBlockingState.CLEAR_STATE_NAME);
         OverdueState state;
 
-        state = config.getBundleStateSet().findState("OD1");
-        applicator.apply(null, null, account, clearState, state, internalCallContext);
+        state = config.getStateSet().findState("OD1");
+        applicator.apply(overdueStateSet, null, account, clearState, state, internalCallContext);
         testOverdueHelper.checkStateApplied(state);
         checkBussEvent("OD1");
 
-        state = config.getBundleStateSet().findState("OD2");
-        applicator.apply(null, null, account, clearState, state, internalCallContext);
+        state = config.getStateSet().findState("OD2");
+        applicator.apply(overdueStateSet, null, account, clearState, state, internalCallContext);
         testOverdueHelper.checkStateApplied(state);
         checkBussEvent("OD2");
 
-        state = config.getBundleStateSet().findState("OD3");
-        applicator.apply(null, null, account, clearState, state, internalCallContext);
+        state = config.getStateSet().findState("OD3");
+        applicator.apply(overdueStateSet, null, account, clearState, state, internalCallContext);
         testOverdueHelper.checkStateApplied(state);
         checkBussEvent("OD3");
     }
diff --git a/overdue/src/test/java/com/ning/billing/overdue/config/MockOverdueRules.java b/overdue/src/test/java/com/ning/billing/overdue/config/MockOverdueRules.java
index 51f8970..cbdb2f5 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/config/MockOverdueRules.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/config/MockOverdueRules.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.overdue.config;
 
-import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
-
 public class MockOverdueRules extends OverdueConfig {
 
     public static final String CLEAR_STATE = "Clear";
@@ -25,8 +23,8 @@ public class MockOverdueRules extends OverdueConfig {
     @SuppressWarnings("unchecked")
     public MockOverdueRules() {
         final OverdueStatesAccount bundleODS = new OverdueStatesAccount();
-        bundleODS.setBundleOverdueStates(new DefaultOverdueState[]{new DefaultOverdueState().setName(CLEAR_STATE)});
-        setOverdueStatesBundle(bundleODS);
+        bundleODS.setAccountOverdueStates(new DefaultOverdueState[]{new DefaultOverdueState().setName(CLEAR_STATE)});
+        setOverdueStates(bundleODS);
 
     }
 }
diff --git a/overdue/src/test/java/com/ning/billing/overdue/config/TestOverdueConfig.java b/overdue/src/test/java/com/ning/billing/overdue/config/TestOverdueConfig.java
index 787ee3c..b898794 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/config/TestOverdueConfig.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/config/TestOverdueConfig.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.ning.billing.catalog.api.TimeUnit;
 import com.ning.billing.overdue.EmailNotification;
 import com.ning.billing.overdue.OverdueTestSuiteNoDB;
 import com.ning.billing.util.config.catalog.XMLLoader;
@@ -32,6 +33,9 @@ public class TestOverdueConfig extends OverdueTestSuiteNoDB {
     public void testParseConfig() throws Exception {
         final String xml = "<overdueConfig>" +
                            "   <accountOverdueStates>" +
+                           "       <initialReevaluationInterval>" +
+                           "           <unit>DAYS</unit><number>1</number>" +
+                           "       </initialReevaluationInterval>" +
                            "       <state name=\"OD1\">" +
                            "           <condition>" +
                            "               <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
@@ -65,11 +69,14 @@ public class TestOverdueConfig extends OverdueTestSuiteNoDB {
                            "</overdueConfig>";
         final InputStream is = new ByteArrayInputStream(xml.getBytes());
         final OverdueConfig c = XMLLoader.getObjectFromStreamNoValidation(is, OverdueConfig.class);
-        Assert.assertEquals(c.getBundleStateSet().size(), 2);
+        Assert.assertEquals(c.getStateSet().size(), 2);
 
-        Assert.assertNull(c.getBundleStateSet().getStates()[0].getEnterStateEmailNotification());
+        Assert.assertNull(c.getStateSet().getStates()[0].getEnterStateEmailNotification());
 
-        final EmailNotification secondNotification = c.getBundleStateSet().getStates()[1].getEnterStateEmailNotification();
+        Assert.assertNotNull(c.getStateSet().getInitialReevaluationInterval());
+        Assert.assertEquals(c.getStateSet().getInitialReevaluationInterval().getDays(), 1);
+
+        final EmailNotification secondNotification = c.getStateSet().getStates()[1].getEnterStateEmailNotification();
         Assert.assertEquals(secondNotification.getSubject(), "ToTo");
         Assert.assertEquals(secondNotification.getTemplateName(), "Titi");
         Assert.assertFalse(secondNotification.isHTML());
diff --git a/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java b/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
index eff7e09..a2bb61a 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
@@ -45,6 +45,9 @@ public class TestOverdueHelper {
     private final String configXml =
             "<overdueConfig>" +
             "   <accountOverdueStates>" +
+            "       <initialReevaluationInterval>" +
+            "           <unit>DAYS</unit><number>100</number>" +
+            "       </initialReevaluationInterval>" +
             "       <state name=\"OD3\">" +
             "           <condition>" +
             "               <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
diff --git a/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java b/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
index 0e14e49..3f61d8c 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
@@ -41,19 +41,19 @@ public class TestOverdueWrapper extends OverdueTestSuiteWithEmbeddedDB {
         OverdueWrapper wrapper;
         OverdueState state;
 
-        state = config.getBundleStateSet().findState("OD1");
+        state = config.getStateSet().findState("OD1");
         account = testOverdueHelper.createAccount(clock.getUTCToday().minusDays(31));
         wrapper = overdueWrapperFactory.createOverdueWrapperFor(account);
         wrapper.refresh(internalCallContext);
         testOverdueHelper.checkStateApplied(state);
 
-        state = config.getBundleStateSet().findState("OD2");
+        state = config.getStateSet().findState("OD2");
         account = testOverdueHelper.createAccount(clock.getUTCToday().minusDays(41));
         wrapper = overdueWrapperFactory.createOverdueWrapperFor(account);
         wrapper.refresh(internalCallContext);
         testOverdueHelper.checkStateApplied(state);
 
-        state = config.getBundleStateSet().findState("OD3");
+        state = config.getStateSet().findState("OD3");
         account = testOverdueHelper.createAccount(clock.getUTCToday().minusDays(51));
         wrapper = overdueWrapperFactory.createOverdueWrapperFor(account);
         wrapper.refresh(internalCallContext);
@@ -70,7 +70,7 @@ public class TestOverdueWrapper extends OverdueTestSuiteWithEmbeddedDB {
 
         final InputStream is = new ByteArrayInputStream(testOverdueHelper.getConfigXml().getBytes());
         final OverdueConfig config = XMLLoader.getObjectFromStreamNoValidation(is, OverdueConfig.class);
-        state = config.getBundleStateSet().findState(DefaultBlockingState.CLEAR_STATE_NAME);
+        state = config.getStateSet().findState(DefaultBlockingState.CLEAR_STATE_NAME);
         account = testOverdueHelper.createAccount(clock.getUTCToday().minusDays(31));
         wrapper = overdueWrapperFactory.createOverdueWrapperFor(account);
         final OverdueState result = wrapper.refresh(internalCallContext);