killbill-memoizeit
Changes
account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java 10(+5 -5)
entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java 14(+7 -7)
payment/src/main/java/org/killbill/billing/payment/caching/EhCacheStateMachineConfigCache.java 6(+3 -3)
util/src/main/java/org/killbill/billing/util/cache/TenantStateMachineConfigCacheLoader.java 2(+1 -1)
Details
diff --git a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
index 4f7b285..ba32fd5 100644
--- a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
@@ -56,7 +56,7 @@ public class DefaultAccountInternalApi extends DefaultAccountApiBase implements
private final ImmutableAccountInternalApi immutableAccountInternalApi;
private final AccountDao accountDao;
- private final CacheController bcdCacheController;
+ private final CacheController<UUID, Integer> bcdCacheController;
@Inject
public DefaultAccountInternalApi(final ImmutableAccountInternalApi immutableAccountInternalApi,
@@ -106,7 +106,7 @@ public class DefaultAccountInternalApi extends DefaultAccountApiBase implements
@Override
public int getBCD(final UUID accountId, final InternalTenantContext context) throws AccountApiException {
final CacheLoaderArgument arg = createBCDCacheLoaderArgument(context);
- final Integer result = (Integer) bcdCacheController.get(accountId, arg);
+ final Integer result = bcdCacheController.get(accountId, arg);
return result != null ? result : DefaultMutableAccountData.DEFAULT_BILLING_CYCLE_DAY_LOCAL;
}
diff --git a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java
index 295a35a..4bdf0c6 100644
--- a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java
@@ -48,8 +48,8 @@ public class DefaultImmutableAccountInternalApi implements ImmutableAccountInter
private final EntitySqlDaoTransactionalJdbiWrapper transactionalSqlDao;
private final NonEntityDao nonEntityDao;
- private final CacheControllerDispatcher cacheControllerDispatcher;
- private final CacheController accountCacheController;
+ private final CacheController<Long, ImmutableAccountData> accountCacheController;
+ private final CacheController<String, Long> recordIdCacheController;
@Inject
public DefaultImmutableAccountInternalApi(final IDBI dbi,
@@ -59,20 +59,20 @@ public class DefaultImmutableAccountInternalApi implements ImmutableAccountInter
// This API will directly issue queries instead of relying on the DAO (introduced to avoid Guice circular dependencies with InternalCallContextFactory)
this.transactionalSqlDao = new EntitySqlDaoTransactionalJdbiWrapper(dbi, clock, cacheControllerDispatcher, nonEntityDao, null);
this.nonEntityDao = nonEntityDao;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
this.accountCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE);
+ this.recordIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID);
}
@Override
public ImmutableAccountData getImmutableAccountDataById(final UUID accountId, final InternalTenantContext context) throws AccountApiException {
- final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, recordIdCacheController);
return getImmutableAccountDataByRecordId(recordId, context);
}
@Override
public ImmutableAccountData getImmutableAccountDataByRecordId(final Long recordId, final InternalTenantContext context) throws AccountApiException {
final CacheLoaderArgument arg = createImmutableAccountCacheLoaderArgument(context);
- return (ImmutableAccountData) accountCacheController.get(recordId, arg);
+ return accountCacheController.get(recordId, arg);
}
private CacheLoaderArgument createImmutableAccountCacheLoaderArgument(final InternalTenantContext context) {
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountApiBase.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountApiBase.java
index 7792ab4..a77c9e7 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountApiBase.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountApiBase.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -25,6 +25,7 @@ import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.DefaultAccount;
import org.killbill.billing.account.api.DefaultImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountData;
import org.killbill.billing.account.dao.AccountDao;
import org.killbill.billing.account.dao.AccountModelDao;
import org.killbill.billing.callcontext.InternalTenantContext;
@@ -36,8 +37,8 @@ import org.killbill.billing.util.dao.NonEntityDao;
public class DefaultAccountApiBase {
private final AccountDao accountDao;
- private final CacheControllerDispatcher cacheControllerDispatcher;
- private final CacheController accountCacheController;
+ private final CacheController<Long, ImmutableAccountData> accountCacheController;
+ private final CacheController<String, Long> recordIdCacheController;
private final NonEntityDao nonEntityDao;
public DefaultAccountApiBase(final AccountDao accountDao,
@@ -45,17 +46,17 @@ public class DefaultAccountApiBase {
final CacheControllerDispatcher cacheControllerDispatcher) {
this.accountDao = accountDao;
this.nonEntityDao = nonEntityDao;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
this.accountCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE);
+ this.recordIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID);
}
protected Account getAccountById(final UUID accountId, final InternalTenantContext context) throws AccountApiException {
- final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, recordIdCacheController);
final Account account = getAccountByRecordIdInternal(recordId, context);
if (account == null) {
throw new AccountApiException(ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, accountId);
}
- accountCacheController.putIfAbsent(accountId, new DefaultImmutableAccountData(account));
+ accountCacheController.putIfAbsent(recordId, new DefaultImmutableAccountData(account));
return account;
}
@@ -65,7 +66,8 @@ public class DefaultAccountApiBase {
throw new AccountApiException(ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_KEY, key);
}
final Account account = new DefaultAccount(accountModelDao);
- accountCacheController.putIfAbsent(account.getId(), new DefaultImmutableAccountData(account));
+ final Long recordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, recordIdCacheController);
+ accountCacheController.putIfAbsent(recordId, new DefaultImmutableAccountData(account));
return account;
}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/util/SubscriptionChecker.java b/beatrix/src/test/java/org/killbill/billing/beatrix/util/SubscriptionChecker.java
index 1b0c6c9..d46e1d5 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/util/SubscriptionChecker.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/util/SubscriptionChecker.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2017 Groupon, Inc
+ * Copyright 2014-2017 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
@@ -22,6 +24,7 @@ import java.util.UUID;
import javax.inject.Inject;
import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -46,14 +49,14 @@ public class SubscriptionChecker {
private final SubscriptionBaseInternalApi subscriptionApi;
private final AuditChecker auditChecker;
private final NonEntityDao nonEntityDao;
- private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController<String, UUID> objectIdCacheController;
@Inject
public SubscriptionChecker(final SubscriptionBaseInternalApi subscriptionApi, final AuditChecker auditChecker, final NonEntityDao nonEntityDao, final CacheControllerDispatcher cacheControllerDispatcher) {
this.subscriptionApi = subscriptionApi;
this.auditChecker = auditChecker;
this.nonEntityDao = nonEntityDao;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
+ objectIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
}
public SubscriptionBaseBundle checkBundleNoAudits(final UUID bundleId, final UUID expectedAccountId, final String expectedKey, final InternalTenantContext context) throws SubscriptionBaseApiException {
@@ -65,7 +68,7 @@ public class SubscriptionChecker {
}
public SubscriptionBase checkSubscriptionCreated(final UUID subscriptionId, final InternalCallContext context) throws SubscriptionBaseApiException {
- final UUID tenantId = nonEntityDao.retrieveIdFromObject(context.getTenantRecordId(), ObjectType.TENANT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID));
+ final UUID tenantId = nonEntityDao.retrieveIdFromObject(context.getTenantRecordId(), ObjectType.TENANT, objectIdCacheController);
final CallContext callContext = context.toCallContext(tenantId);
final SubscriptionBase subscription = subscriptionApi.getSubscriptionFromId(subscriptionId, context);
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 66986ea..918058b 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
@@ -53,7 +53,7 @@ public class EhCacheCatalogCache implements CatalogCache {
private final Logger logger = LoggerFactory.getLogger(EhCacheCatalogCache.class);
- private final CacheController cacheController;
+ private final CacheController<Long, Catalog> cacheController;
private final VersionedCatalogLoader loader;
private final CacheLoaderArgument cacheLoaderArgumentWithTemplateFiltering;
private final CacheLoaderArgument cacheLoaderArgument;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
index bb3b7e3..b8f0a58 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
@@ -48,7 +48,7 @@ import com.google.common.collect.Iterables;
public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
- private final CacheController cacheController;
+ private final CacheController<String, Plan> cacheController;
private final LoaderCallback loaderCallback;
private final CatalogOverrideDao overrideDao;
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
index db2577e..164a9b8 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/dao/DefaultBlockingStateDao.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * 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
@@ -36,7 +36,6 @@ import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.entitlement.DefaultEntitlementService;
-import org.killbill.billing.entitlement.EntitlementService;
import org.killbill.billing.entitlement.api.BlockingApiException;
import org.killbill.billing.entitlement.api.BlockingState;
import org.killbill.billing.entitlement.api.BlockingStateType;
@@ -46,6 +45,7 @@ import org.killbill.billing.entitlement.block.BlockingChecker.BlockingAggregator
import org.killbill.billing.entitlement.block.StatelessBlockingChecker;
import org.killbill.billing.entitlement.engine.core.BlockingTransitionNotificationKey;
import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.dao.NonEntityDao;
@@ -107,7 +107,7 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
private final Clock clock;
private final NotificationQueueService notificationQueueService;
private final PersistentBus eventBus;
- private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController<String, UUID> objectIdCacheController;
private final NonEntityDao nonEntityDao;
private final StatelessBlockingChecker statelessBlockingChecker = new StatelessBlockingChecker();
@@ -118,7 +118,7 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
this.clock = clock;
this.notificationQueueService = notificationQueueService;
this.eventBus = eventBus;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
+ this.objectIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
this.nonEntityDao = nonEntityDao;
}
@@ -260,12 +260,12 @@ public class DefaultBlockingStateDao extends EntityDaoBase<BlockingStateModelDao
final List<BlockingState> bundleBlockingStates;
final List<BlockingState> subscriptionBlockingStates;
if (type == BlockingStateType.SUBSCRIPTION) {
- final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID), handle);
+ final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, objectIdCacheController, handle);
accountBlockingStates = getBlockingState(sqlDao, accountId, BlockingStateType.ACCOUNT, upToDate, context);
bundleBlockingStates = getBlockingState(sqlDao, bundleId, BlockingStateType.SUBSCRIPTION_BUNDLE, upToDate, context);
subscriptionBlockingStates = getBlockingState(sqlDao, blockableId, BlockingStateType.SUBSCRIPTION, upToDate, context);
} else if (type == BlockingStateType.SUBSCRIPTION_BUNDLE) {
- final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID), handle);
+ final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, objectIdCacheController, handle);
accountBlockingStates = getBlockingState(sqlDao, accountId, BlockingStateType.ACCOUNT, upToDate, context);
bundleBlockingStates = getBlockingState(sqlDao, blockableId, BlockingStateType.SUBSCRIPTION_BUNDLE, upToDate, context);
subscriptionBlockingStates = ImmutableList.<BlockingState>of();
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index 4976f49..b9743f6 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -59,6 +59,7 @@ import org.killbill.billing.invoice.notification.ParentInvoiceCommitmentPoster;
import org.killbill.billing.tag.TagInternalApi;
import org.killbill.billing.util.UUIDs;
import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.config.definition.InvoiceConfig;
@@ -115,7 +116,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
private final CBADao cbaDao;
private final InvoiceConfig invoiceConfig;
private final Clock clock;
- private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController<String, UUID> objectIdCacheController;
private final NonEntityDao nonEntityDao;
private final ParentInvoiceCommitmentPoster parentInvoiceCommitmentPoster;
private final TagInternalApi tagInternalApi;
@@ -142,7 +143,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
this.invoiceDaoHelper = invoiceDaoHelper;
this.cbaDao = cbaDao;
this.clock = clock;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
+ this.objectIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
this.nonEntityDao = nonEntityDao;
this.parentInvoiceCommitmentPoster = parentInvoiceCommitmentPoster;
}
@@ -832,7 +833,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
}
if (completion) {
- final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID), entitySqlDaoWrapperFactory.getHandle());
+ final UUID accountId = nonEntityDao.retrieveIdFromObjectInTransaction(context.getAccountRecordId(), ObjectType.ACCOUNT, objectIdCacheController, entitySqlDaoWrapperFactory.getHandle());
notifyBusOfInvoicePayment(entitySqlDaoWrapperFactory, invoicePayment, accountId, context.getUserToken(), context);
}
return null;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
index 8cf1ef2..68aa3a4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
@@ -344,15 +344,17 @@ public class AdminResource extends JaxRsResourceBase {
@ApiResponses(value = {})
public Response invalidatesCacheByAccount(@PathParam("accountId") final String accountIdStr,
@javax.ws.rs.core.Context final HttpServletRequest request) {
+ final TenantContext tenantContext = context.createContext(request);
final UUID accountId = UUID.fromString(accountIdStr);
+ final Long accountRecordId = recordIdApi.getRecordId(accountId, ObjectType.ACCOUNT, tenantContext);
// clear account-record-id cache by accountId (note: String!)
cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID).remove(accountIdStr);
- // clear account-immutable cache by accountId
- cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE).remove(accountId);
+ // clear account-immutable cache by account record id
+ cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE).remove(accountRecordId);
- // clear account-bcd cache by accountId
+ // clear account-bcd cache by accountId (note: UUID!)
cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_BCD).remove(accountId);
return Response.status(Status.OK).build();
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/caching/EhCacheOverdueConfigCache.java b/overdue/src/main/java/org/killbill/billing/overdue/caching/EhCacheOverdueConfigCache.java
index f36b9e5..d3363e1 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/caching/EhCacheOverdueConfigCache.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/caching/EhCacheOverdueConfigCache.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -44,7 +44,7 @@ public class EhCacheOverdueConfigCache implements OverdueConfigCache {
private static final Logger log = LoggerFactory.getLogger(EhCacheOverdueConfigCache.class);
- private final CacheController cacheController;
+ private final CacheController<Long, OverdueConfig> cacheController;
private final CacheLoaderArgument cacheLoaderArgument;
private OverdueConfig defaultOverdueConfig;
@@ -97,7 +97,7 @@ public class EhCacheOverdueConfigCache implements OverdueConfigCache {
// The cache loader might choke on some bad xml -- unlikely since we check its validity prior storing it,
// but to be on the safe side;;
try {
- final OverdueConfig overdueConfig = (OverdueConfig) cacheController.get(tenantContext.getTenantRecordId(), cacheLoaderArgument);
+ final OverdueConfig overdueConfig = cacheController.get(tenantContext.getTenantRecordId(), cacheLoaderArgument);
return (overdueConfig != null) ? overdueConfig : defaultOverdueConfig;
} catch (final IllegalStateException e) {
throw new OverdueApiException(ErrorCode.OVERDUE_INVALID_FOR_TENANT, tenantContext.getTenantRecordId());
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java b/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
index 43f00c1..8bed766 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/listener/OverdueListener.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * 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
@@ -45,6 +45,7 @@ import org.killbill.billing.overdue.notification.OverdueAsyncBusNotificationKey.
import org.killbill.billing.overdue.notification.OverdueAsyncBusNotifier;
import org.killbill.billing.overdue.notification.OverduePoster;
import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.CallOrigin;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
@@ -65,7 +66,7 @@ public class OverdueListener {
private static final Logger log = LoggerFactory.getLogger(OverdueListener.class);
private final InternalCallContextFactory internalCallContextFactory;
- private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController<String, UUID> objectIdCacheController;
private final Clock clock;
private final OverduePoster asyncPoster;
private final OverdueConfigCache overdueConfigCache;
@@ -84,7 +85,7 @@ public class OverdueListener {
this.clock = clock;
this.asyncPoster = asyncPoster;
this.overdueConfigCache = overdueConfigCache;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
+ this.objectIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
this.internalCallContextFactory = internalCallContextFactory;
this.accountApi = accountApi;
}
@@ -96,7 +97,7 @@ public class OverdueListener {
final InternalCallContext internalCallContext = createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2());
insertBusEventIntoNotificationQueue(event.getObjectId(), OverdueAsyncBusNotificationAction.CLEAR, internalCallContext);
} else if (event.getTagDefinition().getName().equals(ControlTagType.WRITTEN_OFF.toString()) && event.getObjectType() == ObjectType.INVOICE) {
- final UUID accountId = nonEntityDao.retrieveIdFromObject(event.getSearchKey1(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID));
+ final UUID accountId = nonEntityDao.retrieveIdFromObject(event.getSearchKey1(), ObjectType.ACCOUNT, objectIdCacheController);
insertBusEventIntoNotificationQueue(accountId, event);
}
}
@@ -107,7 +108,7 @@ public class OverdueListener {
if (event.getTagDefinition().getName().equals(ControlTagType.OVERDUE_ENFORCEMENT_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
insertBusEventIntoNotificationQueue(event.getObjectId(), event);
} else if (event.getTagDefinition().getName().equals(ControlTagType.WRITTEN_OFF.toString()) && event.getObjectType() == ObjectType.INVOICE) {
- final UUID accountId = nonEntityDao.retrieveIdFromObject(event.getSearchKey1(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID));
+ final UUID accountId = nonEntityDao.retrieveIdFromObject(event.getSearchKey1(), ObjectType.ACCOUNT, objectIdCacheController);
insertBusEventIntoNotificationQueue(accountId, event);
}
}
diff --git a/payment/src/main/java/org/killbill/billing/payment/caching/EhCacheStateMachineConfigCache.java b/payment/src/main/java/org/killbill/billing/payment/caching/EhCacheStateMachineConfigCache.java
index 5fc9511..2d1c3dc 100644
--- a/payment/src/main/java/org/killbill/billing/payment/caching/EhCacheStateMachineConfigCache.java
+++ b/payment/src/main/java/org/killbill/billing/payment/caching/EhCacheStateMachineConfigCache.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2016 Groupon, Inc
- * Copyright 2016 The Billing Project, LLC
+ * Copyright 2016-2017 Groupon, Inc
+ * Copyright 2016-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
@@ -51,7 +51,7 @@ public class EhCacheStateMachineConfigCache implements StateMachineConfigCache {
private static final Logger logger = LoggerFactory.getLogger(EhCacheStateMachineConfigCache.class);
private final TenantInternalApi tenantInternalApi;
- private final CacheController cacheController;
+ private final CacheController<String, StateMachineConfig> cacheController;
private final CacheInvalidationCallback cacheInvalidationCallback;
private final LoaderCallback loaderCallback;
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
index 23325ad..da340aa 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
@@ -35,6 +35,7 @@ import org.testng.annotations.Test;
import com.google.common.io.Resources;
import net.sf.ehcache.Ehcache;
+import net.sf.ehcache.Element;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@@ -83,9 +84,11 @@ public class TestCache extends TestJaxrsBase {
// verify that they are not null and have the accountId stored as a key (the account created before)
assertNotNull(accountRecordIdCache);
- assertNotNull(accountRecordIdCache.get(input.getAccountId().toString()));
+ final Element accountRecordIdElement = accountRecordIdCache.get(input.getAccountId().toString());
+ assertNotNull(accountRecordIdElement);
+ final Long accountRecordId = (Long) accountRecordIdElement.getObjectValue();
assertNotNull(accountImmutableCache);
- assertNotNull(accountImmutableCache.get(input.getAccountId()));
+ assertNotNull(accountImmutableCache.get(accountRecordId));
assertNotNull(accountBcdCache);
assertNotNull(accountBcdCache.get(input.getAccountId()));
@@ -94,7 +97,7 @@ public class TestCache extends TestJaxrsBase {
// verify that now the caches don't have the accountId key stored
Assert.assertNull(accountRecordIdCache.get(input.getAccountId().toString()));
- Assert.assertNull(accountImmutableCache.get(input.getAccountId()));
+ Assert.assertNull(accountImmutableCache.get(accountRecordId));
Assert.assertNull(accountBcdCache.get(input.getAccountId()));
}
diff --git a/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidationCallback.java b/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidationCallback.java
index f07122f..ffc662c 100644
--- a/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidationCallback.java
+++ b/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidationCallback.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -32,7 +32,7 @@ public class TenantCacheInvalidationCallback implements CacheInvalidationCallbac
private final Logger log = LoggerFactory.getLogger(TenantCacheInvalidationCallback.class);
- private final CacheController<Object, Object> tenantKVCache;
+ private final CacheController<String, String> tenantKVCache;
@Inject
public TenantCacheInvalidationCallback(final CacheControllerDispatcher cacheControllerDispatcher) {
diff --git a/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java b/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
index b9a22bc..eb3f5ba 100644
--- a/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
+++ b/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -71,8 +71,8 @@ public class DefaultTenantUserApi implements TenantUserApi {
private final TenantDao tenantDao;
private final InternalCallContextFactory internalCallContextFactory;
- private final CacheController<Object, Object> tenantKVCache;
- private final CacheController<Object, Object> tenantCache;
+ private final CacheController<String, String> tenantKVCache;
+ private final CacheController<String, Tenant> tenantCache;
@Inject
@@ -101,7 +101,7 @@ public class DefaultTenantUserApi implements TenantUserApi {
@Override
public Tenant getTenantByApiKey(final String key) throws TenantApiException {
- final Tenant tenant = (Tenant) tenantCache.get(key, new CacheLoaderArgument(ObjectType.TENANT));
+ final Tenant tenant = tenantCache.get(key, new CacheLoaderArgument(ObjectType.TENANT));
if (tenant == null) {
throw new TenantApiException(ErrorCode.TENANT_DOES_NOT_EXIST_FOR_API_KEY, key);
}
diff --git a/util/src/main/java/org/killbill/billing/util/cache/AuditLogCacheLoader.java b/util/src/main/java/org/killbill/billing/util/cache/AuditLogCacheLoader.java
index ac42ff0..fac8514 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/AuditLogCacheLoader.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/AuditLogCacheLoader.java
@@ -30,7 +30,7 @@ import org.killbill.billing.util.dao.AuditSqlDao;
import org.skife.jdbi.v2.IDBI;
@Singleton
-public class AuditLogCacheLoader extends BaseCacheLoader<Object, List<AuditLogModelDao>> {
+public class AuditLogCacheLoader extends BaseCacheLoader<String, List<AuditLogModelDao>> {
private final AuditSqlDao auditSqlDao;
@@ -46,7 +46,7 @@ public class AuditLogCacheLoader extends BaseCacheLoader<Object, List<AuditLogMo
}
@Override
- public List<AuditLogModelDao> compute(final Object key, final CacheLoaderArgument cacheLoaderArgument) {
+ public List<AuditLogModelDao> compute(final String key, final CacheLoaderArgument cacheLoaderArgument) {
final Object[] args = cacheLoaderArgument.getArgs();
final String tableName = (String) args[0];
final Long targetRecordId = (Long) args[1];
diff --git a/util/src/main/java/org/killbill/billing/util/cache/AuditLogViaHistoryCacheLoader.java b/util/src/main/java/org/killbill/billing/util/cache/AuditLogViaHistoryCacheLoader.java
index 113779d..26d215a 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/AuditLogViaHistoryCacheLoader.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/AuditLogViaHistoryCacheLoader.java
@@ -30,7 +30,7 @@ import org.killbill.billing.util.dao.AuditSqlDao;
import org.skife.jdbi.v2.IDBI;
@Singleton
-public class AuditLogViaHistoryCacheLoader extends BaseCacheLoader<Object, List<AuditLogModelDao>> {
+public class AuditLogViaHistoryCacheLoader extends BaseCacheLoader<String, List<AuditLogModelDao>> {
private final AuditSqlDao auditSqlDao;
@@ -46,7 +46,7 @@ public class AuditLogViaHistoryCacheLoader extends BaseCacheLoader<Object, List<
}
@Override
- public List<AuditLogModelDao> compute(final Object key, final CacheLoaderArgument cacheLoaderArgument) {
+ public List<AuditLogModelDao> compute(final String key, final CacheLoaderArgument cacheLoaderArgument) {
final Object[] args = cacheLoaderArgument.getArgs();
final String tableName = (String) args[0];
final String historyTableName = (String) args[1];
diff --git a/util/src/main/java/org/killbill/billing/util/cache/Cachable.java b/util/src/main/java/org/killbill/billing/util/cache/Cachable.java
index a70556c..eb90621 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/Cachable.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/Cachable.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2012 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2017 Groupon, Inc
+ * Copyright 2014-2017 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
@@ -20,6 +22,14 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import java.util.List;
+import java.util.UUID;
+
+import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.catalog.api.Catalog;
+import org.killbill.billing.catalog.api.Plan;
+import org.killbill.billing.tenant.api.Tenant;
+import org.killbill.billing.util.config.tenant.PerTenantConfig;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@@ -45,56 +55,60 @@ public @interface Cachable {
enum CacheType {
- /* Mapping from object 'id (UUID)' -> object 'recordId (Long' */
- RECORD_ID(RECORD_ID_CACHE_NAME, false),
+ /* Mapping from object 'id (UUID as String)' -> object 'recordId (Long)' */
+ RECORD_ID(RECORD_ID_CACHE_NAME, String.class, Long.class, false),
- /* Mapping from object 'id (UUID)' -> matching account object 'accountRecordId (Long)' */
- ACCOUNT_RECORD_ID(ACCOUNT_RECORD_ID_CACHE_NAME, false),
+ /* Mapping from object 'id (UUID as String)' -> matching account object 'accountRecordId (Long)' */
+ ACCOUNT_RECORD_ID(ACCOUNT_RECORD_ID_CACHE_NAME, String.class, Long.class, false),
- /* Mapping from object 'id (UUID)' -> matching object 'tenantRecordId (Long)' */
- TENANT_RECORD_ID(TENANT_RECORD_ID_CACHE_NAME, false),
+ /* Mapping from object 'id (UUID as String)' -> matching object 'tenantRecordId (Long)' */
+ TENANT_RECORD_ID(TENANT_RECORD_ID_CACHE_NAME, String.class, Long.class, false),
- /* Mapping from object 'recordId (Long') -> object 'id (UUID)' */
- OBJECT_ID(OBJECT_ID_CACHE_NAME, true),
+ /* Mapping from object 'recordId (Long as String)' -> object 'id (UUID)' */
+ OBJECT_ID(OBJECT_ID_CACHE_NAME, String.class, UUID.class, true),
/* Mapping from object 'tableName::targetRecordId' -> matching objects 'Iterable<AuditLog>' */
- AUDIT_LOG(AUDIT_LOG_CACHE_NAME, true),
+ AUDIT_LOG(AUDIT_LOG_CACHE_NAME, String.class, List.class, true),
/* Mapping from object 'tableName::historyTableName::targetRecordId' -> matching objects 'Iterable<AuditLog>' */
- AUDIT_LOG_VIA_HISTORY(AUDIT_LOG_VIA_HISTORY_CACHE_NAME, true),
+ AUDIT_LOG_VIA_HISTORY(AUDIT_LOG_VIA_HISTORY_CACHE_NAME, String.class, List.class, true),
/* Tenant catalog cache */
- TENANT_CATALOG(TENANT_CATALOG_CACHE_NAME, false),
+ TENANT_CATALOG(TENANT_CATALOG_CACHE_NAME, Long.class, Catalog.class, false),
/* Tenant payment state machine config cache */
- TENANT_PAYMENT_STATE_MACHINE_CONFIG(TENANT_PAYMENT_STATE_MACHINE_CONFIG_CACHE_NAME, false),
+ TENANT_PAYMENT_STATE_MACHINE_CONFIG(TENANT_PAYMENT_STATE_MACHINE_CONFIG_CACHE_NAME, String.class, Object.class, false),
/* Tenant overdue config cache */
- TENANT_OVERDUE_CONFIG(TENANT_OVERDUE_CONFIG_CACHE_NAME, false),
+ TENANT_OVERDUE_CONFIG(TENANT_OVERDUE_CONFIG_CACHE_NAME, Long.class, Object.class, false),
/* Tenant overdue config cache */
- TENANT_CONFIG(TENANT_CONFIG_CACHE_NAME, false),
+ TENANT_CONFIG(TENANT_CONFIG_CACHE_NAME, Long.class, PerTenantConfig.class, false),
/* Tenant config cache */
- TENANT_KV(TENANT_KV_CACHE_NAME, false),
+ TENANT_KV(TENANT_KV_CACHE_NAME, String.class, String.class, false),
/* Tenant config cache */
- TENANT(TENANT_CACHE_NAME, false),
+ TENANT(TENANT_CACHE_NAME, String.class, Tenant.class, false),
/* Overwritten plans */
- OVERRIDDEN_PLAN(OVERRIDDEN_PLAN_CACHE_NAME, false),
+ OVERRIDDEN_PLAN(OVERRIDDEN_PLAN_CACHE_NAME, String.class, Plan.class, false),
/* Immutable account data config cache */
- ACCOUNT_IMMUTABLE(ACCOUNT_IMMUTABLE_CACHE_NAME, false),
+ ACCOUNT_IMMUTABLE(ACCOUNT_IMMUTABLE_CACHE_NAME, Long.class, ImmutableAccountData.class, false),
/* Account BCD config cache */
- ACCOUNT_BCD(ACCOUNT_BCD_CACHE_NAME, false);
+ ACCOUNT_BCD(ACCOUNT_BCD_CACHE_NAME, UUID.class, Integer.class, false);
private final String cacheName;
+ private final Class keyType;
+ private final Class valueType;
private final boolean isKeyPrefixedWithTableName;
- CacheType(final String cacheName, final boolean isKeyPrefixedWithTableName) {
+ CacheType(final String cacheName, final Class keyType, final Class valueType, final boolean isKeyPrefixedWithTableName) {
this.cacheName = cacheName;
+ this.keyType = keyType;
+ this.valueType = valueType;
this.isKeyPrefixedWithTableName = isKeyPrefixedWithTableName;
}
@@ -102,6 +116,14 @@ public @interface Cachable {
return cacheName;
}
+ public Class<?> getKeyType() {
+ return keyType;
+ }
+
+ public Class<?> getValueType() {
+ return valueType;
+ }
+
public boolean isKeyPrefixedWithTableName() { return isKeyPrefixedWithTableName; }
public static CacheType findByName(final String input) {
diff --git a/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcher.java b/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcher.java
index bdf1302..2d9b966 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcher.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcher.java
@@ -44,8 +44,8 @@ public class CacheControllerDispatcher {
caches = new HashMap<CacheType, CacheController<Object, Object>>();
}
- public CacheController<Object, Object> getCacheController(final CacheType cacheType) {
- return caches.get(cacheType);
+ public <K, V> CacheController<K, V> getCacheController(final CacheType cacheType) {
+ return cast(caches.get(cacheType));
}
public void clearAll() {
@@ -53,4 +53,9 @@ public class CacheControllerDispatcher {
cacheController.removeAll();
}
}
+
+ @SuppressWarnings("unchecked")
+ private static <K, V> CacheController<K, V> cast(final CacheController<?, ?> cache) {
+ return (CacheController<K, V>) cache;
+ }
}
diff --git a/util/src/main/java/org/killbill/billing/util/cache/EhCacheBasedCacheController.java b/util/src/main/java/org/killbill/billing/util/cache/EhCacheBasedCacheController.java
index 62d12c6..dc11ba6 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/EhCacheBasedCacheController.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/EhCacheBasedCacheController.java
@@ -44,6 +44,8 @@ public class EhCacheBasedCacheController<K, V> implements CacheController<K, V>
@Override
public V get(final K key, final CacheLoaderArgument cacheLoaderArgument) {
+ checkKey(key);
+
final V value;
if (!cache.isKeyInCache(key)) {
value = computeAndCacheValue(key, cacheLoaderArgument);
@@ -61,17 +63,21 @@ public class EhCacheBasedCacheController<K, V> implements CacheController<K, V>
if (value == null || value.equals(BaseCacheLoader.EMPTY_VALUE_PLACEHOLDER)) {
return null;
} else {
+ checkValue(value);
return value;
}
}
@Override
public void putIfAbsent(final K key, final V value) {
+ checkKey(key);
+ checkValue(value);
cache.putIfAbsent(new Element(key, value));
}
@Override
public boolean remove(final K key) {
+ checkKey(key);
if (cache.isKeyInCache(key)) {
cache.remove(key);
return true;
@@ -107,6 +113,8 @@ public class EhCacheBasedCacheController<K, V> implements CacheController<K, V>
}
private V computeAndCacheValue(final K key, final CacheLoaderArgument cacheLoaderArgument) {
+ checkKey(key);
+
final V value;
try {
value = baseCacheLoader.compute(key, cacheLoaderArgument);
@@ -119,9 +127,29 @@ public class EhCacheBasedCacheController<K, V> implements CacheController<K, V>
return null;
}
+ checkValue(value);
+
// Race condition, we may compute it for nothing
cache.putIfAbsent(new Element(key, value));
return value;
}
+
+ private void checkKey(final K keyObject) {
+ if (keyObject == null) {
+ throw new NullPointerException();
+ }
+ if (!getCacheType().getKeyType().isAssignableFrom(keyObject.getClass())) {
+ throw new ClassCastException("Invalid key type, expected : " + getCacheType().getKeyType().getName() + " but was : " + keyObject.getClass().getName());
+ }
+ }
+
+ private void checkValue(final V valueObject) {
+ if (valueObject == null) {
+ throw new NullPointerException();
+ }
+ if (!getCacheType().getValueType().isAssignableFrom(valueObject.getClass())) {
+ throw new ClassCastException("Invalid value type, expected : " + getCacheType().getValueType().getName() + " but was : " + valueObject.getClass().getName());
+ }
+ }
}
diff --git a/util/src/main/java/org/killbill/billing/util/cache/TenantStateMachineConfigCacheLoader.java b/util/src/main/java/org/killbill/billing/util/cache/TenantStateMachineConfigCacheLoader.java
index a05db1f..6ef8e00 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/TenantStateMachineConfigCacheLoader.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/TenantStateMachineConfigCacheLoader.java
@@ -52,7 +52,7 @@ public class TenantStateMachineConfigCacheLoader extends BaseCacheLoader<String,
@Override
public Object compute(final String key, final CacheLoaderArgument cacheLoaderArgument) {
- final String[] parts = ((String) key).split(CacheControllerDispatcher.CACHE_KEY_SEPARATOR);
+ final String[] parts = key.split(CacheControllerDispatcher.CACHE_KEY_SEPARATOR);
final String rawKey = parts[0];
final Matcher matcher = PATTERN.matcher(rawKey);
if (!matcher.matches()) {
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 f85796b..5be0ad0 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
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2012 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * 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
@@ -32,6 +32,7 @@ import org.killbill.billing.account.api.ImmutableAccountInternalApi;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.clock.Clock;
@@ -50,7 +51,10 @@ public class InternalCallContextFactory {
private final ImmutableAccountInternalApi accountInternalApi;
private final Clock clock;
private final NonEntityDao nonEntityDao;
- private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController<String, UUID> objectIdCacheController;
+ private final CacheController<String, Long> recordIdCacheController;
+ private final CacheController<String, Long> accountRecordIdCacheController;
+ private final CacheController<String, Long> tenantRecordIdCacheController;
@Inject
public InternalCallContextFactory(@Nullable final ImmutableAccountInternalApi accountInternalApi,
@@ -60,7 +64,17 @@ public class InternalCallContextFactory {
this.accountInternalApi = accountInternalApi;
this.clock = clock;
this.nonEntityDao = nonEntityDao;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
+ if (cacheControllerDispatcher == null) {
+ this.objectIdCacheController = null;
+ this.recordIdCacheController = null;
+ this.accountRecordIdCacheController = null;
+ this.tenantRecordIdCacheController = null;
+ } else {
+ this.objectIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
+ this.recordIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID);
+ this.accountRecordIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID);
+ this.tenantRecordIdCacheController = cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID);
+ }
}
//
@@ -307,7 +321,7 @@ public class InternalCallContextFactory {
public UUID getAccountId(final UUID objectId, final ObjectType objectType, final TenantContext context) {
final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, context);
if (accountRecordId != null) {
- return nonEntityDao.retrieveIdFromObject(accountRecordId, ObjectType.ACCOUNT, cacheControllerDispatcher == null ? null : cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID));
+ return nonEntityDao.retrieveIdFromObject(accountRecordId, ObjectType.ACCOUNT, objectIdCacheController);
} else {
return null;
}
@@ -317,7 +331,7 @@ public class InternalCallContextFactory {
public Long getRecordIdFromObject(final UUID objectId, final ObjectType objectType, final TenantContext context) {
try {
if (objectBelongsToTheRightTenant(objectId, objectType, context)) {
- return nonEntityDao.retrieveRecordIdFromObject(objectId, objectType, cacheControllerDispatcher == null ? null : cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ return nonEntityDao.retrieveRecordIdFromObject(objectId, objectType, recordIdCacheController);
} else {
return null;
}
@@ -358,7 +372,7 @@ public class InternalCallContextFactory {
}
private UUID getTenantIdSafe(final InternalTenantContext context) {
- return nonEntityDao.retrieveIdFromObject(context.getTenantRecordId(), ObjectType.TENANT, cacheControllerDispatcher == null ? null : cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID));
+ return nonEntityDao.retrieveIdFromObject(context.getTenantRecordId(), ObjectType.TENANT, objectIdCacheController);
}
//
@@ -386,11 +400,11 @@ public class InternalCallContextFactory {
//
private Long getAccountRecordIdUnsafe(final UUID objectId, final ObjectType objectType) {
- return nonEntityDao.retrieveAccountRecordIdFromObject(objectId, objectType, cacheControllerDispatcher == null ? null : cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID));
+ return nonEntityDao.retrieveAccountRecordIdFromObject(objectId, objectType, accountRecordIdCacheController);
}
private Long getTenantRecordIdUnsafe(final UUID objectId, final ObjectType objectType) {
- return nonEntityDao.retrieveTenantRecordIdFromObject(objectId, objectType, cacheControllerDispatcher == null ? null : cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID));
+ return nonEntityDao.retrieveTenantRecordIdFromObject(objectId, objectType, tenantRecordIdCacheController);
}
public static final class ObjectDoesNotExist extends IllegalStateException {
diff --git a/util/src/main/java/org/killbill/billing/util/config/tenant/CacheConfig.java b/util/src/main/java/org/killbill/billing/util/config/tenant/CacheConfig.java
index a1956d2..789cc0b 100644
--- a/util/src/main/java/org/killbill/billing/util/config/tenant/CacheConfig.java
+++ b/util/src/main/java/org/killbill/billing/util/config/tenant/CacheConfig.java
@@ -34,7 +34,7 @@ import com.google.inject.Inject;
public class CacheConfig {
- private final CacheController cacheController;
+ private final CacheController<Long, PerTenantConfig> cacheController;
private final CacheLoaderArgument cacheLoaderArgument;
private final ObjectMapper objectMapper;
@@ -48,7 +48,7 @@ public class CacheConfig {
}
public PerTenantConfig getPerTenantConfig(final InternalTenantContext tenantContext) {
- final PerTenantConfig perTenantConfig = (PerTenantConfig) cacheController.get(tenantContext.getTenantRecordId(), cacheLoaderArgument);
+ final PerTenantConfig perTenantConfig = cacheController.get(tenantContext.getTenantRecordId(), cacheLoaderArgument);
return perTenantConfig;
}
diff --git a/util/src/main/java/org/killbill/billing/util/dao/DefaultNonEntityDao.java b/util/src/main/java/org/killbill/billing/util/dao/DefaultNonEntityDao.java
index 043805e..728236f 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/DefaultNonEntityDao.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/DefaultNonEntityDao.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -40,22 +40,22 @@ import com.google.common.base.Preconditions;
public class DefaultNonEntityDao implements NonEntityDao {
private final NonEntitySqlDao nonEntitySqlDao;
- private final WithCaching<UUID, Long> withCachingObjectId;
- private final WithCaching<Long, UUID> withCachingRecordId;
+ private final WithCaching<String, Long> withCachingObjectId;
+ private final WithCaching<String, UUID> withCachingRecordId;
@Inject
public DefaultNonEntityDao(final IDBI dbi) {
this.nonEntitySqlDao = dbi.onDemand(NonEntitySqlDao.class);
- this.withCachingObjectId = new WithCaching<UUID, Long>();
- this.withCachingRecordId = new WithCaching<Long, UUID>();
+ this.withCachingObjectId = new WithCaching<String, Long>();
+ this.withCachingRecordId = new WithCaching<String, UUID>();
}
@Override
- public Long retrieveRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return retrieveRecordIdFromObjectInTransaction(objectId, objectType, cache, null);
}
- public Long retrieveRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
if (objectId == null) {
return null;
}
@@ -63,28 +63,29 @@ public class DefaultNonEntityDao implements NonEntityDao {
final TableName tableName = TableName.fromObjectType(objectType);
Preconditions.checkNotNull(tableName, "%s is not a valid ObjectType", objectType);
- return withCachingObjectId.withCaching(new OperationRetrieval<UUID, Long>() {
+ return withCachingObjectId.withCaching(new OperationRetrieval<Long>() {
@Override
- public Long doRetrieve(final UUID objectOrRecordId, final ObjectType objectType) {
+ public Long doRetrieve(final ObjectType objectType) {
final NonEntitySqlDao inTransactionNonEntitySqlDao = handle == null ? nonEntitySqlDao : SqlObjectBuilder.attach(handle, NonEntitySqlDao.class);
return inTransactionNonEntitySqlDao.getRecordIdFromObject(objectId.toString(), tableName.getTableName());
}
- }, objectId, objectType, tableName, cache);
+ }, objectId.toString(), objectType, tableName, cache);
}
@Override
- public Long retrieveAccountRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveAccountRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return retrieveAccountRecordIdFromObjectInTransaction(objectId, objectType, cache, null);
}
@Override
- public Long retrieveAccountRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveAccountRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
final TableName tableName = TableName.fromObjectType(objectType);
Preconditions.checkNotNull(tableName, "%s is not a valid ObjectType", objectType);
- return withCachingObjectId.withCaching(new OperationRetrieval<UUID, Long>() {
+ final String objectIdOrNull = objectId != null ? objectId.toString() : null;
+ return withCachingObjectId.withCaching(new OperationRetrieval<Long>() {
@Override
- public Long doRetrieve(final UUID objectId, final ObjectType objectType) {
+ public Long doRetrieve(final ObjectType objectType) {
final NonEntitySqlDao inTransactionNonEntitySqlDao = handle == null ? nonEntitySqlDao : SqlObjectBuilder.attach(handle, NonEntitySqlDao.class);
switch (tableName) {
@@ -94,50 +95,51 @@ public class DefaultNonEntityDao implements NonEntityDao {
return null;
case ACCOUNT:
- return inTransactionNonEntitySqlDao.getAccountRecordIdFromAccount(objectId.toString());
+ return inTransactionNonEntitySqlDao.getAccountRecordIdFromAccount(objectIdOrNull);
default:
- return inTransactionNonEntitySqlDao.getAccountRecordIdFromObjectOtherThanAccount(objectId.toString(), tableName.getTableName());
+ return inTransactionNonEntitySqlDao.getAccountRecordIdFromObjectOtherThanAccount(objectIdOrNull, tableName.getTableName());
}
}
- }, objectId, objectType, tableName, cache);
+ }, objectIdOrNull, objectType, tableName, cache);
}
@Override
- public Long retrieveTenantRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveTenantRecordIdFromObject(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return retrieveTenantRecordIdFromObjectInTransaction(objectId, objectType, cache, null);
}
@Override
- public Long retrieveTenantRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveTenantRecordIdFromObjectInTransaction(@Nullable final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
final TableName tableName = TableName.fromObjectType(objectType);
Preconditions.checkNotNull(tableName, "%s is not a valid ObjectType", objectType);
- return withCachingObjectId.withCaching(new OperationRetrieval<UUID, Long>() {
+ final String objectIdOrNull = objectId != null ? objectId.toString() : null;
+ return withCachingObjectId.withCaching(new OperationRetrieval<Long>() {
@Override
- public Long doRetrieve(final UUID objectId, final ObjectType objectType) {
+ public Long doRetrieve(final ObjectType objectType) {
final NonEntitySqlDao inTransactionNonEntitySqlDao = handle == null ? nonEntitySqlDao : SqlObjectBuilder.attach(handle, NonEntitySqlDao.class);
switch (tableName) {
case TENANT:
// Explicit cast to Long to avoid NPE (unboxing to long)
- return objectId == null ? (Long) 0L : inTransactionNonEntitySqlDao.getTenantRecordIdFromTenant(objectId.toString());
+ return objectId == null ? (Long) 0L : inTransactionNonEntitySqlDao.getTenantRecordIdFromTenant(objectIdOrNull);
default:
- return inTransactionNonEntitySqlDao.getTenantRecordIdFromObjectOtherThanTenant(objectId.toString(), tableName.getTableName());
+ return inTransactionNonEntitySqlDao.getTenantRecordIdFromObjectOtherThanTenant(objectIdOrNull, tableName.getTableName());
}
}
- }, objectId, objectType, tableName, cache);
+ }, objectIdOrNull, objectType, tableName, cache);
}
@Override
- public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache) {
return retrieveIdFromObjectInTransaction(recordId, objectType, cache, null);
}
@Override
- public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache, @Nullable final Handle handle) {
if (objectType == ObjectType.TENANT && recordId == InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID) {
return null;
}
@@ -145,13 +147,13 @@ public class DefaultNonEntityDao implements NonEntityDao {
final TableName tableName = TableName.fromObjectType(objectType);
Preconditions.checkNotNull(tableName, "%s is not a valid ObjectType", objectType);
- return withCachingRecordId.withCaching(new OperationRetrieval<Long, UUID>() {
+ return withCachingRecordId.withCaching(new OperationRetrieval<UUID>() {
@Override
- public UUID doRetrieve(final Long objectOrRecordId, final ObjectType objectType) {
+ public UUID doRetrieve(final ObjectType objectType) {
final NonEntitySqlDao inTransactionNonEntitySqlDao = handle == null ? nonEntitySqlDao : SqlObjectBuilder.attach(handle, NonEntitySqlDao.class);
return inTransactionNonEntitySqlDao.getIdFromObject(recordId, tableName.getTableName());
}
- }, recordId, objectType, tableName, cache);
+ }, String.valueOf(recordId), objectType, tableName, cache);
}
@Override
@@ -165,31 +167,31 @@ public class DefaultNonEntityDao implements NonEntityDao {
return nonEntitySqlDao.getHistoryTargetRecordId(recordId, tableName.getTableName());
}
- private interface OperationRetrieval<TypeIn, TypeOut> {
+ private interface OperationRetrieval<TypeOut> {
- public TypeOut doRetrieve(final TypeIn objectOrRecordId, final ObjectType objectType);
+ public TypeOut doRetrieve(final ObjectType objectType);
}
// 'cache' will be null for the CacheLoader classes -- or if cache is not configured.
private class WithCaching<TypeIn, TypeOut> {
- private TypeOut withCaching(final OperationRetrieval<TypeIn, TypeOut> op, @Nullable final TypeIn objectOrRecordId, final ObjectType objectType, final TableName tableName, @Nullable final CacheController<Object, Object> cache) {
+ private TypeOut withCaching(final OperationRetrieval<TypeOut> op, @Nullable final TypeIn objectOrRecordId, final ObjectType objectType, final TableName tableName, @Nullable final CacheController<TypeIn, TypeOut> cache) {
final Profiling<TypeOut, RuntimeException> prof = new Profiling<TypeOut, RuntimeException>();
if (objectOrRecordId == null) {
return null;
}
if (cache != null) {
- final String key = (cache.getCacheType().isKeyPrefixedWithTableName()) ?
- tableName + CacheControllerDispatcher.CACHE_KEY_SEPARATOR + objectOrRecordId.toString() :
- objectOrRecordId.toString();
- return (TypeOut) cache.get(key, new CacheLoaderArgument(objectType));
+ final TypeIn key = (cache.getCacheType().isKeyPrefixedWithTableName()) ?
+ (TypeIn) (tableName + CacheControllerDispatcher.CACHE_KEY_SEPARATOR + objectOrRecordId.toString()) :
+ objectOrRecordId;
+ return cache.get(key, new CacheLoaderArgument(objectType));
}
final TypeOut result;
result = prof.executeWithProfiling(ProfilingFeatureType.DAO_DETAILS, "NonEntityDao (type = " + objectType + ") cache miss", new WithProfilingCallback<TypeOut, RuntimeException>() {
@Override
public TypeOut execute() throws RuntimeException {
- return op.doRetrieve(objectOrRecordId, objectType);
+ return op.doRetrieve(objectType);
}
});
return result;
diff --git a/util/src/main/java/org/killbill/billing/util/dao/NonEntityDao.java b/util/src/main/java/org/killbill/billing/util/dao/NonEntityDao.java
index 72c9cf2..0261192 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/NonEntityDao.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/NonEntityDao.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * 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
@@ -29,21 +29,21 @@ import org.skife.jdbi.v2.Handle;
// This should only be used for internal operations (trusted code, not API), because the context will not be validated!
public interface NonEntityDao {
- public Long retrieveRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache);
+ public Long retrieveRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache);
- public Long retrieveRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle);
+ public Long retrieveRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle);
- public Long retrieveAccountRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache);
+ public Long retrieveAccountRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache);
- public Long retrieveAccountRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle);
+ public Long retrieveAccountRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle);
- public Long retrieveTenantRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache);
+ public Long retrieveTenantRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache);
- public Long retrieveTenantRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle);
+ public Long retrieveTenantRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle);
- public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache);
+ public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache);
- public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle);
+ public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache, @Nullable final Handle handle);
// This retrieves from the history table the latest record for which targetId matches the one we are passing
public Long retrieveLastHistoryRecordIdFromTransaction(final Long targetRecordId, final TableName tableName, final NonEntitySqlDao transactional);
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
index e4acb71..280d8ac 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2012 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * 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
@@ -30,6 +30,7 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import javax.annotation.Nullable;
@@ -344,19 +345,19 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>,
private void populateCacheOnGetByIdInvocation(M model) {
- final CacheController<Object, Object> cacheRecordId = cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID);
+ final CacheController<String, Long> cacheRecordId = cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID);
cacheRecordId.putIfAbsent(getKey(model.getId().toString(), CacheType.RECORD_ID, model.getTableName()), model.getRecordId());
- final CacheController<Object, Object> cacheObjectId = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
+ final CacheController<String, UUID> cacheObjectId = cacheControllerDispatcher.getCacheController(CacheType.OBJECT_ID);
cacheObjectId.putIfAbsent(getKey(model.getRecordId().toString(), CacheType.OBJECT_ID, model.getTableName()), model.getId());
if (model.getTenantRecordId() != null) {
- final CacheController<Object, Object> cacheTenantRecordId = cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID);
+ final CacheController<String, Long> cacheTenantRecordId = cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID);
cacheTenantRecordId.putIfAbsent(getKey(model.getId().toString(), CacheType.TENANT_RECORD_ID, model.getTableName()), model.getTenantRecordId());
}
if (model.getAccountRecordId() != null) {
- final CacheController<Object, Object> cacheAccountRecordId = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID);
+ final CacheController<String, Long> cacheAccountRecordId = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID);
cacheAccountRecordId.putIfAbsent(getKey(model.getId().toString(), CacheType.ACCOUNT_RECORD_ID, model.getTableName()), model.getAccountRecordId());
}
}
@@ -478,13 +479,13 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>,
// We need to invalidate the caches. There is a small window of doom here where caches will be stale.
// TODO Knowledge on how the key is constructed is also in AuditSqlDao
if (tableName.getHistoryTableName() != null) {
- final CacheController<Object, Object> cacheController = cacheControllerDispatcher.getCacheController(CacheType.AUDIT_LOG_VIA_HISTORY);
+ final CacheController<String, List> cacheController = cacheControllerDispatcher.getCacheController(CacheType.AUDIT_LOG_VIA_HISTORY);
if (cacheController != null) {
final String key = buildCacheKey(ImmutableMap.<Integer, Object>of(0, tableName.getHistoryTableName(), 1, tableName.getHistoryTableName(), 2, entityRecordId));
cacheController.remove(key);
}
} else {
- final CacheController<Object, Object> cacheController = cacheControllerDispatcher.getCacheController(CacheType.AUDIT_LOG);
+ final CacheController<String, List> cacheController = cacheControllerDispatcher.getCacheController(CacheType.AUDIT_LOG);
if (cacheController != null) {
final String key = buildCacheKey(ImmutableMap.<Integer, Object>of(0, tableName, 1, entityRecordId));
cacheController.remove(key);
diff --git a/util/src/test/java/org/killbill/billing/dao/MockNonEntityDao.java b/util/src/test/java/org/killbill/billing/dao/MockNonEntityDao.java
index 5893704..0a1812e 100644
--- a/util/src/test/java/org/killbill/billing/dao/MockNonEntityDao.java
+++ b/util/src/test/java/org/killbill/billing/dao/MockNonEntityDao.java
@@ -46,42 +46,42 @@ public class MockNonEntityDao implements NonEntityDao {
}
@Override
- public Long retrieveRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return null;
}
@Override
- public Long retrieveRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
return null;
}
@Override
- public Long retrieveAccountRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveAccountRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return accountRecordIdMappings.get(objectId);
}
@Override
- public Long retrieveAccountRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveAccountRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
return null;
}
@Override
- public Long retrieveTenantRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public Long retrieveTenantRecordIdFromObject(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache) {
return tenantRecordIdMappings.get(objectId);
}
@Override
- public Long retrieveTenantRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public Long retrieveTenantRecordIdFromObjectInTransaction(final UUID objectId, final ObjectType objectType, @Nullable final CacheController<String, Long> cache, @Nullable final Handle handle) {
return null;
}
@Override
- public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache) {
+ public UUID retrieveIdFromObject(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache) {
return null;
}
@Override
- public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<Object, Object> cache, @Nullable final Handle handle) {
+ public UUID retrieveIdFromObjectInTransaction(final Long recordId, final ObjectType objectType, @Nullable final CacheController<String, UUID> cache, @Nullable final Handle handle) {
return null;
}