killbill-aplcache
Changes
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java 13(+8 -5)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java 16(+7 -9)
subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java 30(+11 -19)
subscription/src/main/java/org/killbill/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java 10(+5 -5)
subscription/src/main/java/org/killbill/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java 21(+10 -11)
subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java 27(+13 -14)
subscription/src/main/java/org/killbill/billing/subscription/engine/addon/AddonUtils.java 23(+10 -13)
subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java 42(+24 -18)
subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java 2(+1 -1)
subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java 8(+7 -1)
subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java 4(+0 -4)
subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoSql.java 3(+2 -1)
Details
diff --git a/api/src/main/java/org/killbill/billing/catalog/api/CatalogInternalApi.java b/api/src/main/java/org/killbill/billing/catalog/api/CatalogInternalApi.java
new file mode 100644
index 0000000..c50693d
--- /dev/null
+++ b/api/src/main/java/org/killbill/billing/catalog/api/CatalogInternalApi.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2014-2017 Groupon, Inc
+ * Copyright 2014-2017 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
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.catalog.api;
+
+import org.killbill.billing.callcontext.InternalTenantContext;
+
+public interface CatalogInternalApi {
+
+ public Catalog getFullCatalog(boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext context) throws CatalogApiException;
+
+
+ public StaticCatalog getCurrentCatalog(boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext context) throws CatalogApiException;
+
+}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/api/DefaultCatalogInternalApi.java b/catalog/src/main/java/org/killbill/billing/catalog/api/DefaultCatalogInternalApi.java
new file mode 100644
index 0000000..afba853
--- /dev/null
+++ b/catalog/src/main/java/org/killbill/billing/catalog/api/DefaultCatalogInternalApi.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2014-2017 Groupon, Inc
+ * Copyright 2014-2017 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
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.catalog.api;
+
+import javax.inject.Inject;
+
+import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultCatalogInternalApi implements CatalogInternalApi {
+
+ private final Logger logger = LoggerFactory.getLogger(DefaultCatalogInternalApi.class);
+
+ private final CatalogService catalogService;
+
+ @Inject
+ public DefaultCatalogInternalApi(final CatalogService catalogService,
+ final InternalCallContextFactory internalCallContextFactory) {
+ this.catalogService = catalogService;
+ }
+
+ @Override
+ public Catalog getFullCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
+ return catalogService.getFullCatalogForInternalUse(useDefaultCatalog, filterTemplateCatalog, context);
+ }
+
+ @Override
+ public StaticCatalog getCurrentCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
+ return catalogService.getCurrentCatalogForInternalUse(useDefaultCatalog, filterTemplateCatalog, context);
+ }
+}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/CatalogCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/CatalogCache.java
index 9dc2ed8..d8cc70f 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/CatalogCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/CatalogCache.java
@@ -25,7 +25,7 @@ public interface CatalogCache {
public void loadDefaultCatalog(final String url) throws CatalogApiException;
- public VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext tenantContext) throws CatalogApiException;
+ public VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final boolean internalUse, InternalTenantContext tenantContext) throws CatalogApiException;
public void clearCatalog(InternalTenantContext tenantContext);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheCatalogCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheCatalogCache.java
index e479224..a424197 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheCatalogCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheCatalogCache.java
@@ -48,6 +48,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
public class EhCacheCatalogCache implements CatalogCache {
@@ -91,7 +92,17 @@ public class EhCacheCatalogCache implements CatalogCache {
}
@Override
- public VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext tenantContext) throws CatalogApiException {
+ public VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final boolean internalUse, final InternalTenantContext tenantContext) throws CatalogApiException {
+
+ //
+ // This is used by Kill Bill services (subscription/invoice/... creation/change)
+ //
+ // The goal is to ensure that on such operations any catalog plugin would also receive a TenantContext that contains both tenantId AND accountID (and could therefore run some optimization to return
+ // specific pieces of catalog for certain account). In such a scenario plugin would have to make sure that Kill Bill does not cache the catalog (since this is only cached at the tenant level)
+ //
+ if (internalUse) {
+ Preconditions.checkState(tenantContext.getAccountRecordId() !=null, "Unexpected null accountRecordId in context issued from internal Kill Bill service");
+ }
final VersionedCatalog pluginVersionedCatalog = getCatalogFromPlugins(tenantContext);
if (pluginVersionedCatalog != null) {
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultCatalogService.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultCatalogService.java
index 981b0e4..8733dd2 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultCatalogService.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultCatalogService.java
@@ -92,15 +92,25 @@ public class DefaultCatalogService implements KillbillService, CatalogService {
@Override
public Catalog getFullCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
- return getCatalog(useDefaultCatalog, filterTemplateCatalog, context);
+ return getCatalog(useDefaultCatalog, filterTemplateCatalog, false, context);
+ }
+
+ @Override
+ public Catalog getFullCatalogForInternalUse(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
+ return getCatalog(useDefaultCatalog, filterTemplateCatalog, true, context);
}
@Override
public StaticCatalog getCurrentCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
- return getCatalog(useDefaultCatalog, filterTemplateCatalog, context);
+ return getCatalog(useDefaultCatalog, filterTemplateCatalog, false, context);
+ }
+
+ @Override
+ public StaticCatalog getCurrentCatalogForInternalUse(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
+ return getCatalog(useDefaultCatalog, filterTemplateCatalog, true, context);
}
- private VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final InternalTenantContext context) throws CatalogApiException {
- return catalogCache.getCatalog(useDefaultCatalog, filterTemplateCatalog, context);
+ private VersionedCatalog getCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, final boolean internalUse, final InternalTenantContext context) throws CatalogApiException {
+ return catalogCache.getCatalog(useDefaultCatalog, filterTemplateCatalog, internalUse, context);
}
}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/glue/CatalogModule.java b/catalog/src/main/java/org/killbill/billing/catalog/glue/CatalogModule.java
index 794abd5..f97f26d 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/glue/CatalogModule.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/glue/CatalogModule.java
@@ -19,8 +19,10 @@
package org.killbill.billing.catalog.glue;
import org.killbill.billing.catalog.DefaultCatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.CatalogService;
import org.killbill.billing.catalog.api.CatalogUserApi;
+import org.killbill.billing.catalog.api.DefaultCatalogInternalApi;
import org.killbill.billing.catalog.api.user.DefaultCatalogUserApi;
import org.killbill.billing.catalog.caching.CatalogCache;
import org.killbill.billing.catalog.caching.CatalogCacheInvalidationCallback;
@@ -72,6 +74,10 @@ public class CatalogModule extends KillBillModule {
bind(CatalogUserApi.class).to(DefaultCatalogUserApi.class).asEagerSingleton();
}
+ protected void installCatalogInternalApi() {
+ bind(CatalogInternalApi.class).to(DefaultCatalogInternalApi.class).asEagerSingleton();
+ }
+
public void installCatalogConfigCache() {
bind(CatalogCache.class).to(EhCacheCatalogCache.class).asEagerSingleton();
bind(CacheInvalidationCallback.class).annotatedWith(Names.named(CATALOG_INVALIDATION_CALLBACK)).to(CatalogCacheInvalidationCallback.class).asEagerSingleton();
@@ -91,6 +97,7 @@ public class CatalogModule extends KillBillModule {
installCatalogDao();
installCatalog();
installCatalogUserApi();
+ installCatalogInternalApi();
installCatalogConfigCache();
installCatalogPluginApi();
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/caching/TestEhCacheCatalogCache.java b/catalog/src/test/java/org/killbill/billing/catalog/caching/TestEhCacheCatalogCache.java
index dca3946..f03a6a1 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/caching/TestEhCacheCatalogCache.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/caching/TestEhCacheCatalogCache.java
@@ -73,7 +73,7 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
@Test(groups = "fast")
public void testMissingDefaultCatalog() throws CatalogApiException {
catalogCache.loadDefaultCatalog(null);
- Assert.assertEquals(catalogCache.getCatalog(true, true, internalCallContext).getCatalogName(), "EmptyCatalog");
+ Assert.assertEquals(catalogCache.getCatalog(true, true, false, internalCallContext).getCatalogName(), "EmptyCatalog");
}
//
@@ -83,7 +83,7 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
public void testDefaultCatalog() throws CatalogApiException {
catalogCache.loadDefaultCatalog(Resources.getResource("SpyCarBasic.xml").toExternalForm());
- final VersionedCatalog result = catalogCache.getCatalog(true, true, internalCallContext);
+ final VersionedCatalog result = catalogCache.getCatalog(true, true, false, internalCallContext);
Assert.assertNotNull(result);
final Collection<Product> products = result.getProducts(clock.getUTCNow());
Assert.assertEquals(products.size(), 3);
@@ -94,10 +94,10 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
resultForMultiTenantContext.add(new StandaloneCatalogWithPriceOverride(cur, priceOverride, multiTenantContext.getTenantRecordId(), internalCallContextFactory));
}
- Assert.assertEquals(catalogCache.getCatalog(true, true, multiTenantContext).getCatalogName(), resultForMultiTenantContext.getCatalogName());
- Assert.assertEquals(catalogCache.getCatalog(true, true, multiTenantContext).getVersions().size(), resultForMultiTenantContext.getVersions().size());
- for (int i = 0; i < catalogCache.getCatalog(true, true, multiTenantContext).getVersions().size(); i++) {
- Assert.assertEquals(((StandaloneCatalogWithPriceOverride) catalogCache.getCatalog(true, true, multiTenantContext).getVersions().get(i)).getTenantRecordId(), ((StandaloneCatalogWithPriceOverride) resultForMultiTenantContext.getVersions().get(i)).getTenantRecordId());
+ Assert.assertEquals(catalogCache.getCatalog(true, true, false, multiTenantContext).getCatalogName(), resultForMultiTenantContext.getCatalogName());
+ Assert.assertEquals(catalogCache.getCatalog(true, true, false, multiTenantContext).getVersions().size(), resultForMultiTenantContext.getVersions().size());
+ for (int i = 0; i < catalogCache.getCatalog(true, true, false, multiTenantContext).getVersions().size(); i++) {
+ Assert.assertEquals(((StandaloneCatalogWithPriceOverride) catalogCache.getCatalog(true, true, false, multiTenantContext).getVersions().get(i)).getTenantRecordId(), ((StandaloneCatalogWithPriceOverride) resultForMultiTenantContext.getVersions().get(i)).getTenantRecordId());
}
}
@@ -138,14 +138,14 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
});
// Verify the lookup for a non-cached tenant. No system config is set yet but EhCacheCatalogCache returns a default empty one
- VersionedCatalog differentResult = catalogCache.getCatalog(true, true, differentMultiTenantContext);
+ VersionedCatalog differentResult = catalogCache.getCatalog(true, true, false, differentMultiTenantContext);
Assert.assertNotNull(differentResult);
Assert.assertEquals(differentResult.getCatalogName(), "EmptyCatalog");
// Make sure the cache loader isn't invoked, see https://github.com/killbill/killbill/issues/300
shouldThrow.set(true);
- differentResult = catalogCache.getCatalog(true, true, differentMultiTenantContext);
+ differentResult = catalogCache.getCatalog(true, true, false, differentMultiTenantContext);
Assert.assertNotNull(differentResult);
Assert.assertEquals(differentResult.getCatalogName(), "EmptyCatalog");
@@ -155,13 +155,13 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
catalogCache.loadDefaultCatalog(Resources.getResource("SpyCarBasic.xml").toExternalForm());
// Verify the lookup for this tenant
- final VersionedCatalog result = catalogCache.getCatalog(true, true, multiTenantContext);
+ final VersionedCatalog result = catalogCache.getCatalog(true, true, false, multiTenantContext);
Assert.assertNotNull(result);
final Collection<Product> products = result.getProducts(clock.getUTCNow());
Assert.assertEquals(products.size(), 6);
// Verify the lookup for another tenant
- final VersionedCatalog otherResult = catalogCache.getCatalog(true, true, otherMultiTenantContext);
+ final VersionedCatalog otherResult = catalogCache.getCatalog(true, true, false, otherMultiTenantContext);
Assert.assertNotNull(otherResult);
final Collection<Product> otherProducts = otherResult.getProducts(clock.getUTCNow());
Assert.assertEquals(otherProducts.size(), 3);
@@ -169,16 +169,16 @@ public class TestEhCacheCatalogCache extends CatalogTestSuiteNoDB {
shouldThrow.set(true);
// Verify the lookup for this tenant
- final VersionedCatalog result2 = catalogCache.getCatalog(true, true, multiTenantContext);
+ final VersionedCatalog result2 = catalogCache.getCatalog(true, true, false, multiTenantContext);
Assert.assertEquals(result2, result);
// Verify the lookup with another context for the same tenant
final InternalCallContext sameMultiTenantContext = Mockito.mock(InternalCallContext.class);
Mockito.when(sameMultiTenantContext.getAccountRecordId()).thenReturn(9102L);
Mockito.when(sameMultiTenantContext.getTenantRecordId()).thenReturn(multiTenantRecordId);
- Assert.assertEquals(catalogCache.getCatalog(true, true, sameMultiTenantContext), result);
+ Assert.assertEquals(catalogCache.getCatalog(true, true, false, sameMultiTenantContext), result);
// Verify the lookup with the other tenant
- Assert.assertEquals(catalogCache.getCatalog(true, true, otherMultiTenantContext), otherResult);
+ Assert.assertEquals(catalogCache.getCatalog(true, true, false, otherMultiTenantContext), otherResult);
}
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogModule.java b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogModule.java
index d793793..1e76d64 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogModule.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogModule.java
@@ -21,6 +21,7 @@ package org.killbill.billing.catalog;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.CatalogService;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.util.glue.KillBillModule;
@@ -37,10 +38,14 @@ public class MockCatalogModule extends KillBillModule {
final Catalog catalog = Mockito.mock(Catalog.class);
final CatalogService catalogService = Mockito.mock(CatalogService.class);
+ final CatalogInternalApi catalogInternalApi = Mockito.mock(CatalogInternalApi.class);
try {
+ Mockito.when(catalogService.getCurrentCatalogForInternalUse(Mockito.any(Boolean.class), Mockito.any(Boolean.class), Mockito.any(InternalCallContext.class))).thenReturn(new MockCatalog());
+ Mockito.when(catalogService.getFullCatalogForInternalUse(Mockito.any(Boolean.class), Mockito.any(Boolean.class), Mockito.any(InternalCallContext.class))).thenReturn(catalog);
Mockito.when(catalogService.getCurrentCatalog(Mockito.any(Boolean.class), Mockito.any(Boolean.class), Mockito.any(InternalCallContext.class))).thenReturn(new MockCatalog());
Mockito.when(catalogService.getFullCatalog(Mockito.any(Boolean.class), Mockito.any(Boolean.class), Mockito.any(InternalCallContext.class))).thenReturn(catalog);
bind(CatalogService.class).toInstance(catalogService);
+ bind(CatalogInternalApi.class).toInstance(catalogInternalApi);
} catch (CatalogApiException e) {
throw new RuntimeException(e);
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogService.java b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogService.java
index 64ae687..37fae0c 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogService.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalogService.java
@@ -40,6 +40,16 @@ public class MockCatalogService extends DefaultCatalogService {
}
@Override
+ public Catalog getFullCatalogForInternalUse(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext context) {
+ return catalog;
+ }
+
+ @Override
+ public StaticCatalog getCurrentCatalogForInternalUse(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext context) {
+ return catalog;
+ }
+
+ @Override
public Catalog getFullCatalog(final boolean useDefaultCatalog, final boolean filterTemplateCatalog, InternalTenantContext context) {
return catalog;
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index b3733a3..c9fbef9 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -38,7 +38,7 @@ import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.invoice.InvoiceDispatcher;
import org.killbill.billing.invoice.api.DryRunArguments;
@@ -97,7 +97,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
private final InternalCallContextFactory internalCallContextFactory;
private final PersistentBus eventBus;
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
@Inject
public DefaultInvoiceUserApi(final InvoiceDao dao,
@@ -107,7 +107,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
final TagInternalApi tagApi,
final InvoiceApiHelper invoiceApiHelper,
final HtmlInvoiceGenerator generator,
- final CatalogService catalogService,
+ final CatalogInternalApi catalogInternalApi,
final InternalCallContextFactory internalCallContextFactory) {
this.dao = dao;
this.dispatcher = dispatcher;
@@ -115,7 +115,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
this.tagApi = tagApi;
this.invoiceApiHelper = invoiceApiHelper;
this.generator = generator;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
this.internalCallContextFactory = internalCallContextFactory;
this.eventBus = eventBus;
}
@@ -123,7 +123,6 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
@Override
public List<Invoice> getInvoicesByAccount(final UUID accountId, boolean includesMigrated, final TenantContext context) {
-
final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, context);
final List<InvoiceModelDao> invoicesByAccount = includesMigrated ?
dao.getAllInvoicesByAccount(internalTenantContext) :
@@ -210,7 +209,10 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
public Invoice getInvoiceByNumber(final Integer number, final TenantContext context) throws InvoiceApiException {
// The account record id will be populated in the DAO
final InternalTenantContext internalTenantContextWithoutAccountRecordId = internalCallContextFactory.createInternalTenantContextWithoutAccountRecordId(context);
- return new DefaultInvoice(dao.getByNumber(number, internalTenantContextWithoutAccountRecordId), getCatalogSafelyForPrettyNames(internalTenantContextWithoutAccountRecordId));
+ final InvoiceModelDao invoice = dao.getByNumber(number, internalTenantContextWithoutAccountRecordId);
+
+ final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(invoice.getAccountId(), context);
+ return new DefaultInvoice(invoice, getCatalogSafelyForPrettyNames(internalTenantContext));
}
@Override
@@ -576,19 +578,20 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
@Override
public List<InvoiceItem> getInvoiceItemsByParentInvoice(final UUID parentInvoiceId, final TenantContext context) throws InvoiceApiException {
- final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(parentInvoiceId, ObjectType.INVOICE, context);
+ final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(parentInvoiceId, ObjectType.INVOICE, context);
return ImmutableList.copyOf(Collections2.transform(dao.getInvoiceItemsByParentInvoice(parentInvoiceId, internalTenantContext),
- new Function<InvoiceItemModelDao, InvoiceItem>() {
- @Override
- public InvoiceItem apply(final InvoiceItemModelDao input) {
- return InvoiceItemFactory.fromModelDao(input);
- }
- }));
+ new Function<InvoiceItemModelDao, InvoiceItem>() {
+ @Override
+ public InvoiceItem apply(final InvoiceItemModelDao input) {
+ return InvoiceItemFactory.fromModelDao(input);
+ }
+ }));
}
private Catalog getCatalogSafelyForPrettyNames(final InternalTenantContext internalTenantContext) {
+
try {
- return catalogService.getFullCatalog(true, true, internalTenantContext);
+ return catalogInternalApi.getFullCatalog(true, true, internalTenantContext);
} catch (final CatalogApiException e) {
log.warn(String.format("Failed to extract catalog to fill invoice item pretty names for tenantRecordId='%s', ignoring...", internalTenantContext.getTenantRecordId()), internalTenantContext.getTenantRecordId());
return null;
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
index cf7507e..76ec20d 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
@@ -39,7 +39,7 @@ import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
@@ -51,6 +51,7 @@ import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -62,7 +63,7 @@ public class BlockingCalculator {
private static final AtomicLong globaltotalOrder = new AtomicLong();
private final BlockingInternalApi blockingApi;
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
protected static class DisabledDuration {
@@ -88,9 +89,9 @@ public class BlockingCalculator {
}
@Inject
- public BlockingCalculator(final BlockingInternalApi blockingApi, final CatalogService catalogService) {
+ public BlockingCalculator(final BlockingInternalApi blockingApi, final CatalogInternalApi catalogInternalApi) {
this.blockingApi = blockingApi;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
}
/**
@@ -203,8 +204,10 @@ public class BlockingCalculator {
protected SortedSet<BillingEvent> createNewEvents(final List<DisabledDuration> disabledDuration, final SortedSet<BillingEvent> billingEvents, final SubscriptionBase subscription, final InternalTenantContext context) throws CatalogApiException {
+ Preconditions.checkState(context.getAccountRecordId() != null);
+
final SortedSet<BillingEvent> result = new TreeSet<BillingEvent>();
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
for (final DisabledDuration duration : disabledDuration) {
// The first one before the blocked duration
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
index bf4f041..2bdf73a 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
@@ -36,12 +36,11 @@ import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.BillingAlignment;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.catalog.api.StaticCatalog;
-import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.killbill.billing.entitlement.api.SubscriptionEventType;
import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
import org.killbill.billing.invoice.api.DryRunArguments;
@@ -62,6 +61,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
import com.google.common.collect.Collections2;
import com.google.inject.Inject;
@@ -70,7 +70,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
private static final Logger log = LoggerFactory.getLogger(DefaultInternalBillingApi.class);
private final AccountInternalApi accountApi;
private final SubscriptionBaseInternalApi subscriptionApi;
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
private final BlockingCalculator blockCalculator;
private final TagInternalApi tagApi;
@@ -78,11 +78,11 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
public DefaultInternalBillingApi(final AccountInternalApi accountApi,
final SubscriptionBaseInternalApi subscriptionApi,
final BlockingCalculator blockCalculator,
- final CatalogService catalogService,
+ final CatalogInternalApi catalogInternalApi,
final TagInternalApi tagApi) {
this.accountApi = accountApi;
this.subscriptionApi = subscriptionApi;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
this.blockCalculator = blockCalculator;
this.tagApi = tagApi;
}
@@ -90,7 +90,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
@Override
public BillingEventSet getBillingEventsForAccountAndUpdateAccountBCD(final UUID accountId, final DryRunArguments dryRunArguments, final InternalCallContext context) throws CatalogApiException, AccountApiException, SubscriptionBaseApiException {
- final StaticCatalog currentCatalog = catalogService.getCurrentCatalog(true, true, context);
+ final StaticCatalog currentCatalog = catalogInternalApi.getCurrentCatalog(true, true, context);
// Check to see if billing is off for the account
final List<Tag> accountTags = tagApi.getTags(accountId, ObjectType.ACCOUNT, context);
@@ -170,7 +170,6 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
}
}
-
private void addBillingEventsForSubscription(final ImmutableAccountData account,
final List<SubscriptionBase> subscriptions,
final SubscriptionBase baseSubscription,
@@ -188,7 +187,6 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
for (final SubscriptionBase subscription : subscriptions) {
-
final List<EffectiveSubscriptionInternalEvent> billingTransitions = subscriptionApi.getBillingTransitions(subscription, context);
if (billingTransitions.isEmpty() ||
(billingTransitions.get(0).getTransitionType() != SubscriptionBaseTransitionType.CREATE &&
@@ -198,7 +196,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
return;
}
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
Integer overridenBCD = null;
for (final EffectiveSubscriptionInternalEvent transition : billingTransitions) {
diff --git a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
index 4a84424..c471a7d 100644
--- a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
@@ -18,6 +18,7 @@ package org.killbill.billing.junction;
import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.CatalogService;
import org.killbill.billing.entitlement.dao.BlockingStateDao;
import org.killbill.billing.junction.glue.TestJunctionModuleNoDB;
@@ -45,6 +46,8 @@ public abstract class JunctionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
@Inject
protected CatalogService catalogService;
@Inject
+ protected CatalogInternalApi catalogInternalApi;
+ @Inject
protected SubscriptionBaseInternalApi subscriptionInternalApi;
@Inject
protected PersistentBus bus;
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
index b6bc999..b422e78 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
@@ -106,8 +106,10 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
Mockito.when(subscriptionInternalApi.getAllTransitions(Mockito.<SubscriptionBase>any(), Mockito.<InternalTenantContext>any())).thenReturn(effectiveSubscriptionTransitions);
catalog = ((MockCatalog) catalogService.getCurrentCatalog(true, true, internalCallContext));
- // TODO The MockCatalog module returns two different things for full vs current catalog
Mockito.when(catalogService.getFullCatalog(true, true, internalCallContext)).thenReturn(catalog);
+
+ Mockito.when(catalogInternalApi.getFullCatalog(true, true, internalCallContext)).thenReturn(catalog);
+ Mockito.when(catalogInternalApi.getCurrentCatalog(true, true, internalCallContext)).thenReturn(catalog);
// Set a default alignment
catalog.setBillingAlignment(BillingAlignment.ACCOUNT);
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java b/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
index 6e66d0c..1bf7beb 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
@@ -24,12 +24,11 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import org.joda.time.DateTime;
-
import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Duration;
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.Plan;
@@ -39,9 +38,9 @@ import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
+import org.killbill.billing.subscription.api.user.DefaultSubscriptionBase;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
import org.killbill.billing.subscription.api.user.SubscriptionBaseTransition;
-import org.killbill.billing.subscription.api.user.DefaultSubscriptionBase;
import org.killbill.billing.subscription.exceptions.SubscriptionBaseError;
import com.google.common.base.Predicate;
@@ -54,11 +53,11 @@ import com.google.common.collect.Iterables;
*/
public class PlanAligner extends BaseAligner {
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
@Inject
- public PlanAligner(final CatalogService catalogService) {
- this.catalogService = catalogService;
+ public PlanAligner(final CatalogInternalApi catalogInternalApi) {
+ this.catalogInternalApi = catalogInternalApi;
}
private enum WhichPhase {
@@ -76,7 +75,7 @@ public class PlanAligner extends BaseAligner {
* @param priceList the priceList
* @param effectiveDate the effective creation date (driven by the catalog policy, i.e. when the creation occurs)
* @return the current and next phases
- * @throws CatalogApiException for catalog errors
+ * @throws CatalogApiException for catalog errors
* @throws org.killbill.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
*/
public TimedPhase[] getCurrentAndNextTimedPhaseOnCreate(final DateTime alignStartDate,
@@ -101,13 +100,13 @@ public class PlanAligner extends BaseAligner {
/**
* Returns current Phase for that Plan change
*
- * @param subscription the subscription in change (only start date, bundle start date, current phase, plan and pricelist
- * are looked at)
- * @param plan the current Plan
- * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
+ * @param subscription the subscription in change (only start date, bundle start date, current phase, plan and pricelist
+ * are looked at)
+ * @param plan the current Plan
+ * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
* @param newPlanInitialPhaseType the phase on which to start when switching to new plan
* @return the current phase
- * @throws CatalogApiException for catalog errors
+ * @throws CatalogApiException for catalog errors
* @throws org.killbill.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
*/
public TimedPhase getCurrentTimedPhaseOnChange(final DefaultSubscriptionBase subscription,
@@ -122,13 +121,13 @@ public class PlanAligner extends BaseAligner {
/**
* Returns next Phase for that Plan change
*
- * @param subscription the subscription in change (only start date, bundle start date, current phase, plan and pricelist
- * are looked at)
- * @param plan the current Plan
- * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
+ * @param subscription the subscription in change (only start date, bundle start date, current phase, plan and pricelist
+ * are looked at)
+ * @param plan the current Plan
+ * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
* @param newPlanInitialPhaseType the phase on which to start when switching to new plan
* @return the next phase
- * @throws CatalogApiException for catalog errors
+ * @throws CatalogApiException for catalog errors
* @throws org.killbill.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
*/
public TimedPhase getNextTimedPhaseOnChange(final DefaultSubscriptionBase subscription,
@@ -142,12 +141,11 @@ public class PlanAligner extends BaseAligner {
/**
* Returns next Phase for that SubscriptionBase at a point in time
*
- * @param subscription the subscription for which we need to compute the next Phase event
+ * @param subscription the subscription for which we need to compute the next Phase event
* @return the next phase
*/
public TimedPhase getNextTimedPhase(final DefaultSubscriptionBase subscription, final DateTime effectiveDate, final InternalTenantContext context) {
-
try {
final SubscriptionBaseTransition pendingOrLastPlanTransition;
if (subscription.getState() == EntitlementState.PENDING) {
@@ -156,7 +154,6 @@ public class PlanAligner extends BaseAligner {
pendingOrLastPlanTransition = subscription.getLastTransitionForCurrentPlan();
}
-
switch (pendingOrLastPlanTransition.getTransitionType()) {
// If we never had any Plan change, borrow the logic for createPlan alignment
case CREATE:
@@ -182,7 +179,7 @@ public class PlanAligner extends BaseAligner {
context);
default:
throw new SubscriptionBaseError(String.format("Unexpected initial transition %s for current plan %s on subscription %s",
- pendingOrLastPlanTransition.getTransitionType(), subscription.getCurrentPlan(), subscription.getId()));
+ pendingOrLastPlanTransition.getTransitionType(), subscription.getCurrentPlan(), subscription.getId()));
}
} catch (Exception /* SubscriptionBaseApiException, CatalogApiException */ e) {
throw new SubscriptionBaseError(String.format("Could not compute next phase change for subscription %s", subscription.getId()), e);
@@ -196,7 +193,7 @@ public class PlanAligner extends BaseAligner {
final DateTime effectiveDate,
final InternalTenantContext context)
throws CatalogApiException, SubscriptionBaseApiException {
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final PlanSpecifier planSpecifier = new PlanSpecifier(plan.getName());
@@ -253,7 +250,7 @@ public class PlanAligner extends BaseAligner {
@Nullable final PhaseType newPlanInitialPhaseType,
final WhichPhase which,
final InternalTenantContext context) throws CatalogApiException, SubscriptionBaseApiException {
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final PlanPhaseSpecifier fromPlanPhaseSpecifier = new PlanPhaseSpecifier(currentPlan.getName(),
currentPhase.getPhaseType());
@@ -269,8 +266,8 @@ public class PlanAligner extends BaseAligner {
break;
case START_OF_BUNDLE:
planStartDate = bundleStartDate;
- initialPhase = newPlanInitialPhaseType != null ? newPlanInitialPhaseType :
- (isPlanContainPhaseType(nextPlan, originalInitialPhase) ? originalInitialPhase : null);
+ initialPhase = newPlanInitialPhaseType != null ? newPlanInitialPhaseType :
+ (isPlanContainPhaseType(nextPlan, originalInitialPhase) ? originalInitialPhase : null);
break;
case CHANGE_OF_PLAN:
planStartDate = lastOrCurrentChangeEffectiveDate;
@@ -286,7 +283,6 @@ public class PlanAligner extends BaseAligner {
return getTimedPhase(timedPhases, effectiveDate, which);
}
-
private List<TimedPhase> getPhaseAlignments(final Plan plan, @Nullable final PhaseType initialPhase, final DateTime initialPhaseStartDate) throws SubscriptionBaseApiException {
if (plan == null) {
return Collections.emptyList();
@@ -312,7 +308,7 @@ public class PlanAligner extends BaseAligner {
nextPhaseStart = addDuration(curPhaseStart, curPhaseDuration);
if (nextPhaseStart == null) {
throw new SubscriptionBaseError(String.format("Unexpected non ending UNLIMITED phase for plan %s",
- plan.getName()));
+ plan.getName()));
}
curPhaseStart = nextPhaseStart;
}
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/SubscriptionApiBase.java b/subscription/src/main/java/org/killbill/billing/subscription/api/SubscriptionApiBase.java
index 3734c92..0d28e58 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/SubscriptionApiBase.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/SubscriptionApiBase.java
@@ -21,7 +21,7 @@ import java.util.List;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.subscription.api.user.DefaultSubscriptionBase;
import org.killbill.billing.subscription.api.user.SubscriptionBuilder;
import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
@@ -37,13 +37,13 @@ public class SubscriptionApiBase {
protected final SubscriptionBaseApiService apiService;
protected final Clock clock;
- protected final CatalogService catalogService;
+ protected final CatalogInternalApi catalogInternalApi;
- public SubscriptionApiBase(final SubscriptionDao dao, final SubscriptionBaseApiService apiService, final Clock clock, final CatalogService catalogService) {
+ public SubscriptionApiBase(final SubscriptionDao dao, final SubscriptionBaseApiService apiService, final Clock clock, final CatalogInternalApi catalogInternalApi) {
this.dao = dao;
this.apiService = apiService;
this.clock = clock;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
}
protected List<SubscriptionBase> createSubscriptionsForApiUse(final List<SubscriptionBase> internalSubscriptions) {
@@ -62,7 +62,7 @@ public class SubscriptionApiBase {
protected DefaultSubscriptionBase createSubscriptionForApiUse(SubscriptionBuilder builder, List<SubscriptionBaseEvent> events, final InternalTenantContext context) throws CatalogApiException {
final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(builder, apiService, clock);
if (events.size() > 0) {
- subscription.rebuildTransitions(events, catalogService.getFullCatalog(true, true, context));
+ subscription.rebuildTransitions(events, catalogInternalApi.getFullCatalog(true, true, context));
}
return subscription;
}
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index fb97c35..b7bb7e7 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -23,7 +23,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -41,7 +40,7 @@ import org.killbill.billing.catalog.api.BillingActionPolicy;
import org.killbill.billing.catalog.api.BillingAlignment;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanChangeResult;
import org.killbill.billing.catalog.api.PlanPhase;
@@ -139,10 +138,10 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final SubscriptionBaseApiService apiService,
final NotificationQueueService notificationQueueService,
final Clock clock,
- final CatalogService catalogService,
+ final CatalogInternalApi catalogInternalApi,
final AddonUtils addonUtils,
final InternalCallContextFactory internalCallContextFactory) {
- super(dao, apiService, clock, catalogService);
+ super(dao, apiService, clock, catalogInternalApi);
this.addonUtils = addonUtils;
this.internalCallContextFactory = internalCallContextFactory;
this.notificationQueueService = notificationQueueService;
@@ -160,7 +159,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
*/
final CallContext callContext = internalCallContextFactory.createCallContext(context);
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final PlanPhasePriceOverridesWithCallContext overridesWithContext = new DefaultPlanPhasePriceOverridesWithCallContext(overrides, callContext);
final Plan plan = catalog.createOrFindPlan(spec, overridesWithContext, effectiveDate);
@@ -224,7 +223,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
spec.getProductName(), spec.getBillingPeriod().toString(), plan.getPriceListName()));
}
-
// verify the number of subscriptions (of the same kind) allowed per bundle and the existing ones
if (ProductCategory.ADD_ON.toString().equalsIgnoreCase(plan.getProduct().getCategory().toString())) {
if (plan.getPlansAllowedInBundle() != -1 && plan.getPlansAllowedInBundle() > 0) {
@@ -259,7 +257,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
private boolean sanityAndReorderBPSpecFirst(final Catalog catalog, final BaseEntitlementWithAddOnsSpecifier entitlementWithAddOnsSpecifier, final DateTime effectiveDate, final List<EntitlementSpecifier> outputEntitlementSpecifier) throws SubscriptionBaseApiException {
-
EntitlementSpecifier basePlanSpecifier = null;
final List<EntitlementSpecifier> addOnSpecifiers = new ArrayList<EntitlementSpecifier>();
try {
@@ -268,7 +265,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final boolean isBaseSpecifier = inputPlan.getProduct().getCategory() == ProductCategory.BASE;
if (isBaseSpecifier) {
if (basePlanSpecifier == null) {
- basePlanSpecifier = cur;
+ basePlanSpecifier = cur;
} else {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_INVALID_ENTITLEMENT_SPECIFIER);
}
@@ -287,11 +284,10 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
return basePlanSpecifier != null;
}
-
@Override
public List<SubscriptionBaseWithAddOns> createBaseSubscriptionsWithAddOns(final UUID accountId, final Iterable<BaseEntitlementWithAddOnsSpecifier> baseEntitlementWithAddOnsSpecifier, final InternalCallContext context) throws SubscriptionBaseApiException {
try {
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final CallContext callContext = internalCallContextFactory.createCallContext(context);
final DateTime now = clock.getUTCNow();
@@ -300,8 +296,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final DateTime effectiveDate = (entitlementWithAddOnsSpecifier.getBillingEffectiveDate() != null) ?
DefaultClock.truncateMs(entitlementWithAddOnsSpecifier.getBillingEffectiveDate().toDateTimeAtStartOfDay()) : now;
-
-
final List<EntitlementSpecifier> reorderedSpecifiers = new ArrayList<EntitlementSpecifier>();
final boolean isBaseSpecifierExists = sanityAndReorderBPSpecFirst(catalog, entitlementWithAddOnsSpecifier, effectiveDate, reorderedSpecifiers);
@@ -380,7 +374,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
context);
}
-
@Override
public SubscriptionBaseBundle createBundleForAccount(final UUID accountId, final String bundleKey, final InternalCallContext context) throws SubscriptionBaseApiException {
@@ -613,10 +606,10 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final CallContext callContext = internalCallContextFactory.createCallContext(context);
// verify the number of subscriptions (of the same kind) allowed per bundle
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final DateTime now = clock.getUTCNow();
final DateTime effectiveDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : null;
- final DateTime effectiveCatalogDate = effectiveDate != null? effectiveDate : now;
+ final DateTime effectiveCatalogDate = effectiveDate != null ? effectiveDate : now;
final PlanPhasePriceOverridesWithCallContext overridesWithContext = new DefaultPlanPhasePriceOverridesWithCallContext(overrides, callContext);
final Plan plan = catalog.createOrFindPlan(spec, overridesWithContext, effectiveCatalogDate);
if (ProductCategory.ADD_ON.toString().equalsIgnoreCase(plan.getProduct().getCategory().toString())) {
@@ -698,7 +691,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final PlanPhaseSpecifier inputSpec = dryRunArguments.getPlanPhaseSpecifier();
final boolean isInputSpecNullOrEmpty = inputSpec == null ||
(inputSpec.getPlanName() == null && inputSpec.getProductName() == null && inputSpec.getBillingPeriod() == null);
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
// Create an overridesWithContext with a null context to indicate this is dryRun and no price overriden plan should be created.
final PlanPhasePriceOverridesWithCallContext overridesWithContext = new DefaultPlanPhasePriceOverridesWithCallContext(dryRunArguments.getPlanPhasePriceOverrides(), null);
@@ -755,7 +748,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final Plan currentPlan = subscriptionForCancellation.getCurrentPlan();
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(currentPlan.getName(),
subscriptionForCancellation.getCurrentPhase().getPhaseType());
- policy = catalogService.getFullCatalog(true, true, context).planCancelPolicy(spec, utcNow);
+ policy = catalogInternalApi.getFullCatalog(true, true, context).planCancelPolicy(spec, utcNow);
}
// We pass null for billingAlignment, accountTimezone, account BCD because this is not available which means that dryRun with START_OF_TERM BillingPolicy will fail
cancelEffectiveDate = subscriptionForCancellation.getPlanChangeEffectiveDate(policy, null, null, -1, context);
@@ -846,7 +839,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
public int getDefaultBillCycleDayLocal(final Map<UUID, Integer> bcdCache, final SubscriptionBase subscription, final SubscriptionBase baseSubscription, final PlanPhaseSpecifier planPhaseSpecifier, final DateTimeZone accountTimeZone, final int accountBillCycleDayLocal, final DateTime effectiveDate, final InternalTenantContext context) throws SubscriptionBaseApiException {
try {
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final BillingAlignment alignment = catalog.billingAlignment(planPhaseSpecifier, effectiveDate);
return BillCycleDayCalculator.calculateBcdForAlignment(bcdCache, subscription, baseSubscription, alignment, accountTimeZone, accountBillCycleDayLocal);
} catch (final CatalogApiException e) {
@@ -886,7 +879,6 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
return requestedDate == null ? clock.getUTCNow() : internalCallContext.toUTCDateTime(requestedDate);
}
-
private DateTime getBundleStartDateWithSanity(final UUID bundleId, @Nullable final DefaultSubscriptionBase baseSubscription, final Plan plan,
final DateTime effectiveDate, final InternalTenantContext context) throws SubscriptionBaseApiException, CatalogApiException {
switch (plan.getProduct().getCategory()) {
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
index 49a7ae7..e7d5a5a 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
@@ -27,7 +27,7 @@ import org.joda.time.DateTime;
import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.subscription.api.SubscriptionApiBase;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseApiService;
@@ -45,17 +45,17 @@ import com.google.inject.Inject;
public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase implements SubscriptionBaseTimelineApi {
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public DefaultSubscriptionBaseTimelineApi(final CatalogService catalogService,
+ public DefaultSubscriptionBaseTimelineApi(final CatalogInternalApi catalogService,
final SubscriptionBaseApiService apiService,
final SubscriptionDao dao,
final InternalCallContextFactory internalCallContextFactory,
final Clock clock) {
super(dao, apiService, clock, catalogService);
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogService;
this.internalCallContextFactory = internalCallContextFactory;
}
@@ -136,7 +136,7 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
for (final SubscriptionBase cur : subscriptions) {
if (!repairIds.contains(cur.getId())) {
- result.add(new DefaultSubscriptionBaseTimeline((DefaultSubscriptionBase) cur, catalogService.getFullCatalog(true, true, tenantContext)));
+ result.add(new DefaultSubscriptionBaseTimeline((DefaultSubscriptionBase) cur, catalogInternalApi.getFullCatalog(true, true, tenantContext)));
}
}
return result;
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
index 0c45606..bc01cc5 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
@@ -23,17 +23,15 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
-
import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.catalog.api.ProductCategory;
-import org.killbill.clock.Clock;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.killbill.billing.subscription.api.SubscriptionApiBase;
import org.killbill.billing.subscription.api.SubscriptionBaseApiService;
@@ -58,6 +56,7 @@ import org.killbill.billing.subscription.exceptions.SubscriptionBaseError;
import org.killbill.billing.util.UUIDs;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.killbill.clock.Clock;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
@@ -65,15 +64,15 @@ import com.google.inject.Inject;
public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase implements SubscriptionBaseTransferApi {
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
private final SubscriptionBaseTimelineApi timelineApi;
private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public DefaultSubscriptionBaseTransferApi(final Clock clock, final SubscriptionDao dao, final SubscriptionBaseTimelineApi timelineApi, final CatalogService catalogService,
+ public DefaultSubscriptionBaseTransferApi(final Clock clock, final SubscriptionDao dao, final SubscriptionBaseTimelineApi timelineApi, final CatalogInternalApi catalogInternalApi,
final SubscriptionBaseApiService apiService, final InternalCallContextFactory internalCallContextFactory) {
- super(dao, apiService, clock, catalogService);
- this.catalogService = catalogService;
+ super(dao, apiService, clock, catalogInternalApi);
+ this.catalogInternalApi = catalogInternalApi;
this.timelineApi = timelineApi;
this.internalCallContextFactory = internalCallContextFactory;
}
@@ -83,7 +82,7 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
SubscriptionBaseEvent newEvent = null;
- final Catalog catalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog catalog = catalogInternalApi.getFullCatalog(true, true, context);
final DateTime effectiveDate = existingEvent.getEffectiveDate().isBefore(transferDate) ? transferDate : existingEvent.getEffectiveDate();
@@ -129,7 +128,7 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
@VisibleForTesting
List<SubscriptionBaseEvent> toEvents(final List<ExistingEvent> existingEvents, final DefaultSubscriptionBase subscription,
- final DateTime transferDate, final InternalTenantContext context) throws SubscriptionBaseTransferApiException {
+ final DateTime transferDate, final InternalTenantContext context) throws SubscriptionBaseTransferApiException {
try {
final List<SubscriptionBaseEvent> result = new LinkedList<SubscriptionBaseEvent>();
@@ -178,8 +177,8 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
@Override
public SubscriptionBaseBundle transferBundle(final UUID sourceAccountId, final UUID destAccountId,
- final String bundleKey, final DateTime transferDate, final boolean transferAddOn,
- final boolean cancelImmediately, final CallContext context) throws SubscriptionBaseTransferApiException {
+ final String bundleKey, final DateTime transferDate, final boolean transferAddOn,
+ final boolean cancelImmediately, final CallContext context) throws SubscriptionBaseTransferApiException {
final InternalCallContext fromInternalCallContext = internalCallContextFactory.createInternalCallContext(sourceAccountId, context);
final InternalCallContext toInternalCallContext = internalCallContextFactory.createInternalCallContext(destAccountId, context);
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
index e784b0b..130a4ab 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
@@ -40,7 +40,7 @@ import org.killbill.billing.catalog.api.BillingAlignment;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.CatalogEntity;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanChangeResult;
@@ -84,17 +84,17 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
private final Clock clock;
private final SubscriptionDao dao;
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
private final PlanAligner planAligner;
private final AddonUtils addonUtils;
private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public DefaultSubscriptionBaseApiService(final Clock clock, final SubscriptionDao dao, final CatalogService catalogService,
+ public DefaultSubscriptionBaseApiService(final Clock clock, final SubscriptionDao dao, final CatalogInternalApi catalogInternalApi,
final PlanAligner planAligner, final AddonUtils addonUtils,
final InternalCallContextFactory internalCallContextFactory) {
this.clock = clock;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
this.planAligner = planAligner;
this.dao = dao;
this.addonUtils = addonUtils;
@@ -114,7 +114,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
final List<SubscriptionBaseEvent> events = getEventsOnCreation(subscription.getBundleId(), subscription.getId(), subscription.getAlignStartDate(), subscription.getBundleStartDate(),
plan, initialPhase, realPriceList, effectiveDate, processedDate, internalCallContext);
dao.createSubscription(subscription, events, internalCallContext);
- subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), catalogService.getFullCatalog(true, true, internalCallContext));
+ subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), catalogInternalApi.getFullCatalog(true, true, internalCallContext));
return subscription;
} catch (final CatalogApiException e) {
throw new SubscriptionBaseApiException(e);
@@ -145,7 +145,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
for (final List<SubscriptionBase> subscriptions : subscriptionBaseAndAddOnsList) {
for (final SubscriptionBase input : subscriptions) {
((DefaultSubscriptionBase) input).rebuildTransitions(dao.getEventsForSubscription(input.getId(), internalCallContext),
- catalogService.getFullCatalog(true, true, internalCallContext));
+ catalogInternalApi.getFullCatalog(true, true, internalCallContext));
}
}
return allSubscriptions;
@@ -184,7 +184,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
try {
final InternalCallContext internalCallContext = createCallContextFromBundleId(subscription.getBundleId(), context);
- final BillingActionPolicy policy = catalogService.getFullCatalog(true, true, internalCallContext).planCancelPolicy(planPhase, now);
+ final BillingActionPolicy policy = catalogInternalApi.getFullCatalog(true, true, internalCallContext).planCancelPolicy(planPhase, now);
Preconditions.checkState(policy != BillingActionPolicy.START_OF_TERM, "A default START_OF_TERM policy is not availaible");
@@ -228,7 +228,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
try {
for (final DefaultSubscriptionBase subscription : subscriptions) {
- final BillingAlignment billingAlignment = (subscription.getState() == EntitlementState.PENDING ? null : catalogService.getFullCatalog(true, true, context).billingAlignment(new PlanPhaseSpecifier(subscription.getLastActivePlan().getName(), subscription.getLastActivePhase().getPhaseType()), clock.getUTCNow()));
+ final BillingAlignment billingAlignment = (subscription.getState() == EntitlementState.PENDING ? null : catalogInternalApi.getFullCatalog(true, true, context).billingAlignment(new PlanPhaseSpecifier(subscription.getLastActivePlan().getName(), subscription.getLastActivePhase().getPhaseType()), clock.getUTCNow()));
final DateTime effectiveDate = subscription.getPlanChangeEffectiveDate(policy, billingAlignment, accountTimeZone, accountBillCycleDayLocal, context);
subscriptionsWithEffectiveDate.put(subscription, effectiveDate);
}
@@ -260,7 +260,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
boolean allSubscriptionsCancelled = true;
for (final DefaultSubscriptionBase subscription : subscriptions.keySet()) {
- final Catalog fullCatalog = catalogService.getFullCatalog(true, true, internalCallContext);
+ final Catalog fullCatalog = catalogInternalApi.getFullCatalog(true, true, internalCallContext);
subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), fullCatalog);
allSubscriptionsCancelled = allSubscriptionsCancelled && (subscription.getState() == EntitlementState.CANCELLED);
}
@@ -304,7 +304,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
dao.uncancelSubscription(subscription, uncancelEvents, internalCallContext);
try {
- final Catalog fullCatalog = catalogService.getFullCatalog(true, true, internalCallContext);
+ final Catalog fullCatalog = catalogInternalApi.getFullCatalog(true, true, internalCallContext);
subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), fullCatalog);
return true;
} catch (final CatalogApiException e) {
@@ -394,7 +394,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
final PlanPhaseSpecifier fromPlanPhase = new PlanPhaseSpecifier(currentPlan.getName(),
subscription.getCurrentOrPendingPhase().getPhaseType());
- planChangeResult = catalogService.getFullCatalog(true, true, internalCallContext).planChange(fromPlanPhase, toPlanPhase, effectiveDate);
+ planChangeResult = catalogInternalApi.getFullCatalog(true, true, internalCallContext).planChange(fromPlanPhase, toPlanPhase, effectiveDate);
} catch (final CatalogApiException e) {
throw new SubscriptionBaseApiException(e);
}
@@ -409,7 +409,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
final CallContext context) throws SubscriptionBaseApiException, CatalogApiException {
final InternalCallContext internalCallContext = createCallContextFromBundleId(subscription.getBundleId(), context);
final PlanPhasePriceOverridesWithCallContext overridesWithContext = new DefaultPlanPhasePriceOverridesWithCallContext(overrides, context);
- final Plan newPlan = catalogService.getFullCatalog(true, true, internalCallContext).createOrFindPlan(spec, overridesWithContext, effectiveDate, subscription.getStartDate());
+ final Plan newPlan = catalogInternalApi.getFullCatalog(true, true, internalCallContext).createOrFindPlan(spec, overridesWithContext, effectiveDate, subscription.getStartDate());
final PhaseType initialPhaseType;
if (overrides != null &&
@@ -421,7 +421,6 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
initialPhaseType = null;
}
-
if (ProductCategory.ADD_ON.toString().equalsIgnoreCase(newPlan.getProduct().getCategory().toString())) {
if (newPlan.getPlansAllowedInBundle() != -1
&& newPlan.getPlansAllowedInBundle() > 0
@@ -442,7 +441,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
dao.changePlan(subscription, changeEvents, addOnSubscriptionsToBeCancelled, addOnCancelEvents, internalCallContext);
- final Catalog fullCatalog = catalogService.getFullCatalog(true, true, internalCallContext);
+ final Catalog fullCatalog = catalogInternalApi.getFullCatalog(true, true, internalCallContext);
subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), fullCatalog);
}
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/engine/addon/AddonUtils.java b/subscription/src/main/java/org/killbill/billing/subscription/engine/addon/AddonUtils.java
index 5b238c2..e01da44 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/engine/addon/AddonUtils.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/engine/addon/AddonUtils.java
@@ -23,7 +23,7 @@ import org.joda.time.DateTime;
import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.Product;
import org.killbill.billing.catalog.api.ProductCategory;
@@ -37,24 +37,23 @@ import com.google.inject.Inject;
public class AddonUtils {
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
@Inject
- public AddonUtils(final CatalogService catalogService) {
- this.catalogService = catalogService;
+ public AddonUtils(final CatalogInternalApi catalogInternalApi) {
+ this.catalogInternalApi = catalogInternalApi;
}
public void checkAddonCreationRights(final DefaultSubscriptionBase baseSubscription, final Plan targetAddOnPlan, final DateTime requestedDate, final InternalTenantContext context)
throws SubscriptionBaseApiException, CatalogApiException {
-
if (baseSubscription.getState() == EntitlementState.CANCELLED ||
- (baseSubscription.getState() == EntitlementState.PENDING && context.toLocalDate(baseSubscription.getStartDate()).compareTo(context.toLocalDate(requestedDate)) < 0)) {
+ (baseSubscription.getState() == EntitlementState.PENDING && context.toLocalDate(baseSubscription.getStartDate()).compareTo(context.toLocalDate(requestedDate)) < 0)) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_BP_NON_ACTIVE, targetAddOnPlan.getName());
}
final Plan currentOrPendingPlan = baseSubscription.getCurrentOrPendingPlan();
- final Product baseProduct = catalogService.getFullCatalog(true, true, context).findProduct(currentOrPendingPlan.getProduct().getName(), requestedDate);
+ final Product baseProduct = catalogInternalApi.getFullCatalog(true, true, context).findProduct(currentOrPendingPlan.getProduct().getName(), requestedDate);
if (isAddonIncluded(baseProduct, targetAddOnPlan)) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_ALREADY_INCLUDED,
targetAddOnPlan.getName(), currentOrPendingPlan.getProduct().getName());
@@ -68,7 +67,7 @@ public class AddonUtils {
public boolean isAddonAvailableFromProdName(final String baseProductName, final Plan targetAddOnPlan, final DateTime requestedDate, final InternalTenantContext context) {
try {
- final Product product = catalogService.getFullCatalog(true, true, context).findProduct(baseProductName, requestedDate);
+ final Product product = catalogInternalApi.getFullCatalog(true, true, context).findProduct(baseProductName, requestedDate);
return isAddonAvailable(product, targetAddOnPlan);
} catch (CatalogApiException e) {
throw new SubscriptionBaseError(e);
@@ -77,7 +76,7 @@ public class AddonUtils {
public boolean isAddonAvailableFromPlanName(final String basePlanName, final Plan targetAddOnPlan, final DateTime requestedDate, final InternalTenantContext context) {
try {
- final Plan plan = catalogService.getFullCatalog(true, true, context).findPlan(basePlanName, requestedDate);
+ final Plan plan = catalogInternalApi.getFullCatalog(true, true, context).findPlan(basePlanName, requestedDate);
final Product product = plan.getProduct();
return isAddonAvailable(product, targetAddOnPlan);
} catch (CatalogApiException e) {
@@ -85,10 +84,9 @@ public class AddonUtils {
}
}
-
public boolean isAddonIncludedFromProdName(final String baseProductName, final Plan targetAddOnPlan, final DateTime requestedDate, final InternalTenantContext context) {
try {
- final Product product = catalogService.getFullCatalog(true, true, context).findProduct(baseProductName, requestedDate);
+ final Product product = catalogInternalApi.getFullCatalog(true, true, context).findProduct(baseProductName, requestedDate);
return isAddonIncluded(product, targetAddOnPlan);
} catch (CatalogApiException e) {
throw new SubscriptionBaseError(e);
@@ -98,7 +96,7 @@ public class AddonUtils {
public boolean isAddonIncludedFromPlanName(final String basePlanName, final Plan targetAddOnPlan, final DateTime requestedDate, final InternalTenantContext context) {
try {
- final Plan plan = catalogService.getFullCatalog(true, true, context).findPlan(basePlanName, requestedDate);
+ final Plan plan = catalogInternalApi.getFullCatalog(true, true, context).findPlan(basePlanName, requestedDate);
final Product product = plan.getProduct();
return isAddonIncluded(product, targetAddOnPlan);
} catch (CatalogApiException e) {
@@ -106,7 +104,6 @@ public class AddonUtils {
}
}
-
private boolean isAddonAvailable(final Product baseProduct, final Plan targetAddOnPlan) {
final Product targetAddonProduct = targetAddOnPlan.getProduct();
final Collection<Product> availableAddOns = baseProduct.getAvailable();
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java b/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
index 5fe34c7..3ee2332 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
@@ -33,14 +33,14 @@ import java.util.UUID;
import javax.annotation.Nullable;
import javax.inject.Inject;
-import com.google.common.base.Preconditions;
import org.joda.time.DateTime;
import org.killbill.billing.ErrorCode;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.SubscriptionApiException;
@@ -76,7 +76,6 @@ import org.killbill.billing.subscription.events.user.ApiEvent;
import org.killbill.billing.subscription.events.user.ApiEventBuilder;
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.ApiEventType;
import org.killbill.billing.subscription.exceptions.SubscriptionBaseError;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
@@ -104,6 +103,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Collections2;
@@ -119,18 +119,20 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
private final NotificationQueueService notificationQueueService;
private final AddonUtils addonUtils;
private final PersistentBus eventBus;
- private final CatalogService catalogService;
+ private final CatalogInternalApi catalogInternalApi;
+ private final InternalCallContextFactory internalCallContextFactory;
@Inject
public DefaultSubscriptionDao(final IDBI dbi, final Clock clock, final AddonUtils addonUtils,
- final NotificationQueueService notificationQueueService, final PersistentBus eventBus, final CatalogService catalogService,
+ final NotificationQueueService notificationQueueService, final PersistentBus eventBus, final CatalogInternalApi catalogInternalApi,
final CacheControllerDispatcher cacheControllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, clock, cacheControllerDispatcher, nonEntityDao, internalCallContextFactory), BundleSqlDao.class);
this.clock = clock;
this.notificationQueueService = notificationQueueService;
this.addonUtils = addonUtils;
this.eventBus = eventBus;
- this.catalogService = catalogService;
+ this.catalogInternalApi = catalogInternalApi;
+ this.internalCallContextFactory = internalCallContextFactory;
}
@Override
@@ -643,14 +645,13 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
});
}
-
@Override
public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> originalInputChangeEvents, final List<DefaultSubscriptionBase> subscriptionsToBeCancelled, final List<SubscriptionBaseEvent> cancelEvents, final InternalCallContext context) {
// First event is expected to be the subscription CHANGE event
- final SubscriptionBaseEvent inputChangeEvent = originalInputChangeEvents.get(0);
+ final SubscriptionBaseEvent inputChangeEvent = originalInputChangeEvents.get(0);
Preconditions.checkState(inputChangeEvent.getType() == EventType.API_USER &&
- ((ApiEvent) inputChangeEvent).getApiEventType() == ApiEventType.CHANGE);
+ ((ApiEvent) inputChangeEvent).getApiEventType() == ApiEventType.CHANGE);
Preconditions.checkState(inputChangeEvent.getSubscriptionId().equals(subscription.getId()));
transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
@@ -693,11 +694,8 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
inputChangeEvents = originalInputChangeEvents;
}
-
cancelFutureEventsFromTransaction(activePresentOrFutureSubscriptionEvents, entitySqlDaoWrapperFactory, false, context);
-
-
for (final SubscriptionBaseEvent cur : inputChangeEvents) {
createAndRefresh(transactional, new SubscriptionEventModelDao(cur), context);
@@ -765,11 +763,10 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
cancelFutureEventsFromTransaction(eventModels, entitySqlDaoWrapperFactory, includingBCDChange, context);
}
-
private void cancelFutureEventsFromTransaction(final Iterable<SubscriptionEventModelDao> eventModels, final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final boolean includingBCDChange, final InternalCallContext context) {
for (final SubscriptionEventModelDao cur : eventModels) {
// Skip CREATE event (because of date equality in the query and we don't want to invalidate CREATE event that match a CANCEL event)
- if (cur.getEventType() == EventType.API_USER && (cur.getUserType()== ApiEventType.CREATE || cur.getUserType()== ApiEventType.TRANSFER)) {
+ if (cur.getEventType() == EventType.API_USER && (cur.getUserType() == ApiEventType.CREATE || cur.getUserType() == ApiEventType.TRANSFER)) {
continue;
}
@@ -942,8 +939,8 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
if (event.getEffectiveDate().isAfter(curDryRun.getEffectiveDate())) {
it.remove();
} else if (event.getEffectiveDate().compareTo(curDryRun.getEffectiveDate()) == 0 &&
- isApiChange &&
- (event.getType() == EventType.API_USER && (((ApiEvent) event).getApiEventType() == ApiEventType.CREATE) || ((ApiEvent) event).getApiEventType() == ApiEventType.TRANSFER)) {
+ isApiChange &&
+ (event.getType() == EventType.API_USER && (((ApiEvent) event).getApiEventType() == ApiEventType.CREATE) || ((ApiEvent) event).getApiEventType() == ApiEventType.TRANSFER)) {
it.remove();
swapChangeEventWithCreate = true;
}
@@ -1028,8 +1025,9 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
private SubscriptionBase createSubscriptionForInternalUse(final SubscriptionBase shellSubscription, final List<SubscriptionBaseEvent> events, final InternalTenantContext context) throws CatalogApiException {
final DefaultSubscriptionBase result = new DefaultSubscriptionBase(new SubscriptionBuilder(((DefaultSubscriptionBase) shellSubscription)), null, clock);
+
if (!events.isEmpty()) {
- final Catalog fullCatalog = catalogService.getFullCatalog(true, true, context);
+ final Catalog fullCatalog = getFullCatalog(result.getId(), ObjectType.SUBSCRIPTION, context);
result.rebuildTransitions(events, fullCatalog);
}
return result;
@@ -1155,10 +1153,18 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
allEvents.addAll(subscriptionWithNewEvent.getEvents());
}
allEvents.add(newEvent);
- subscriptionWithNewEvent.rebuildTransitions(allEvents, catalogService.getFullCatalog(true, true, context));
+ subscriptionWithNewEvent.rebuildTransitions(allEvents, getFullCatalog(subscription.getId(), ObjectType.SUBSCRIPTION, context));
return subscriptionWithNewEvent;
}
+ private Catalog getFullCatalog(final UUID objectId, final ObjectType objectType, final InternalTenantContext contextWithOrWithoutAccountId) throws CatalogApiException {
+
+ final InternalTenantContext context = contextWithOrWithoutAccountId.getAccountRecordId() == null ?
+ internalCallContextFactory.recreateInternalTenantContextWithAccountRecordId(objectId, objectType, contextWithOrWithoutAccountId) :
+ contextWithOrWithoutAccountId;
+ return catalogInternalApi.getFullCatalog(true, true, context);
+ }
+
private InternalCallContext contextWithUpdatedDate(final InternalCallContext input) {
return new InternalCallContext(input, clock.getUTCNow());
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
index 1fb56a3..21a112f 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
@@ -51,7 +51,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
@BeforeClass(groups = "fast")
public void beforeClass() throws Exception {
super.beforeClass();
- planAligner = new PlanAligner(catalogService);
+ planAligner = new PlanAligner(catalogInternalApi);
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
index 9601f74..1f034e4 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
@@ -20,9 +20,13 @@ package org.killbill.billing.subscription.api.transfer;
import java.util.List;
import java.util.UUID;
+import java.util.regex.Matcher;
import org.joda.time.DateTime;
import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
+import org.killbill.billing.catalog.api.DefaultCatalogInternalApi;
+import org.killbill.billing.catalog.override.DefaultPriceOverride;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
@@ -66,9 +70,10 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
final NonEntityDao nonEntityDao = Mockito.mock(NonEntityDao.class);
final SubscriptionDao dao = Mockito.mock(SubscriptionDao.class);
final CatalogService catalogService = new MockCatalogService(new MockCatalog(), cacheControllerDispatcher);
+ final CatalogInternalApi catalogInternalApiWithMockCatalogService = new DefaultCatalogInternalApi(catalogService, internalCallContextFactory);
final SubscriptionBaseApiService apiService = Mockito.mock(SubscriptionBaseApiService.class);
final SubscriptionBaseTimelineApi timelineApi = Mockito.mock(SubscriptionBaseTimelineApi.class);
- transferApi = new DefaultSubscriptionBaseTransferApi(clock, dao, timelineApi, catalogService, apiService, internalCallContextFactory);
+ transferApi = new DefaultSubscriptionBaseTransferApi(clock, dao, timelineApi, catalogInternalApiWithMockCatalogService, apiService, internalCallContextFactory);
}
@Test(groups = "fast")
@@ -88,6 +93,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
@Test(groups = "fast")
public void testEventsForCancelledSubscriptionAfterTransfer() throws Exception {
+
final DateTime subscriptionStartTime = clock.getUTCNow();
final DateTime subscriptionCancelTime = subscriptionStartTime.plusDays(1);
final ImmutableList<ExistingEvent> existingEvents = ImmutableList.<ExistingEvent>of(createEvent(subscriptionStartTime, SubscriptionBaseTransitionType.CREATE),
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
index 271bcad..a4ae105 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
@@ -44,7 +44,6 @@ import org.killbill.billing.subscription.api.transfer.TransferCancelData;
import org.killbill.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
import org.killbill.billing.subscription.api.user.DefaultSubscriptionBase;
import org.killbill.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
-import org.killbill.billing.subscription.api.user.DefaultSubscriptionBaseWithAddOns;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.subscription.api.user.SubscriptionBaseTransitionData;
import org.killbill.billing.subscription.api.user.SubscriptionBuilder;
@@ -70,9 +69,6 @@ import org.killbill.notificationq.api.NotificationQueueService.NoSuchNotificatio
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.inject.Inject;
public class MockSubscriptionDaoMemory extends MockEntityDaoBase<SubscriptionBundleModelDao, SubscriptionBaseBundle, SubscriptionApiException> implements SubscriptionDao {
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoSql.java b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoSql.java
index 2261e0b..a5b2251 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoSql.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/MockSubscriptionDaoSql.java
@@ -18,6 +18,7 @@
package org.killbill.billing.subscription.engine.dao;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.skife.jdbi.v2.IDBI;
@@ -35,7 +36,7 @@ public class MockSubscriptionDaoSql extends DefaultSubscriptionDao {
@Inject
public MockSubscriptionDaoSql(final IDBI dbi, final Clock clock, final AddonUtils addonUtils, final NotificationQueueService notificationQueueService,
- final PersistentBus eventBus, final CatalogService catalogService, final CacheControllerDispatcher cacheControllerDispatcher,
+ final PersistentBus eventBus, final CatalogInternalApi catalogService, final CacheControllerDispatcher cacheControllerDispatcher,
final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory) {
super(dbi, clock, addonUtils, notificationQueueService, eventBus, catalogService, cacheControllerDispatcher, nonEntityDao, internalCallContextFactory);
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
index b90587c..8f1b379 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -29,7 +29,9 @@ import org.killbill.billing.account.api.ImmutableAccountInternalApi;
import org.killbill.billing.api.TestApiListener;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
+import org.killbill.billing.catalog.api.CatalogInternalApi;
import org.killbill.billing.catalog.api.CatalogService;
+import org.killbill.billing.catalog.api.CatalogUserApi;
import org.killbill.billing.dao.MockNonEntityDao;
import org.killbill.billing.lifecycle.api.BusService;
import org.killbill.billing.platform.api.KillbillConfigSource;
@@ -79,6 +81,8 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
@Inject
protected CatalogService catalogService;
@Inject
+ protected CatalogInternalApi catalogInternalApi;
+ @Inject
protected SubscriptionConfig config;
@Inject
protected SubscriptionDao dao;
diff --git a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
index 930e0b1..947eae9 100644
--- a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
@@ -145,13 +145,19 @@ public class InternalCallContextFactory {
return createInternalTenantContext(tenantRecordId, accountRecordId);
}
- /**
- * Create an internal tenant callcontext
- *
- * @param tenantRecordId tenant_record_id (cannot be null)
- * @param accountRecordId account_record_id (cannot be null for INSERT operations)
- * @return internal tenant callcontext
- */
+ public InternalTenantContext recreateInternalTenantContextWithAccountRecordId(final UUID objectId, final ObjectType objectType, final InternalTenantContext inputContext) {
+ final Long tenantRecordId = inputContext.getTenantRecordId();
+ final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, tenantRecordId);
+ return createInternalTenantContext(tenantRecordId, accountRecordId);
+ }
+
+ /**
+ * Create an internal tenant callcontext
+ *
+ * @param tenantRecordId tenant_record_id (cannot be null)
+ * @param accountRecordId account_record_id (cannot be null for INSERT operations)
+ * @return internal tenant callcontext
+ */
public InternalTenantContext createInternalTenantContext(final Long tenantRecordId, @Nullable final Long accountRecordId) {
populateMDCContext(accountRecordId, tenantRecordId);