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());
+ }
+}