killbill-memoizeit

audit: make AuditUserApi more friendly Add methods to retrieve

8/10/2012 3:38:53 PM

Details

diff --git a/api/src/main/java/com/ning/billing/payment/api/Payment.java b/api/src/main/java/com/ning/billing/payment/api/Payment.java
index a7a483b..1d2db56 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Payment.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Payment.java
@@ -22,10 +22,9 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.entity.Entity;
 
-public interface Payment {
-
-    public UUID getId();
+public interface Payment extends Entity {
 
     public UUID getAccountId();
 
diff --git a/api/src/main/java/com/ning/billing/payment/api/Refund.java b/api/src/main/java/com/ning/billing/payment/api/Refund.java
index d6bb3ea..efc7267 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Refund.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Refund.java
@@ -22,8 +22,9 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.entity.Entity;
 
-public interface Refund {
+public interface Refund extends Entity {
 
     public UUID getId();
 
diff --git a/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java b/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
index 1770335..266eb3b 100644
--- a/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
+++ b/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
@@ -19,13 +19,63 @@ package com.ning.billing.util.api;
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.payment.api.Payment;
+import com.ning.billing.payment.api.Refund;
 import com.ning.billing.util.audit.AuditLog;
+import com.ning.billing.util.audit.AuditLogsForBundles;
+import com.ning.billing.util.audit.AuditLogsForInvoicePayments;
+import com.ning.billing.util.audit.AuditLogsForInvoices;
+import com.ning.billing.util.audit.AuditLogsForPayments;
+import com.ning.billing.util.audit.AuditLogsForRefunds;
 import com.ning.billing.util.dao.ObjectType;
 
 public interface AuditUserApi {
 
     /**
-     * Get all the audit entries for a given object
+     * Fetch all audit logs for bundles.
+     *
+     * @param bundles the bundles to lookup
+     * @return all audit logs for these refunds
+     */
+    public AuditLogsForBundles getAuditLogsForBundles(final List<SubscriptionBundle> bundles);
+
+    /**
+     * Fetch all audit logs for invoice payments.
+     *
+     * @param invoicePayments the invoice payments to lookup
+     * @return all audit logs for these invoice payments
+     */
+    public AuditLogsForInvoicePayments getAuditLogsForInvoicePayments(final List<InvoicePayment> invoicePayments);
+
+    /**
+     * Fetch all audit logs for refunds.
+     *
+     * @param refunds the refunds to lookup
+     * @return all audit logs for these refunds
+     */
+    public AuditLogsForRefunds getAuditLogsForRefunds(final List<Refund> refunds);
+
+    /**
+     * Fetch all audit logs for payments.
+     *
+     * @param payments the payments to lookup
+     * @return all audit logs for these payments
+     */
+    public AuditLogsForPayments getAuditLogsForPayments(final List<Payment> payments);
+
+    /**
+     * Fetch all audit logs for invoices and associated invoice items.
+     *
+     * @param invoices the invoices to lookup
+     * @return all audit logs for these invoices
+     */
+    public AuditLogsForInvoices getAuditLogsForInvoices(final List<Invoice> invoices);
+
+    /**
+     * Get all the audit entries for a given object.
      *
      * @param objectId   the object id
      * @param objectType the type of object
diff --git a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
index f497247..14ca318 100644
--- a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
+++ b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
@@ -16,13 +16,31 @@
 
 package com.ning.billing.util.audit.api;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.inject.Inject;
 
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.payment.api.Payment;
+import com.ning.billing.payment.api.Refund;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.audit.AuditLog;
+import com.ning.billing.util.audit.AuditLogsForBundles;
+import com.ning.billing.util.audit.AuditLogsForInvoicePayments;
+import com.ning.billing.util.audit.AuditLogsForInvoices;
+import com.ning.billing.util.audit.AuditLogsForPayments;
+import com.ning.billing.util.audit.AuditLogsForRefunds;
+import com.ning.billing.util.audit.DefaultAuditLogsForBundles;
+import com.ning.billing.util.audit.DefaultAuditLogsForInvoicePayments;
+import com.ning.billing.util.audit.DefaultAuditLogsForInvoices;
+import com.ning.billing.util.audit.DefaultAuditLogsForPayments;
+import com.ning.billing.util.audit.DefaultAuditLogsForRefunds;
 import com.ning.billing.util.audit.dao.AuditDao;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.dao.TableName;
@@ -39,6 +57,60 @@ public class DefaultAuditUserApi implements AuditUserApi {
     }
 
     @Override
+    public AuditLogsForBundles getAuditLogsForBundles(final List<SubscriptionBundle> bundles) {
+        final Map<UUID, List<AuditLog>> bundlesAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        for (final SubscriptionBundle bundle : bundles) {
+            bundlesAuditLogs.put(bundle.getId(), getAuditLogs(bundle.getId(), ObjectType.BUNDLE));
+        }
+
+        return new DefaultAuditLogsForBundles(bundlesAuditLogs);
+    }
+
+    @Override
+    public AuditLogsForInvoicePayments getAuditLogsForInvoicePayments(final List<InvoicePayment> invoicePayments) {
+        final Map<UUID, List<AuditLog>> invoicePaymentsAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        for (final InvoicePayment invoicePayment : invoicePayments) {
+            invoicePaymentsAuditLogs.put(invoicePayment.getId(), getAuditLogs(invoicePayment.getId(), ObjectType.INVOICE_PAYMENT));
+        }
+
+        return new DefaultAuditLogsForInvoicePayments(invoicePaymentsAuditLogs);
+    }
+
+    @Override
+    public AuditLogsForRefunds getAuditLogsForRefunds(final List<Refund> refunds) {
+        final Map<UUID, List<AuditLog>> refundsAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        for (final Refund refund : refunds) {
+            refundsAuditLogs.put(refund.getId(), getAuditLogs(refund.getId(), ObjectType.REFUND));
+        }
+
+        return new DefaultAuditLogsForRefunds(refundsAuditLogs);
+    }
+
+    @Override
+    public AuditLogsForPayments getAuditLogsForPayments(final List<Payment> payments) {
+        final Map<UUID, List<AuditLog>> paymentsAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        for (final Payment payment : payments) {
+            paymentsAuditLogs.put(payment.getId(), getAuditLogs(payment.getId(), ObjectType.PAYMENT));
+        }
+
+        return new DefaultAuditLogsForPayments(paymentsAuditLogs);
+    }
+
+    @Override
+    public AuditLogsForInvoices getAuditLogsForInvoices(final List<Invoice> invoices) {
+        final Map<UUID, List<AuditLog>> invoiceAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        final Map<UUID, List<AuditLog>> invoiceItemsAuditLogs = new HashMap<UUID, List<AuditLog>>();
+        for (final Invoice invoice : invoices) {
+            invoiceAuditLogs.put(invoice.getId(), getAuditLogs(invoice.getId(), ObjectType.INVOICE));
+            for (final InvoiceItem invoiceItem : invoice.getInvoiceItems()) {
+                invoiceItemsAuditLogs.put(invoiceItem.getId(), getAuditLogs(invoiceItem.getId(), ObjectType.INVOICE_ITEM));
+            }
+        }
+
+        return new DefaultAuditLogsForInvoices(invoiceAuditLogs, invoiceItemsAuditLogs);
+    }
+
+    @Override
     public List<AuditLog> getAuditLogs(final UUID objectId, final ObjectType objectType) {
         final TableName tableName = getTableNameFromObjectType(objectType);
         if (tableName == null) {
diff --git a/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java b/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java
new file mode 100644
index 0000000..9c58442
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.util.audit.api;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.mockito.Mockito;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.payment.api.Payment;
+import com.ning.billing.payment.api.Refund;
+import com.ning.billing.util.api.AuditUserApi;
+import com.ning.billing.util.audit.AuditLog;
+import com.ning.billing.util.audit.AuditLogsForBundles;
+import com.ning.billing.util.audit.AuditLogsForInvoicePayments;
+import com.ning.billing.util.audit.AuditLogsForInvoices;
+import com.ning.billing.util.audit.AuditLogsForPayments;
+import com.ning.billing.util.audit.AuditLogsForRefunds;
+import com.ning.billing.util.audit.AuditLogsTestBase;
+import com.ning.billing.util.audit.dao.MockAuditDao;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.dao.TableName;
+import com.ning.billing.util.entity.Entity;
+
+import com.google.common.collect.ImmutableList;
+
+public class TestDefaultAuditUserApi extends AuditLogsTestBase {
+
+    private final List<AuditLog> auditLogs = ImmutableList.<AuditLog>of(createAuditLog(), createAuditLog(), createAuditLog(), createAuditLog());
+    private final List<UUID> objectIds = ImmutableList.<UUID>of(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID());
+
+    private AuditUserApi auditUserApi;
+
+    @BeforeTest(groups = "fast")
+    public void setupAuditLogs() throws Exception {
+        final MockAuditDao auditDao = new MockAuditDao();
+        for (final TableName tableName : TableName.values()) {
+            for (final UUID objectId : objectIds) {
+                for (final AuditLog auditLog : auditLogs) {
+                    auditDao.addAuditLogForId(tableName, objectId, auditLog);
+                }
+            }
+        }
+
+        auditUserApi = new DefaultAuditUserApi(auditDao);
+    }
+
+    @Test(groups = "fast")
+    public void testForBundles() throws Exception {
+        final List<SubscriptionBundle> bundles = createMocks(SubscriptionBundle.class);
+
+        // TODO check SubscriptionEventsAuditLogs
+
+        final AuditLogsForBundles auditLogsForBundles = auditUserApi.getAuditLogsForBundles(bundles);
+        verifyAuditLogs(auditLogsForBundles.getBundlesAuditLogs());
+    }
+
+    @Test(groups = "fast")
+    public void testForInvoicePayments() throws Exception {
+        final List<InvoicePayment> invoicePayments = createMocks(InvoicePayment.class);
+
+        final AuditLogsForInvoicePayments auditLogsForInvoicePayments = auditUserApi.getAuditLogsForInvoicePayments(invoicePayments);
+        verifyAuditLogs(auditLogsForInvoicePayments.getInvoicePaymentsAuditLogs());
+    }
+
+    @Test(groups = "fast")
+    public void testForRefunds() throws Exception {
+        final List<Refund> refunds = createMocks(Refund.class);
+
+        final AuditLogsForRefunds auditLogsForRefunds = auditUserApi.getAuditLogsForRefunds(refunds);
+        verifyAuditLogs(auditLogsForRefunds.getRefundsAuditLogs());
+    }
+
+    @Test(groups = "fast")
+    public void testForPayments() throws Exception {
+        final List<Payment> payments = createMocks(Payment.class);
+
+        final AuditLogsForPayments auditLogsForPayments = auditUserApi.getAuditLogsForPayments(payments);
+        verifyAuditLogs(auditLogsForPayments.getPaymentsAuditLogs());
+    }
+
+    @Test(groups = "fast")
+    public void testForInvoices() throws Exception {
+        final List<Invoice> invoices = createMocks(Invoice.class);
+        final List<InvoiceItem> invoiceItems = createMocks(InvoiceItem.class);
+        for (final Invoice invoice : invoices) {
+            Mockito.when(invoice.getInvoiceItems()).thenReturn(invoiceItems);
+        }
+
+        final AuditLogsForInvoices auditLogsForInvoices = auditUserApi.getAuditLogsForInvoices(invoices);
+        verifyAuditLogs(auditLogsForInvoices.getInvoiceAuditLogs());
+        verifyAuditLogs(auditLogsForInvoices.getInvoiceItemsAuditLogs());
+    }
+
+    @Test(groups = "fast")
+    public void testForObject() throws Exception {
+        for (final ObjectType objectType : ObjectType.values()) {
+            for (final UUID objectId : objectIds) {
+                Assert.assertEquals(auditUserApi.getAuditLogs(objectId, objectType), auditLogs);
+            }
+        }
+    }
+
+    private void verifyAuditLogs(final Map<UUID, List<AuditLog>> objectsAuditLogs) {
+        Assert.assertEquals(objectsAuditLogs.size(), objectIds.size());
+        for (final UUID objectId : objectIds) {
+            Assert.assertEquals(objectsAuditLogs.get(objectId), auditLogs);
+        }
+    }
+
+    private <T extends Entity> List<T> createMocks(final Class<T> clazz) {
+        final List<T> entities = new ArrayList<T>();
+        for (final UUID objectId : objectIds) {
+            final T entity = Mockito.mock(clazz);
+            Mockito.when(entity.getId()).thenReturn(objectId);
+            entities.add(entity);
+        }
+
+        return entities;
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/audit/dao/MockAuditDao.java b/util/src/test/java/com/ning/billing/util/audit/dao/MockAuditDao.java
new file mode 100644
index 0000000..7af195c
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/audit/dao/MockAuditDao.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.util.audit.dao;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import com.ning.billing.util.audit.AuditLog;
+import com.ning.billing.util.dao.TableName;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+
+public class MockAuditDao implements AuditDao {
+
+    private final Map<TableName, Map<UUID, List<AuditLog>>> auditLogsForTables = new HashMap<TableName, Map<UUID, List<AuditLog>>>();
+
+    public synchronized void addAuditLogForId(final TableName tableName, final UUID objectId, final AuditLog auditLog) {
+        addAuditLogsForId(tableName, objectId, ImmutableList.<AuditLog>of(auditLog));
+    }
+
+    public synchronized void addAuditLogsForId(final TableName tableName, final UUID objectId, final List<AuditLog> auditLogs) {
+        if (auditLogsForTables.get(tableName) == null) {
+            auditLogsForTables.put(tableName, new HashMap<UUID, List<AuditLog>>());
+        }
+
+        if (auditLogsForTables.get(tableName).get(objectId) == null) {
+            auditLogsForTables.get(tableName).put(objectId, new ArrayList<AuditLog>());
+        }
+
+        auditLogsForTables.get(tableName).get(objectId).addAll(auditLogs);
+    }
+
+    @Override
+    public List<AuditLog> getAuditLogsForId(final TableName tableName, final UUID objectId) {
+        final Map<UUID, List<AuditLog>> auditLogsForTableName = auditLogsForTables.get(tableName);
+        if (auditLogsForTableName == null) {
+            return ImmutableList.<AuditLog>of();
+        }
+
+        final List<AuditLog> auditLogsForObjectId = auditLogsForTableName.get(objectId);
+        return Objects.firstNonNull(auditLogsForObjectId, ImmutableList.<AuditLog>of());
+    }
+}