killbill-memoizeit

Hardening of the code after running integration tests: - Fix

8/5/2014 9:49:23 PM

Details

diff --git a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
index ea11dcf..5370614 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
@@ -22,6 +22,7 @@ import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
 
+import org.joda.time.DateTimeZone;
 import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.CallOrigin;
 import org.killbill.billing.util.callcontext.UserType;
@@ -52,7 +53,7 @@ public class InternalCallContext extends InternalTenantContext {
         this.contextUserType = userType;
         this.reasonCode = reasonCode;
         this.comments = comment;
-        this.createdDate = createdDate;
+        this.createdDate = new DateTime(createdDate, DateTimeZone.UTC);
         this.updatedDate = updatedDate;
     }
 
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
index 03b8ba9..192d301 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/engine/core/DefaultEventsStream.java
@@ -27,9 +27,9 @@ import javax.annotation.Nullable;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
-
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.catalog.api.Plan;
 import org.killbill.billing.catalog.api.Product;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.entitlement.EntitlementService;
@@ -331,18 +331,22 @@ public class DefaultEventsStream implements EventsStream {
                                                                                                        new Predicate<SubscriptionBase>() {
                                                                                                            @Override
                                                                                                            public boolean apply(final SubscriptionBase subscription) {
-                                                                                                               return ProductCategory.ADD_ON.equals(subscription.getCategory()) &&
-                                                                                                                      // Check the entitlement for that add-on hasn't been cancelled yet
-                                                                                                                      getEntitlementCancellationEvent(subscription.getId()) == null &&
-                                                                                                                      (
-                                                                                                                              // Base subscription cancelled
-                                                                                                                              baseTransitionTriggerNextProduct == null ||
-                                                                                                                              (
-                                                                                                                                      // Change plan - check which add-ons to cancel
-                                                                                                                                      includedAddonsForProduct.contains(subscription.getLastActivePlan().getProduct().getName()) ||
-                                                                                                                                      !availableAddonsForProduct.contains(subscription.getLastActivePlan().getProduct().getName())
-                                                                                                                              )
-                                                                                                                      );
+                                                                                                               final Plan lastActivePlan = subscription.getLastActivePlan();
+                                                                                                               final boolean result = ProductCategory.ADD_ON.equals(subscription.getCategory()) &&
+                                                                                                                                      // Check the subscription started, if not we don't want it, and that way we avoid doing NPE a few lines below.
+                                                                                                                                      lastActivePlan != null &&
+                                                                                                                                      // Check the entitlement for that add-on hasn't been cancelled yet
+                                                                                                                                      getEntitlementCancellationEvent(subscription.getId()) == null &&
+                                                                                                                                      (
+                                                                                                                                              // Base subscription cancelled
+                                                                                                                                              baseTransitionTriggerNextProduct == null ||
+                                                                                                                                              (
+                                                                                                                                                      // Change plan - check which add-ons to cancel
+                                                                                                                                                      includedAddonsForProduct.contains(lastActivePlan.getProduct().getName()) ||
+                                                                                                                                                      !availableAddonsForProduct.contains(subscription.getLastActivePlan().getProduct().getName())
+                                                                                                                                              )
+                                                                                                                                      );
+                                                                                                               return result;
                                                                                                            }
                                                                                                        });
 
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
index daa9a47..9b4d9a2 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
@@ -144,6 +144,12 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
 
         boolean updatedAccountBCD = false;
         for (final SubscriptionBase subscription : subscriptions) {
+
+            // The subscription did not even start, so there is nothing to do yet, we can skip and avoid some NPE down the line when calculating the BCD
+            if (subscription.getState() == null) {
+                continue;
+            }
+
             for (final EffectiveSubscriptionInternalEvent transition : subscriptionApi.getBillingTransitions(subscription, context)) {
                 try {
                     final int bcdLocal = bcdCalculator.calculateBcd(bundle, subscription, transition, account, context);
diff --git a/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java b/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
index ef042d0..5cb3915 100644
--- a/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
+++ b/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
@@ -56,7 +56,7 @@ public interface PaymentConfig extends KillbillConfig {
     public int getPluginFailureRetryMaxAttempts();
 
     @Config("org.killbill.payment.plugin.timeout")
-    @Default("90s")
+    @Default("5s")
     @Description("Timeout for each payment attempt")
     public TimeSpan getPaymentPluginTimeout();