killbill-aplcache

invoice: code review integration Signed-off-by: Pierre-Alexandre

1/30/2019 6:14:55 AM

Details

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 3f76659..7742de0 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
@@ -351,24 +351,22 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
         return transactionalSqlDao.execute(false, new EntitySqlDaoTransactionWrapper<List<InvoiceItemModelDao>>() {
             @Override
             public List<InvoiceItemModelDao> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+                final InvoiceSqlDao invoiceSqlDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
+                final InvoiceItemSqlDao transInvoiceItemSqlDao = entitySqlDaoWrapperFactory.become(InvoiceItemSqlDao.class);
+
                 final ExistingInvoiceMetadata existingInvoiceMetadata;
                 if (existingInvoiceMetadataOrNull == null) {
-                    final List<InvoiceModelDao> allInvoicesForAccount = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(true, invoicesTags, entitySqlDaoWrapperFactory, context);
-                    invoiceDaoHelper.populateChildren(allInvoicesForAccount, invoicesTags, entitySqlDaoWrapperFactory, context);
-                    existingInvoiceMetadata = new ExistingInvoiceMetadata(allInvoicesForAccount);
+                    existingInvoiceMetadata = new ExistingInvoiceMetadata(invoiceSqlDao, transInvoiceItemSqlDao);
                 } else {
                     existingInvoiceMetadata = existingInvoiceMetadataOrNull;
                 }
 
-                final InvoiceSqlDao invoiceSqlDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
-                final InvoiceItemSqlDao transInvoiceItemSqlDao = entitySqlDaoWrapperFactory.become(InvoiceItemSqlDao.class);
-
                 final List<InvoiceItemModelDao> createdInvoiceItems = new LinkedList<InvoiceItemModelDao>();
                 for (final InvoiceModelDao invoiceModelDao : invoices) {
                     invoiceByInvoiceId.put(invoiceModelDao.getId(), invoiceModelDao);
                     final boolean isNotShellInvoice = invoiceIdsReferencedFromItems.remove(invoiceModelDao.getId());
 
-                    final InvoiceModelDao invoiceOnDisk = existingInvoiceMetadata.getExistingInvoice(invoiceModelDao.getId());
+                    final InvoiceModelDao invoiceOnDisk = existingInvoiceMetadata.getExistingInvoice(invoiceModelDao.getId(), context);
                     if (isNotShellInvoice) {
                         // Create the invoice if this is not a shell invoice and it does not already exist
                         if (invoiceOnDisk == null) {
@@ -382,7 +380,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
 
                     // Create the invoice items if needed (note: they may not necessarily belong to that invoice)
                     for (final InvoiceItemModelDao invoiceItemModelDao : invoiceModelDao.getInvoiceItems()) {
-                        final InvoiceItemModelDao existingInvoiceItem = existingInvoiceMetadata.getExistingInvoiceItem(invoiceItemModelDao.getId());
+                        final InvoiceItemModelDao existingInvoiceItem = existingInvoiceMetadata.getExistingInvoiceItem(invoiceItemModelDao.getId(), context);
                         // Because of AUTO_INVOICING_REUSE_DRAFT we expect an invoice were items might already exist.
                         // Also for ALLOWED_INVOICE_ITEM_TYPES, we expect plugins to potentially modify the amount
                         if (existingInvoiceItem == null) {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/ExistingInvoiceMetadata.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/ExistingInvoiceMetadata.java
index 58d8a3e..1147442 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/ExistingInvoiceMetadata.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/ExistingInvoiceMetadata.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
+import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceItem;
 
@@ -30,6 +31,9 @@ public class ExistingInvoiceMetadata {
     private final Map<UUID, InvoiceModelDao> invoicesCache = new HashMap<UUID, InvoiceModelDao>();
     private final Map<UUID, InvoiceItemModelDao> invoiceItemsCache = new HashMap<UUID, InvoiceItemModelDao>();
 
+    private InvoiceSqlDao invoiceSqlDao;
+    private InvoiceItemSqlDao invoiceItemSqlDao;
+
     public ExistingInvoiceMetadata(final Iterable<Invoice> existingInvoices) {
         for (final Invoice invoice : existingInvoices) {
             invoicesCache.put(invoice.getId(), new InvoiceModelDao(invoice));
@@ -48,11 +52,24 @@ public class ExistingInvoiceMetadata {
         }
     }
 
-    public InvoiceModelDao getExistingInvoice(final UUID invoiceId) {
-        return invoicesCache.get(invoiceId);
+    public ExistingInvoiceMetadata(final InvoiceSqlDao invoiceSqlDao, final InvoiceItemSqlDao invoiceItemSqlDao) {
+        this.invoiceSqlDao = invoiceSqlDao;
+        this.invoiceItemSqlDao = invoiceItemSqlDao;
     }
 
-    public InvoiceItemModelDao getExistingInvoiceItem(final UUID invoiceItemId) {
-        return invoiceItemsCache.get(invoiceItemId);
+    public InvoiceModelDao getExistingInvoice(final UUID invoiceId, final InternalTenantContext context) {
+        if (invoiceSqlDao != null) {
+            return invoiceSqlDao.getById(invoiceId.toString(), context);
+        } else {
+            return invoicesCache.get(invoiceId);
+        }
+    }
+
+    public InvoiceItemModelDao getExistingInvoiceItem(final UUID invoiceItemId, final InternalTenantContext context) {
+        if (invoiceItemSqlDao != null) {
+            return invoiceItemSqlDao.getById(invoiceItemId.toString(), context);
+        } else {
+            return invoiceItemsCache.get(invoiceItemId);
+        }
     }
 }