diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
index cab5264..b195634 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlementApi.java
@@ -286,6 +286,21 @@ public class DefaultEntitlementApi extends DefaultEntitlementApiBase implements
}
+
+ @Override
+ public void block(UUID bundleId, String serviceName, LocalDate effectiveDate, boolean blockBilling, boolean blockEntitlement, boolean blockChange, CallContext context)
+ throws EntitlementApiException {
+ final InternalCallContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalCallContext(bundleId, ObjectType.BUNDLE, context);
+ super.block(bundleId, serviceName, effectiveDate, blockBilling, blockEntitlement, blockChange, contextWithValidAccountRecordId);
+ }
+
+ @Override
+ public void unblock(UUID bundleId, String serviceName, LocalDate effectiveDate, CallContext context)
+ throws EntitlementApiException {
+ final InternalCallContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalCallContext(bundleId, ObjectType.BUNDLE, context);
+ super.unblock(bundleId, serviceName, effectiveDate, contextWithValidAccountRecordId);
+ }
+
@Override
public UUID transferEntitlements(final UUID sourceAccountId, final UUID destAccountId, final String externalKey, final LocalDate effectiveDate, final Iterable<PluginProperty> properties, final CallContext context) throws EntitlementApiException {
return transferEntitlementsOverrideBillingPolicy(sourceAccountId, destAccountId, externalKey, effectiveDate, BillingActionPolicy.IMMEDIATE, properties, context);
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
index 56ce01c..52ad28a 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/svcs/DefaultEntitlementApiBase.java
@@ -25,12 +25,10 @@ import java.util.Map;
import java.util.UUID;
import javax.annotation.Nullable;
-import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.killbill.billing.ErrorCode;
-import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.ImmutableAccountData;
@@ -39,7 +37,6 @@ import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.entitlement.AccountEntitlements;
import org.killbill.billing.entitlement.AccountEventsStreams;
import org.killbill.billing.entitlement.DefaultEntitlementService;
-import org.killbill.billing.entitlement.EntitlementInternalApi;
import org.killbill.billing.entitlement.EntitlementService;
import org.killbill.billing.entitlement.EntitlementTransitionType;
import org.killbill.billing.entitlement.EventsStream;
@@ -71,7 +68,6 @@ import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.bus.api.PersistentBus;
import org.killbill.bus.api.PersistentBus.EventBusException;
import org.killbill.clock.Clock;
@@ -86,7 +82,6 @@ public class DefaultEntitlementApiBase {
private static final Logger log = LoggerFactory.getLogger(DefaultEntitlementApiBase.class);
-
protected final EntitlementApi entitlementApi;
protected final AccountInternalApi accountApi;
@@ -104,16 +99,16 @@ public class DefaultEntitlementApiBase {
protected final PersistentBus eventBus;
protected DefaultEntitlementApiBase(final PersistentBus eventBus,
- @Nullable final EntitlementApi entitlementApi, final EntitlementPluginExecution pluginExecution,
- final InternalCallContextFactory internalCallContextFactory,
- final SubscriptionBaseInternalApi subscriptionInternalApi,
- final AccountInternalApi accountApi, final BlockingStateDao blockingStateDao, final Clock clock,
- final BlockingChecker checker, final NotificationQueueService notificationQueueService,
- final EventsStreamBuilder eventsStreamBuilder, final EntitlementUtils entitlementUtils, final SecurityApi securityApi) {
+ @Nullable final EntitlementApi entitlementApi, final EntitlementPluginExecution pluginExecution,
+ final InternalCallContextFactory internalCallContextFactory,
+ final SubscriptionBaseInternalApi subscriptionInternalApi,
+ final AccountInternalApi accountApi, final BlockingStateDao blockingStateDao, final Clock clock,
+ final BlockingChecker checker, final NotificationQueueService notificationQueueService,
+ final EventsStreamBuilder eventsStreamBuilder, final EntitlementUtils entitlementUtils, final SecurityApi securityApi) {
this.eventBus = eventBus;
this.entitlementApi = entitlementApi != null ? entitlementApi : (EntitlementApi) this;
this.accountApi = accountApi;
- this.pluginExecution= pluginExecution;
+ this.pluginExecution = pluginExecution;
this.internalCallContextFactory = internalCallContextFactory;
this.subscriptionInternalApi = subscriptionInternalApi;
this.clock = clock;
@@ -187,12 +182,11 @@ public class DefaultEntitlementApiBase {
return null;
}
- final BlockingState state = new DefaultBlockingState(bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, DefaultEntitlementApi.ENT_STATE_BLOCKED, EntitlementService.ENTITLEMENT_SERVICE_NAME, true, true, true, effectiveDate);
- entitlementUtils.setBlockingStateAndPostBlockingTransitionEvent(state, internalCallContext);
+ final UUID blockingId = blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_BLOCKED, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, true, true, true, baseSubscription, internalCallContext);
// Should we send one event per entitlement in the bundle?
// Code below only sends one event for the bundle and use the base entitlementId
- final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(state.getId(), baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.BLOCK_BUNDLE,
+ final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(blockingId, baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.BLOCK_BUNDLE,
effectiveDate, clock.getUTCNow(),
internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId(),
internalCallContext.getUserToken());
@@ -248,12 +242,11 @@ public class DefaultEntitlementApiBase {
return null;
}
- final BlockingState state = new DefaultBlockingState(bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, DefaultEntitlementApi.ENT_STATE_CLEAR, EntitlementService.ENTITLEMENT_SERVICE_NAME, false, false, false, effectiveDate);
- entitlementUtils.setBlockingStateAndPostBlockingTransitionEvent(state, internalCallContext);
+ final UUID blockingId = blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_CLEAR, EntitlementService.ENTITLEMENT_SERVICE_NAME, localEffectiveDate, false, false, false, baseSubscription, internalCallContext);
// Should we send one event per entitlement in the bundle?
// Code below only sends one event for the bundle and use the base entitlementId
- final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(state.getId(), baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.UNBLOCK_BUNDLE,
+ final DefaultEffectiveEntitlementEvent event = new DefaultEffectiveEntitlementEvent(blockingId, baseSubscription.getId(), bundleId, bundle.getAccountId(), EntitlementTransitionType.UNBLOCK_BUNDLE,
effectiveDate, clock.getUTCNow(),
internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId(),
internalCallContext.getUserToken());
@@ -275,6 +268,28 @@ public class DefaultEntitlementApiBase {
pluginExecution.executeWithPlugin(resumeWithPlugin, pluginContext);
}
+ public void block(final UUID bundleId, final String serviceName, final LocalDate localEffectiveDate, boolean blockBilling, boolean blockEntitlement, boolean blockChange, final InternalCallContext internalCallContext)
+ throws EntitlementApiException {
+ blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_BLOCKED, serviceName, localEffectiveDate, blockBilling, blockEntitlement, blockChange, null, internalCallContext);
+ }
+
+ public void unblock(UUID bundleId, String serviceName, LocalDate localEffectiveDate, InternalCallContext internalCallContext)
+ throws EntitlementApiException {
+ blockUnblockBundle(bundleId, DefaultEntitlementApi.ENT_STATE_CLEAR, serviceName, localEffectiveDate, false, false, false, null, internalCallContext);
+ }
+
+ private UUID blockUnblockBundle(final UUID bundleId, final String stateName, final String serviceName, final LocalDate localEffectiveDate, boolean blockBilling, boolean blockEntitlement, boolean blockChange, @Nullable final SubscriptionBase inputBaseSubscription, final InternalCallContext internalCallContext)
+ throws EntitlementApiException {
+ try {
+ final SubscriptionBase baseSubscription = inputBaseSubscription == null ? subscriptionInternalApi.getBaseSubscription(bundleId, internalCallContext) : inputBaseSubscription;
+ final DateTime effectiveDate = dateHelper.fromLocalDateAndReferenceTime(localEffectiveDate, baseSubscription.getStartDate(), internalCallContext);
+ final BlockingState state = new DefaultBlockingState(bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, stateName, serviceName, blockChange, blockEntitlement, blockBilling, effectiveDate);
+ entitlementUtils.setBlockingStateAndPostBlockingTransitionEvent(state, internalCallContext);
+ return state.getId();
+ } catch (SubscriptionBaseApiException e) {
+ throw new EntitlementApiException(e);
+ }
+ }
protected void recordPauseResumeNotificationEntry(final UUID entitlementId, final UUID bundleId, final DateTime effectiveDate, final boolean isPause, final InternalCallContext contextWithValidAccountRecordId) throws EntitlementApiException {
final NotificationEvent notificationEvent = new EntitlementNotificationKey(entitlementId,