killbill-memoizeit
Changes
catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java 11(+5 -6)
junction/pom.xml 1(+1 -0)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java 9(+3 -6)
junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java 2(+1 -1)
Details
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
index 66e6a7d..b9f1dc8 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
@@ -72,7 +72,7 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
this.loaderCallback = new LoaderCallback() {
@Override
public Plan loadPlan(final String planName, final StaticCatalog catalog, final InternalTenantContext context) throws CatalogApiException {
- return loadOverriddenPlan(planName, catalog, context);
+ return loadOverriddenPlan(planName, (StandaloneCatalog) catalog, context);
}
};
}
@@ -94,8 +94,7 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
cacheController.putIfAbsent(planName, plan);
}
- private DefaultPlan loadOverriddenPlan(final String planName, final StaticCatalog catalog, final InternalTenantContext context) throws CatalogApiException {
-
+ private DefaultPlan loadOverriddenPlan(final String planName, final StandaloneCatalog catalog, final InternalTenantContext context) throws CatalogApiException {
final Matcher m = DefaultPriceOverride.CUSTOM_PLAN_NAME_PATTERN.matcher(planName);
if (!m.matches()) {
throw new CatalogApiException(ErrorCode.CAT_NO_SUCH_PLAN, planName);
@@ -104,10 +103,10 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
final Long planDefRecordId = Long.parseLong(m.group(2));
final List<CatalogOverridePhaseDefinitionModelDao> phaseDefs = overrideDao.getOverriddenPlanPhases(planDefRecordId, context);
- final DefaultPlan defaultPlan = (DefaultPlan) catalog.findCurrentPlan(parentPlanName);
+ final DefaultPlan defaultPlan = catalog.findCurrentPlan(parentPlanName);
final PlanPhasePriceOverride[] overrides = createOverrides(defaultPlan, phaseDefs, context);
- final DefaultPlan result = new DefaultPlan(planName, defaultPlan, overrides);
- result.initialize((StandaloneCatalog) catalog, ((StandaloneCatalog) catalog).getCatalogURI());
+ final DefaultPlan result = new DefaultPlan(catalog, planName, defaultPlan, overrides);
+ result.initialize(catalog, catalog.getCatalogURI());
return result;
}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java b/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
index 6f53186..9af1819 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
@@ -130,7 +130,7 @@ public class CatalogUpdater {
if (plan == null) {
- plan = new DefaultPlan();
+ plan = new DefaultPlan(catalog);
plan.setName(desc.getPlanId());
plan.setPriceListName(PriceListSet.DEFAULT_PRICELIST_NAME);
plan.setProduct(product);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
index f47f3a0..25f90bc 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
* The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
@@ -50,6 +50,7 @@ import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.Product;
import org.killbill.billing.catalog.api.Recurring;
+import org.killbill.billing.catalog.api.StaticCatalog;
import org.killbill.billing.catalog.api.TimeUnit;
import org.killbill.billing.util.cache.ExternalizableInput;
import org.killbill.billing.util.cache.ExternalizableOutput;
@@ -97,14 +98,21 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements
private String priceListName;
- private DateTime catalogEffectiveDate;
+ // Not exposed in XML
+ private StandaloneCatalog staticCatalog;
// For deserialization
public DefaultPlan() {
initialPhases = new DefaultPlanPhase[0];
}
- public DefaultPlan(final String planName, final DefaultPlan in, final PlanPhasePriceOverride[] overrides) {
+ public DefaultPlan(final StandaloneCatalog staticCatalog) {
+ this.staticCatalog = staticCatalog;
+ initialPhases = new DefaultPlanPhase[0];
+ }
+
+ public DefaultPlan(final StandaloneCatalog staticCatalog, final String planName, final DefaultPlan in, final PlanPhasePriceOverride[] overrides) {
+ this.staticCatalog = staticCatalog;
this.name = planName;
this.effectiveDateForExistingSubscriptions = in.getEffectiveDateForExistingSubscriptions();
this.product = (DefaultProduct) in.getProduct();
@@ -124,6 +132,11 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements
}
@Override
+ public StaticCatalog getCatalog() {
+ return staticCatalog;
+ }
+
+ @Override
public BillingMode getRecurringBillingMode() {
return recurringBillingMode;
}
@@ -221,7 +234,7 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements
}
this.priceListName = this.priceListName != null ? this.priceListName : findPriceListForPlan(catalog);
- this.catalogEffectiveDate = new DateTime(catalog.getEffectiveDate());
+ this.staticCatalog = catalog;
}
@Override
@@ -405,8 +418,4 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements
public void writeExternal(final ObjectOutput oo) throws IOException {
MapperHolder.mapper().writeValue(new ExternalizableOutput(oo), this);
}
-
- public DateTime getCatalogEffectiveDate() {
- return catalogEffectiveDate;
- }
}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
index b2508a5..502fa83 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
@@ -68,7 +68,7 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
@XmlElement(name = "usage", required = false)
private DefaultUsage[] usages;
- //Not exposed in XML
+ // Not exposed in XML
private Plan plan;
public DefaultPlanPhase() {
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
index edf0252..56ae3fb 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
@@ -127,7 +127,7 @@ public class DefaultPriceOverride implements PriceOverride {
planName = new StringBuffer(parentPlan.getName()).append("-dryrun-").append(DRY_RUN_PLAN_IDX.incrementAndGet()).toString();
}
- final DefaultPlan result = new DefaultPlan(planName, (DefaultPlan) parentPlan, resolvedOverride);
+ final DefaultPlan result = new DefaultPlan(standaloneCatalog, planName, (DefaultPlan) parentPlan, resolvedOverride);
result.initialize(standaloneCatalog, standaloneCatalog.getCatalogURI());
if (context == null) {
overriddenPlanCache.addDryRunPlan(planName, result);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java b/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
index c8bf3d4..e6cedcd 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
@@ -56,6 +56,7 @@ import org.killbill.billing.catalog.api.Price;
import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.Product;
import org.killbill.billing.catalog.api.Recurring;
+import org.killbill.billing.catalog.api.StaticCatalog;
import org.killbill.billing.catalog.api.Tier;
import org.killbill.billing.catalog.api.TieredBlock;
import org.killbill.billing.catalog.api.Unit;
@@ -108,7 +109,7 @@ public class StandaloneCatalogMapper {
result.setCatalogName(catalogName);
result.setEffectiveDate(pluginCatalog.getEffectiveDate().toDate());
result.setProducts(toDefaultProducts(pluginCatalog.getProducts()));
- result.setPlans(toDefaultPlans(pluginCatalog.getPlans()));
+ result.setPlans(toDefaultPlans(result, pluginCatalog.getPlans()));
result.setPriceLists(toDefaultPriceListSet(pluginCatalog.getDefaultPriceList(), pluginCatalog.getChildrenPriceList()));
result.setSupportedCurrencies(toArray(pluginCatalog.getCurrencies()));
result.setUnits(toDefaultUnits(pluginCatalog.getUnits()));
@@ -283,10 +284,10 @@ public class StandaloneCatalogMapper {
return filteredAndOrdered;
}
- private Iterable<Plan> toDefaultPlans(final Iterable<Plan> input) {
+ private Iterable<Plan> toDefaultPlans(final StaticCatalog staticCatalog, final Iterable<Plan> input) {
if (tmpDefaultPlans == null) {
final Map<String, Plan> map = new HashMap<String, Plan>();
- for (final Plan plan : input) map.put(plan.getName(), toDefaultPlan(plan));
+ for (final Plan plan : input) map.put(plan.getName(), toDefaultPlan(staticCatalog, plan));
tmpDefaultPlans = map;
}
return tmpDefaultPlans.values();
@@ -389,7 +390,7 @@ public class StandaloneCatalogMapper {
return result;
}
- private Plan toDefaultPlan(final Plan input) {
+ private Plan toDefaultPlan(final StaticCatalog staticCatalog, final Plan input) {
if (tmpDefaultPlans != null) {
final Plan existingPlan = tmpDefaultPlans.get(input.getName());
if (existingPlan == null) throw new IllegalStateException("Unknown plan " + input.getName());
junction/pom.xml 1(+1 -0)
diff --git a/junction/pom.xml b/junction/pom.xml
index bfc8c82..752bd31 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -91,6 +91,7 @@
<dependency>
<groupId>org.kill-bill.billing</groupId>
<artifactId>killbill-catalog</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.kill-bill.billing</groupId>
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
index f7285c5..ebc9f21 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -24,7 +24,6 @@ import java.util.List;
import javax.annotation.Nullable;
import org.joda.time.DateTime;
-import org.killbill.billing.catalog.DefaultPlan;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
@@ -91,8 +90,7 @@ public class DefaultBillingEvent implements BillingEvent {
final PlanPhase prevPlanPhase = (prevPhaseName != null && prevPlan != null) ? prevPlan.findPhase(prevPhaseName) : null;
this.billingPeriod = getRecurringBillingPeriod(prevPlanPhase);
}
- // TODO It would be nice to have an Plan api to get that date; actually the following would be nice
- this.catalogEffectiveDate = ((DefaultPlan) plan).getCatalogEffectiveDate();
+ this.catalogEffectiveDate = plan == null ? null : new DateTime(plan.getCatalog().getEffectiveDate());
this.billCycleDayLocal = billCycleDayLocal;
this.catalog = catalog;
@@ -113,7 +111,7 @@ public class DefaultBillingEvent implements BillingEvent {
final BillingPeriod billingPeriod, final int billCycleDayLocal,
final String description, final long totalOrdering, final SubscriptionBaseTransitionType type,
final Catalog catalog,
- final boolean isDisableEvent) {
+ final boolean isDisableEvent) throws CatalogApiException {
this.catalog = catalog;
this.subscription = subscription;
this.effectiveDate = effectiveDate;
@@ -129,8 +127,7 @@ public class DefaultBillingEvent implements BillingEvent {
this.usages = initializeUsage(isActive);
this.isDisableEvent = isDisableEvent;
this.nextPlanPhase = isDisableEvent ? null : planPhase;
- this.catalogEffectiveDate = plan != null ? ((DefaultPlan) plan).getCatalogEffectiveDate() : null;
-
+ this.catalogEffectiveDate = plan != null ? new DateTime(plan.getCatalog().getEffectiveDate()) : null;
}
@Override
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
index fa0af58..58d299b 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
@@ -668,7 +668,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
private class MockBillingEvent extends DefaultBillingEvent {
- public MockBillingEvent() {
+ public MockBillingEvent() throws CatalogApiException {
super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, Currency.USD, BillingPeriod.ANNUAL,
4, "", 3L, SubscriptionBaseTransitionType.CREATE, null, false);
}
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
index e146464..05ff9dd 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.killbill.billing.catalog.api.CatalogApiException;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -97,7 +98,7 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testEventOrderingSubscription() {
+ public void testEventOrderingSubscription() throws CatalogApiException {
final BillingEvent event0 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-31T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
final BillingEvent event1 = createEvent(subscription(ID_ONE), new DateTime("2012-01-31T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
final BillingEvent event2 = createEvent(subscription(ID_TWO), new DateTime("2012-01-31T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
@@ -115,7 +116,7 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testEventOrderingDate() {
+ public void testEventOrderingDate() throws CatalogApiException {
final BillingEvent event0 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
final BillingEvent event1 = createEvent(subscription(ID_ZERO), new DateTime("2012-02-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
final BillingEvent event2 = createEvent(subscription(ID_ZERO), new DateTime("2012-03-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
@@ -133,7 +134,7 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testEventTotalOrdering() {
+ public void testEventTotalOrdering() throws CatalogApiException {
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.CANCEL, 3L);
@@ -151,7 +152,7 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testEventOrderingMix() {
+ public void testEventOrderingMix() throws CatalogApiException {
final BillingEvent event0 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CREATE);
final BillingEvent event1 = createEvent(subscription(ID_ZERO), new DateTime("2012-01-02T00:02:04.000Z"), SubscriptionBaseTransitionType.CHANGE);
final BillingEvent event2 = createEvent(subscription(ID_ONE), new DateTime("2012-01-01T00:02:04.000Z"), SubscriptionBaseTransitionType.CANCEL);
@@ -175,17 +176,16 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
Assert.assertEquals(event.toString(), "DefaultBillingEvent{type=CREATE, effectiveDate=2012-01-01T00:02:04.000Z, planPhaseName=Test-trial, subscriptionId=00000000-0000-0000-0000-000000000000, totalOrdering=1}");
}
- private BillingEvent createEvent(final SubscriptionBase sub, final DateTime effectiveDate, final SubscriptionBaseTransitionType type) {
+ private BillingEvent createEvent(final SubscriptionBase sub, final DateTime effectiveDate, final SubscriptionBaseTransitionType type) throws CatalogApiException {
return createEvent(sub, effectiveDate, type, 1L);
}
- private BillingEvent createEvent(final SubscriptionBase sub, final DateTime effectiveDate, final SubscriptionBaseTransitionType type, final long totalOrdering) {
+ private BillingEvent createEvent(final SubscriptionBase sub, final DateTime effectiveDate, final SubscriptionBaseTransitionType type, final long totalOrdering) throws CatalogApiException {
final int billCycleDay = 1;
final Plan shotgun = new MockPlan();
final PlanPhase shotgunMonthly = createMockMonthlyPlanPhase(null, BigDecimal.ZERO, PhaseType.TRIAL);
- final Account account = new MockAccountBuilder().build();
return new DefaultBillingEvent(sub, effectiveDate, true,
shotgun, shotgunMonthly, BigDecimal.ZERO,
Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
diff --git a/util/src/test/java/org/killbill/billing/mock/MockPlan.java b/util/src/test/java/org/killbill/billing/mock/MockPlan.java
index d02457c..735ce46 100644
--- a/util/src/test/java/org/killbill/billing/mock/MockPlan.java
+++ b/util/src/test/java/org/killbill/billing/mock/MockPlan.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2011 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
@@ -27,10 +29,11 @@ import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
-import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.Product;
+import org.killbill.billing.catalog.api.StaticCatalog;
public class MockPlan implements Plan {
+
private final String name;
private final Product product;
@@ -44,6 +47,11 @@ public class MockPlan implements Plan {
}
@Override
+ public StaticCatalog getCatalog() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public BillingMode getRecurringBillingMode() {
return BillingMode.IN_ADVANCE;
}