killbill-memoizeit

Details

diff --git a/api/src/main/java/org/killbill/billing/events/BusEventBase.java b/api/src/main/java/org/killbill/billing/events/BusEventBase.java
index 7c81de1..32eff73 100644
--- a/api/src/main/java/org/killbill/billing/events/BusEventBase.java
+++ b/api/src/main/java/org/killbill/billing/events/BusEventBase.java
@@ -48,4 +48,36 @@ public class BusEventBase implements BusEvent {
     public UUID getUserToken() {
         return userToken;
     }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof BusEventBase)) {
+            return false;
+        }
+
+        final BusEventBase that = (BusEventBase) o;
+
+        if (searchKey1 != null ? !searchKey1.equals(that.searchKey1) : that.searchKey1 != null) {
+            return false;
+        }
+        if (searchKey2 != null ? !searchKey2.equals(that.searchKey2) : that.searchKey2 != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = searchKey1 != null ? searchKey1.hashCode() : 0;
+        result = 31 * result + (searchKey2 != null ? searchKey2.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceNotificationInternalEvent.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceNotificationInternalEvent.java
index e969fa9..8ed9144 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceNotificationInternalEvent.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceNotificationInternalEvent.java
@@ -85,6 +85,9 @@ public class DefaultInvoiceNotificationInternalEvent extends BusEventBase implem
         if (!(o instanceof DefaultInvoiceNotificationInternalEvent)) {
             return false;
         }
+        if (!super.equals(o)) {
+            return false;
+        }
 
         final DefaultInvoiceNotificationInternalEvent that = (DefaultInvoiceNotificationInternalEvent) o;
 
@@ -100,15 +103,18 @@ public class DefaultInvoiceNotificationInternalEvent extends BusEventBase implem
         if (targetDate != null ? targetDate.compareTo(that.targetDate) != 0 : that.targetDate != null) {
             return false;
         }
+
         return true;
     }
 
     @Override
     public int hashCode() {
-        int result = targetDate != null ? targetDate.hashCode() : 0;
+        int result = super.hashCode();
+        result = 31 * result + (targetDate != null ? targetDate.hashCode() : 0);
         result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
         result = 31 * result + (amountOwed != null ? amountOwed.hashCode() : 0);
         result = 31 * result + (currency != null ? currency.hashCode() : 0);
         return result;
     }
 }
+
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index 0b3f65f..762f586 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -777,18 +777,15 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     private void notifyOfFutureBillingEvents(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final UUID accountId,
                                              final Map<UUID, List<DateTime>> callbackDateTimePerSubscriptions, final InternalCallContext internalCallContext) {
 
-
         final long dryRunNotificationTime = invoiceConfig.getDryRunNotificationSchedule().getMillis();
-        final boolean isInvoiceNotificationEnabled =  dryRunNotificationTime > 0;
+        final boolean isInvoiceNotificationEnabled = dryRunNotificationTime > 0;
         for (final UUID subscriptionId : callbackDateTimePerSubscriptions.keySet()) {
             final List<DateTime> callbackDateTimeUTC = callbackDateTimePerSubscriptions.get(subscriptionId);
             for (final DateTime cur : callbackDateTimeUTC) {
                 if (isInvoiceNotificationEnabled) {
                     final DateTime curDryRunNotificationTime = cur.minus(dryRunNotificationTime);
-                    // Only schedule if the date is in the future
-                    if (curDryRunNotificationTime.isAfter(clock.getUTCNow())) {
-                        nextBillingDatePoster.insertNextBillingDryRunNotificationFromTransaction(entitySqlDaoWrapperFactory, accountId, subscriptionId, curDryRunNotificationTime, cur, internalCallContext);
-                    }
+                    final DateTime effectiveCurDryRunNotificationTime = (curDryRunNotificationTime.isAfter(clock.getUTCNow())) ? curDryRunNotificationTime : clock.getUTCNow();
+                    nextBillingDatePoster.insertNextBillingDryRunNotificationFromTransaction(entitySqlDaoWrapperFactory, accountId, subscriptionId, effectiveCurDryRunNotificationTime, cur, internalCallContext);
                 }
                 nextBillingDatePoster.insertNextBillingNotificationFromTransaction(entitySqlDaoWrapperFactory, accountId, subscriptionId, cur, internalCallContext);
             }