Skip to content

Commit

Permalink
subscription: Code cleanup to remove old unused functionality where s…
Browse files Browse the repository at this point in the history
…ubscription could be restarted after cancellation
  • Loading branch information
sbrossie committed Feb 26, 2016
1 parent 1675808 commit 63a1a47
Show file tree
Hide file tree
Showing 17 changed files with 19 additions and 273 deletions.
Expand Up @@ -32,10 +32,6 @@ public enum SubscriptionBaseTransitionType {
* Occurs when a user changed the current {@code Plan} of the {@code SubscriptionBase}
*/
CHANGE,
/**
* Occurs when a user restarted a {@code SubscriptionBase} after it had been cancelled
*/
RE_CREATE,
/**
* Occurs when a user cancelled the {@code SubscriptionBase}
*/
Expand Down
Expand Up @@ -137,7 +137,6 @@ private BusEvent computeExtBusEventEntryFromBusInternalEvent(final BusInternalEv
objectType = ObjectType.SUBSCRIPTION;
objectId = realEventST.getSubscriptionId();
if (realEventST.getTransitionType() == SubscriptionBaseTransitionType.CREATE ||
realEventST.getTransitionType() == SubscriptionBaseTransitionType.RE_CREATE ||
realEventST.getTransitionType() == SubscriptionBaseTransitionType.TRANSFER) {
eventBusType = ExtBusEventType.SUBSCRIPTION_CREATION;
} else if (realEventST.getTransitionType() == SubscriptionBaseTransitionType.CANCEL) {
Expand Down
Expand Up @@ -136,7 +136,7 @@ public void testEventOrderingDate() {
public void testEventTotalOrdering() {
final BillingEvent event0 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE, 1L);
final BillingEvent event1 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CANCEL, 2L);
final BillingEvent event2 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.RE_CREATE, 3L);
final BillingEvent event2 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CANCEL, 3L);

final SortedSet<BillingEvent> set = new TreeSet<BillingEvent>();
set.add(event2);
Expand Down
Expand Up @@ -152,7 +152,6 @@ public TimedPhase getNextTimedPhase(final DefaultSubscriptionBase subscription,
switch (lastPlanTransition.getTransitionType()) {
// If we never had any Plan change, borrow the logic for createPlan alignment
case CREATE:
case RE_CREATE:
case TRANSFER:
final List<TimedPhase> timedPhases = getTimedPhaseOnCreate(subscription.getAlignStartDate(),
subscription.getBundleStartDate(),
Expand Down
Expand Up @@ -50,10 +50,6 @@ public DefaultSubscriptionBase createPlan(SubscriptionBuilder builder, Plan plan
public List<DefaultSubscriptionBase> createPlans(Iterable<SubscriptionSpecifier> subscriptions, CallContext context)
throws SubscriptionBaseApiException;

@Deprecated
public boolean recreatePlan(DefaultSubscriptionBase subscription, PlanPhaseSpecifier spec, List<PlanPhasePriceOverride> overrides, DateTime requestedDateWithMs, CallContext context)
throws SubscriptionBaseApiException;

public boolean cancel(DefaultSubscriptionBase subscription, CallContext context)
throws SubscriptionBaseApiException;

Expand Down Expand Up @@ -99,7 +95,7 @@ public PlanChangeResult getPlanChangeResult(final DefaultSubscriptionBase subscr
public List<SubscriptionBaseEvent> getEventsOnCreation(UUID bundleId, UUID subscriptionId, DateTime alignStartDate, DateTime bundleStartDate, long activeVersion,
Plan plan, PhaseType initialPhase,
String realPriceList, DateTime effectiveDate, DateTime processedDate,
boolean reCreate, InternalTenantContext context)
InternalTenantContext context)
throws CatalogApiException, SubscriptionBaseApiException;

public List<SubscriptionBaseEvent> getEventsOnChangePlan(DefaultSubscriptionBase subscription, Plan newPlan,
Expand Down
Expand Up @@ -524,7 +524,7 @@ private void populateDryRunEvents(@Nullable final UUID bundleId,
final DateTime bundleStartDate = getBundleStartDateWithSanity(bundleId, baseSubscription, plan, startEffectiveDate, context);
final UUID subscriptionId = UUIDs.randomUUID();
dryRunEvents = apiService.getEventsOnCreation(bundleId, subscriptionId, startEffectiveDate, bundleStartDate, 1L, plan, inputSpec.getPhaseType(), realPriceList,
startEffectiveDate, utcNow, false, context);
startEffectiveDate, utcNow, context);
final SubscriptionBuilder builder = new SubscriptionBuilder()
.setId(subscriptionId)
.setBundleId(bundleId)
Expand Down
Expand Up @@ -105,7 +105,6 @@ private SubscriptionBaseEvent createEvent(final boolean firstEvent, final Existi

switch (existingEvent.getSubscriptionTransitionType()) {
case TRANSFER:
case RE_CREATE:
case CREATE:
newEvent = new ApiEventTransfer(apiBuilder);
break;
Expand Down
Expand Up @@ -151,11 +151,9 @@ public EntitlementState getState() {
final SubscriptionBaseTransition pendingTransition = getPendingTransition();
if (pendingTransition != null &&
(pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.CREATE) ||
pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.TRANSFER) ||
pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.RE_CREATE))) {
pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.TRANSFER))) {
return EntitlementState.PENDING;
}

throw new IllegalStateException("Should return a valid EntitlementState");
}

Expand Down Expand Up @@ -223,11 +221,6 @@ public DateTime getFutureEndDate() {
return null;
}

public boolean recreate(final PlanPhaseSpecifier spec, final List<PlanPhasePriceOverride> overrides, final DateTime requestedDate,
final CallContext context) throws SubscriptionBaseApiException {
return apiService.recreatePlan(this, spec, overrides, requestedDate, context);
}

@Override
public boolean cancel(final CallContext context) throws SubscriptionBaseApiException {
return apiService.cancel(this, context);
Expand Down Expand Up @@ -498,7 +491,6 @@ public SubscriptionBaseTransitionData getLastTransitionForCurrentPlan() {
while (it.hasNext()) {
final SubscriptionBaseTransitionData cur = (SubscriptionBaseTransitionData) it.next();
if (cur.getTransitionType() == SubscriptionBaseTransitionType.CREATE
|| cur.getTransitionType() == SubscriptionBaseTransitionType.RE_CREATE
|| cur.getTransitionType() == SubscriptionBaseTransitionType.TRANSFER
|| cur.getTransitionType() == SubscriptionBaseTransitionType.CHANGE) {
return cur;
Expand Down Expand Up @@ -550,7 +542,6 @@ public DateTime getCurrentPhaseStart() {
if (cur.getTransitionType() == SubscriptionBaseTransitionType.PHASE
|| cur.getTransitionType() == SubscriptionBaseTransitionType.TRANSFER
|| cur.getTransitionType() == SubscriptionBaseTransitionType.CREATE
|| cur.getTransitionType() == SubscriptionBaseTransitionType.RE_CREATE
|| cur.getTransitionType() == SubscriptionBaseTransitionType.CHANGE) {
return cur.getEffectiveTransitionTime();
}
Expand Down Expand Up @@ -612,7 +603,6 @@ public void rebuildTransitions(final List<SubscriptionBaseEvent> inputEvents, fi
switch (apiEventType) {
case TRANSFER:
case CREATE:
case RE_CREATE:
prevEventId = null;
prevCreatedDate = null;
previousState = null;
Expand Down
Expand Up @@ -41,13 +41,11 @@
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanChangeResult;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
import org.killbill.billing.catalog.api.PlanPhasePriceOverridesWithCallContext;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.PriceListSet;
import org.killbill.billing.catalog.api.Product;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
Expand All @@ -66,9 +64,7 @@
import org.killbill.billing.subscription.events.user.ApiEventCancel;
import org.killbill.billing.subscription.events.user.ApiEventChange;
import org.killbill.billing.subscription.events.user.ApiEventCreate;
import org.killbill.billing.subscription.events.user.ApiEventReCreate;
import org.killbill.billing.subscription.events.user.ApiEventUncancel;
import org.killbill.billing.subscription.exceptions.SubscriptionBaseError;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
Expand Down Expand Up @@ -108,8 +104,17 @@ public DefaultSubscriptionBase createPlan(final SubscriptionBuilder builder, fin
final CallContext context) throws SubscriptionBaseApiException {
final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(builder, this, clock);

createFromSubscription(subscription, plan, initialPhase, realPriceList, effectiveDate, processedDate, false, context);
return subscription;
final InternalCallContext internalCallContext = createCallContextFromBundleId(subscription.getBundleId(), context);

try {
final List<SubscriptionBaseEvent> events = getEventsOnCreation(subscription.getBundleId(), subscription.getId(), subscription.getAlignStartDate(), subscription.getBundleStartDate(), subscription.getActiveVersion(),
plan, initialPhase, realPriceList, effectiveDate, processedDate, internalCallContext);
dao.createSubscription(subscription, events, internalCallContext);
subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), catalogService.getFullCatalog(internalCallContext));
return subscription;
} catch (final CatalogApiException e) {
throw new SubscriptionBaseApiException(e);
}
}

@Override
Expand All @@ -125,7 +130,7 @@ public List<DefaultSubscriptionBase> createPlans(final Iterable<SubscriptionSpec
final List<SubscriptionBaseEvent> events = getEventsOnCreation(subscriptionBase.getBundleId(), subscriptionBase.getId(), subscriptionBase.getAlignStartDate(),
subscriptionBase.getBundleStartDate(), subscriptionBase.getActiveVersion(), subscription.getPlan(),
subscription.getInitialPhase(), subscription.getRealPriceList(),
subscription.getEffectiveDate(), subscription.getProcessedDate(), false, internalCallContext);
subscription.getEffectiveDate(), subscription.getProcessedDate(), internalCallContext);
eventsMap.put(subscriptionBase.getId(), events);
subscriptionBaseList.add(subscriptionBase);

Expand All @@ -137,13 +142,12 @@ public List<DefaultSubscriptionBase> createPlans(final Iterable<SubscriptionSpec
final InternalCallContext internalCallContext = createCallContextFromBundleId(subscriptionBaseList.get(0).getBundleId(), context);
dao.createSubscriptionWithAddOns(subscriptionBaseList, eventsMap, internalCallContext);


final DefaultSubscriptionBase baseSubscription = findBaseSubscription(subscriptionBaseList);
try {
baseSubscription.rebuildTransitions(dao.getEventsForSubscription(baseSubscription.getId(), internalCallContext),
catalogService.getFullCatalog(internalCallContext));

for (final DefaultSubscriptionBase input :subscriptionBaseList) {
for (final DefaultSubscriptionBase input : subscriptionBaseList) {
if (input.getId().equals(baseSubscription.getId())) {
continue;
}
Expand All @@ -166,56 +170,6 @@ public boolean apply(final DefaultSubscriptionBase subscription) {
}).orNull();
}

@Deprecated
@Override
public boolean recreatePlan(final DefaultSubscriptionBase subscription, final PlanPhaseSpecifier spec, final List<PlanPhasePriceOverride> overrides, final DateTime requestedDateWithMs, final CallContext context)
throws SubscriptionBaseApiException {
final EntitlementState currentState = subscription.getState();
if (currentState != null && currentState != EntitlementState.CANCELLED) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_RECREATE_BAD_STATE, subscription.getId(), currentState);
}

final DateTime now = clock.getUTCNow();
final DateTime effectiveDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
validateEffectiveDate(subscription, effectiveDate);

try {
final String realPriceList = (spec.getPriceListName() == null) ? PriceListSet.DEFAULT_PRICELIST_NAME : spec.getPriceListName();
final InternalTenantContext internalCallContext = createTenantContextFromBundleId(subscription.getBundleId(), context);
final PlanPhasePriceOverridesWithCallContext overridesWithContext = new DefaultPlanPhasePriceOverridesWithCallContext(overrides, context);
final Plan plan = catalogService.getFullCatalog(internalCallContext).createOrFindPlan(spec.getProductName(), spec.getBillingPeriod(), realPriceList, overridesWithContext, effectiveDate);
final PlanPhase phase = plan.getAllPhases()[0];
if (phase == null) {
throw new SubscriptionBaseError(String.format("No initial PlanPhase for Product %s, term %s and set %s does not exist in the catalog",
spec.getProductName(), spec.getBillingPeriod().toString(), realPriceList));
}

createFromSubscription(subscription, plan, spec.getPhaseType(), realPriceList, effectiveDate, now, true, context);
return true;
} catch (final CatalogApiException e) {
throw new SubscriptionBaseApiException(e);
}
}

private void createFromSubscription(final DefaultSubscriptionBase subscription, final Plan plan, final PhaseType initialPhase,
final String realPriceList, final DateTime effectiveDate, final DateTime processedDate,
final boolean reCreate, final CallContext context) throws SubscriptionBaseApiException {
final InternalCallContext internalCallContext = createCallContextFromBundleId(subscription.getBundleId(), context);

try {
final List<SubscriptionBaseEvent> events = getEventsOnCreation(subscription.getBundleId(), subscription.getId(), subscription.getAlignStartDate(), subscription.getBundleStartDate(), subscription.getActiveVersion(),
plan, initialPhase, realPriceList, effectiveDate, processedDate, reCreate, internalCallContext);
if (reCreate) {
dao.recreateSubscription(subscription, events, internalCallContext);
} else {
dao.createSubscription(subscription, events, internalCallContext);
}
subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), catalogService.getFullCatalog(internalCallContext));
} catch (final CatalogApiException e) {
throw new SubscriptionBaseApiException(e);
}
}

@Override
public boolean cancel(final DefaultSubscriptionBase subscription, final CallContext context) throws SubscriptionBaseApiException {
final EntitlementState currentState = subscription.getState();
Expand Down Expand Up @@ -479,7 +433,7 @@ private void doChangePlan(final DefaultSubscriptionBase subscription,
public List<SubscriptionBaseEvent> getEventsOnCreation(final UUID bundleId, final UUID subscriptionId, final DateTime alignStartDate, final DateTime bundleStartDate, final long activeVersion,
final Plan plan, final PhaseType initialPhase,
final String realPriceList, final DateTime effectiveDate, final DateTime processedDate,
final boolean reCreate, final InternalTenantContext internalTenantContext) throws CatalogApiException, SubscriptionBaseApiException {
final InternalTenantContext internalTenantContext) throws CatalogApiException, SubscriptionBaseApiException {
final TimedPhase[] curAndNextPhases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, initialPhase,
realPriceList, effectiveDate, internalTenantContext);

Expand All @@ -491,7 +445,7 @@ public List<SubscriptionBaseEvent> getEventsOnCreation(final UUID bundleId, fina
.setActiveVersion(activeVersion)
.setEffectiveDate(effectiveDate)
.setFromDisk(true);
final ApiEvent creationEvent = (reCreate) ? new ApiEventReCreate(createBuilder) : new ApiEventCreate(createBuilder);
final ApiEvent creationEvent = new ApiEventCreate(createBuilder);

final TimedPhase nextTimedPhase = curAndNextPhases[1];
final PhaseEvent nextPhaseEvent = (nextTimedPhase != null) ?
Expand Down

1 comment on commit 63a1a47

@pierre
Copy link
Member

@pierre pierre commented on 63a1a47 Feb 29, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Please sign in to comment.