killbill-memoizeit

catalog: implement Plan#getStaticCatalog This removes

6/22/2018 10:00:34 AM

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;
     }