diff --git a/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java b/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
index 03885a9..7e24a22 100644
--- a/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
+++ b/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
@@ -25,6 +25,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.killbill.billing.account.dao.AccountModelDao;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.util.account.AccountDateTimeUtils;
import org.killbill.billing.util.cache.ExternalizableInput;
@@ -63,6 +64,15 @@ public class DefaultImmutableAccountData implements ImmutableAccountData, Extern
AccountDateTimeUtils.getReferenceDateTime(account));
}
+ public DefaultImmutableAccountData(final AccountModelDao account) {
+ this(account.getId(),
+ account.getExternalKey(),
+ account.getCurrency(),
+ account.getTimeZone(),
+ AccountDateTimeUtils.getFixedOffsetTimeZone(account),
+ AccountDateTimeUtils.getReferenceDateTime(account));
+ }
+
@Override
public UUID getId() {
return id;
diff --git a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
index c1029e4..3054b9e 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
@@ -26,6 +26,8 @@ import org.killbill.billing.BillingExceptionBase;
import org.killbill.billing.ErrorCode;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
+import org.killbill.billing.account.api.DefaultImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountData;
import org.killbill.billing.account.api.user.DefaultAccountChangeEvent;
import org.killbill.billing.account.api.user.DefaultAccountCreationEvent;
import org.killbill.billing.account.api.user.DefaultAccountCreationEvent.DefaultAccountData;
@@ -35,6 +37,8 @@ import org.killbill.billing.entity.EntityPersistenceException;
import org.killbill.billing.events.AccountChangeInternalEvent;
import org.killbill.billing.events.AccountCreationInternalEvent;
import org.killbill.billing.util.audit.ChangeType;
+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;
@@ -60,6 +64,7 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
private static final Logger log = LoggerFactory.getLogger(DefaultAccountDao.class);
+ private final CacheController<Long, ImmutableAccountData> accountImmutableCacheController;
private final PersistentBus eventBus;
private final InternalCallContextFactory internalCallContextFactory;
private final Clock clock;
@@ -68,12 +73,22 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
public DefaultAccountDao(final IDBI dbi, final PersistentBus eventBus, final Clock clock, final CacheControllerDispatcher cacheControllerDispatcher,
final InternalCallContextFactory internalCallContextFactory, final NonEntityDao nonEntityDao) {
super(new EntitySqlDaoTransactionalJdbiWrapper(dbi, clock, cacheControllerDispatcher, nonEntityDao, internalCallContextFactory), AccountSqlDao.class);
+ this.accountImmutableCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE);
this.eventBus = eventBus;
this.internalCallContextFactory = internalCallContextFactory;
this.clock = clock;
}
@Override
+ public void create(final AccountModelDao entity, final InternalCallContext context) throws AccountApiException {
+ final AccountModelDao refreshedEntity = transactionalSqlDao.execute(getCreateEntitySqlDaoTransactionWrapper(entity, context));
+ // Populate the caches only after the transaction has been committed, in case of rollbacks
+ transactionalSqlDao.populateCaches(refreshedEntity);
+ // Eagerly populate the account-immutable cache as well
+ accountImmutableCacheController.putIfAbsent(refreshedEntity.getRecordId(), new DefaultImmutableAccountData(refreshedEntity));
+ }
+
+ @Override
protected AccountApiException generateAlreadyExistsException(final AccountModelDao account, final InternalCallContext context) {
return new AccountApiException(ErrorCode.ACCOUNT_ALREADY_EXISTS, account.getExternalKey());
}