private Collection<BlockingState> computeAddonsBlockingStatesForNextSubscriptionBaseEvent(final DateTime effectiveDate, final boolean useBillingEffectiveDate) { SubscriptionBaseTransition subscriptionBaseTransitionTrigger = null; if (!isEntitlementFutureCancelled()) { // Compute the transition trigger (either subscription cancel or change) final Iterable<SubscriptionBaseTransition> pendingSubscriptionBaseTransitions = getPendingSubscriptionEvents(effectiveDate, SubscriptionBaseTransitionType.CHANGE, SubscriptionBaseTransitionType.CANCEL); if (!pendingSubscriptionBaseTransitions.iterator().hasNext()) { return ImmutableList.<BlockingState>of(); } subscriptionBaseTransitionTrigger = pendingSubscriptionBaseTransitions.iterator().next(); } final Product baseTransitionTriggerNextProduct; final DateTime blockingStateEffectiveDate; if (subscriptionBaseTransitionTrigger == null) { baseTransitionTriggerNextProduct = null; blockingStateEffectiveDate = effectiveDate; } else { baseTransitionTriggerNextProduct = (EntitlementState.CANCELLED.equals(subscriptionBaseTransitionTrigger.getNextState()) ? null : subscriptionBaseTransitionTrigger.getNextPlan().getProduct()); blockingStateEffectiveDate = useBillingEffectiveDate ? subscriptionBaseTransitionTrigger.getEffectiveTransitionTime() : effectiveDate; } return computeAddonsBlockingStatesForSubscriptionBaseEvent(baseTransitionTriggerNextProduct, blockingStateEffectiveDate); }