killbill-memoizeit

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AuditLogJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AuditLogJson.java
index 0352df3..84b16bc 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AuditLogJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AuditLogJson.java
@@ -16,8 +16,11 @@
 
 package org.killbill.billing.jaxrs.json;
 
+import java.util.UUID;
+
 import org.joda.time.DateTime;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.util.audit.AuditLog;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -36,24 +39,31 @@ public class AuditLogJson {
     private final String comments;
     private final String userToken;
 
+    private final ObjectType objectType;
+    private final UUID objectId;
+
     @JsonCreator
     public AuditLogJson(@JsonProperty("changeType") final String changeType,
                         @JsonProperty("changeDate") final DateTime changeDate,
                         @JsonProperty("changedBy") final String changedBy,
                         @JsonProperty("reasonCode") final String reasonCode,
                         @JsonProperty("comments") final String comments,
-                        @JsonProperty("userToken") final String userToken) {
+                        @JsonProperty("userToken") final String userToken,
+                        @JsonProperty("objectType") final ObjectType objectType,
+                        @JsonProperty("objectId") final UUID objectId) {
         this.changeType = changeType;
         this.changeDate = changeDate;
         this.changedBy = changedBy;
         this.reasonCode = reasonCode;
         this.comments = comments;
         this.userToken = userToken;
+        this.objectType = objectType;
+        this.objectId = objectId;
     }
 
     public AuditLogJson(final AuditLog auditLog) {
         this(auditLog.getChangeType().toString(), auditLog.getCreatedDate(), auditLog.getUserName(), auditLog.getReasonCode(),
-             auditLog.getComment(), auditLog.getUserToken());
+             auditLog.getComment(), auditLog.getUserToken(), auditLog.getAuditedObjectType(), auditLog.getAuditedEntityId());
     }
 
     public String getChangeType() {
@@ -80,6 +90,14 @@ public class AuditLogJson {
         return userToken;
     }
 
+    public ObjectType getObjectType() {
+        return objectType;
+    }
+
+    public UUID getObjectId() {
+        return objectId;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
@@ -90,6 +108,8 @@ public class AuditLogJson {
         sb.append(", reasonCode='").append(reasonCode).append('\'');
         sb.append(", comments='").append(comments).append('\'');
         sb.append(", userToken='").append(userToken).append('\'');
+        sb.append(", objectType='").append(objectType).append('\'');
+        sb.append(", objectId='").append(objectId).append('\'');
         sb.append('}');
         return sb.toString();
     }
@@ -123,6 +143,12 @@ public class AuditLogJson {
         if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
             return false;
         }
+        if (objectType != that.objectType) {
+            return false;
+        }
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
 
         return true;
     }
@@ -135,6 +161,8 @@ public class AuditLogJson {
         result = 31 * result + (reasonCode != null ? reasonCode.hashCode() : 0);
         result = 31 * result + (comments != null ? comments.hashCode() : 0);
         result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         return result;
     }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index 0c79bed..a7299e6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -34,6 +34,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -82,6 +83,7 @@ import org.killbill.billing.jaxrs.JaxrsExecutors;
 import org.killbill.billing.jaxrs.json.AccountEmailJson;
 import org.killbill.billing.jaxrs.json.AccountJson;
 import org.killbill.billing.jaxrs.json.AccountTimelineJson;
+import org.killbill.billing.jaxrs.json.AuditLogJson;
 import org.killbill.billing.jaxrs.json.BlockingStateJson;
 import org.killbill.billing.jaxrs.json.BundleJson;
 import org.killbill.billing.jaxrs.json.CustomFieldJson;
@@ -118,6 +120,7 @@ import org.killbill.billing.util.api.TagApiException;
 import org.killbill.billing.util.api.TagDefinitionApiException;
 import org.killbill.billing.util.api.TagUserApi;
 import org.killbill.billing.util.audit.AccountAuditLogs;
+import org.killbill.billing.util.audit.AuditLog;
 import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.TenantContext;
 import org.killbill.billing.util.config.definition.JaxrsConfig;
@@ -1484,4 +1487,38 @@ public class AccountResource extends JaxRsResourceBase {
         return Response.status(Response.Status.OK).build();
     }
 
+    /*
+     * *************************     AUDIT LOGS     *****************************
+     */
+
+    @TimedResource
+    @GET
+    @Path("/{accountId:" + UUID_PATTERN + "}/" + AUDIT_LOG)
+    @Produces(APPLICATION_JSON)
+    @ApiOperation(value = "Retrieve audit logs by account id", response = AuditLogJson.class, responseContainer = "List")
+    @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied"),
+                           @ApiResponse(code = 404, message = "Account not found")})
+    public Response getAccountAuditLogs(@PathParam("accountId") final UUID accountId,
+                               @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+        final TenantContext tenantContext = context.createTenantContextWithAccountId(accountId, request);
+        final Account account = accountUserApi.getAccountById(accountId, tenantContext);
+        final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(account.getId(), AuditLevel.FULL, tenantContext);
+
+        return Response.status(Status.OK).entity(getAuditLogs(accountAuditLogs)).build();
+    }
+
+    private List<AuditLogJson> getAuditLogs(AccountAuditLogs accountAuditLogs) {
+        if (accountAuditLogs.getAuditLogs() == null) {
+            return null;
+        }
+
+        return ImmutableList.<AuditLogJson>copyOf(Collections2.transform(accountAuditLogs.getAuditLogs(), new Function<AuditLog, AuditLogJson>() {
+            @Override
+            public AuditLogJson apply(@Nullable final AuditLog input) {
+                return new AuditLogJson(input);
+            }
+        }));
+    }
+
+
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index 444f06f..3073f8c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -303,5 +303,6 @@ public interface JaxrsResource {
 
     public static final String QUERY_INCLUDED_DELETED = "includedDeleted";
 
+    public static final String AUDIT_LOG = "auditLogs";
 
 }
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestUtils.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestUtils.java
index a43c2be..99720c3 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestUtils.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestUtils.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.joda.time.DateTime;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.jaxrs.json.AuditLogJson;
 import org.killbill.billing.util.UUIDs;
 
@@ -30,7 +31,7 @@ public abstract class JaxrsTestUtils {
         final List<AuditLogJson> auditLogs = new ArrayList<AuditLogJson>();
         for (int i = 0; i < 20; i++) {
             auditLogs.add(new AuditLogJson(UUIDs.randomUUID().toString(), changeDate, UUIDs.randomUUID().toString(),
-                                           UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString()));
+                                           UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString(), ObjectType.BUNDLE, UUIDs.randomUUID()));
         }
 
         return auditLogs;
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
index 9687a04..a4a4aef 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
@@ -41,14 +41,19 @@ public class TestAuditLogJson extends JaxrsTestSuiteNoDB {
         final String reasonCode = UUID.randomUUID().toString();
         final String comments = UUID.randomUUID().toString();
         final String userToken = UUID.randomUUID().toString();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.BUNDLE;
 
-        final AuditLogJson auditLogJson = new AuditLogJson(changeType, changeDate, changedBy, reasonCode, comments, userToken);
+        final AuditLogJson auditLogJson = new AuditLogJson(changeType, changeDate, changedBy, reasonCode, comments, userToken, objectType, objectId);
         Assert.assertEquals(auditLogJson.getChangeType(), changeType);
         Assert.assertEquals(auditLogJson.getChangeDate(), changeDate);
         Assert.assertEquals(auditLogJson.getChangedBy(), changedBy);
         Assert.assertEquals(auditLogJson.getReasonCode(), reasonCode);
         Assert.assertEquals(auditLogJson.getComments(), comments);
         Assert.assertEquals(auditLogJson.getUserToken(), userToken);
+        Assert.assertEquals(auditLogJson.getObjectType(), objectType);
+        Assert.assertEquals(auditLogJson.getObjectId(), objectId);
+
 
         final String asJson = mapper.writeValueAsString(auditLogJson);
         Assert.assertEquals(asJson, "{\"changeType\":\"" + auditLogJson.getChangeType() + "\"," +
@@ -56,7 +61,9 @@ public class TestAuditLogJson extends JaxrsTestSuiteNoDB {
                                     "\"changedBy\":\"" + auditLogJson.getChangedBy() + "\"," +
                                     "\"reasonCode\":\"" + auditLogJson.getReasonCode() + "\"," +
                                     "\"comments\":\"" + auditLogJson.getComments() + "\"," +
-                                    "\"userToken\":\"" + auditLogJson.getUserToken() + "\"}");
+                                    "\"userToken\":\"" + auditLogJson.getUserToken() + "\"," +
+                                    "\"objectType\":\"" + auditLogJson.getObjectType().toString() + "\"," +
+                                    "\"objectId\":\"" + auditLogJson.getObjectId().toString() + "\"}");
 
         final AuditLogJson fromJson = mapper.readValue(asJson, AuditLogJson.class);
         Assert.assertEquals(fromJson, auditLogJson);
@@ -78,5 +85,6 @@ public class TestAuditLogJson extends JaxrsTestSuiteNoDB {
         Assert.assertEquals(auditLogJson.getReasonCode(), callContext.getReasonCode());
         Assert.assertEquals(auditLogJson.getComments(), callContext.getComments());
         Assert.assertEquals(auditLogJson.getUserToken(), callContext.getUserToken().toString());
+        Assert.assertEquals(auditLogJson.getObjectType(), ObjectType.ACCOUNT_EMAIL);
     }
 }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
index b315d8d..66ff2e5 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
@@ -42,6 +42,7 @@ import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
 import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
 import org.killbill.billing.util.api.AuditLevel;
+import org.killbill.billing.util.audit.ChangeType;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
@@ -515,4 +516,39 @@ public class TestAccount extends TestJaxrsBase {
 
     }
 
+    @Test(groups = "slow", description = "retrieve account logs")
+    public void testGetAccountAuditLogs() throws Exception {
+        final Account accountJson = createAccount();
+        assertNotNull(accountJson);
+
+        // generate more log data
+        final Collection<CustomField> customFields = new LinkedList<CustomField>();
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "1", "value1", null));
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "2", "value2", null));
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "3", "value3", null));
+
+        killBillClient.createAccountCustomFields(accountJson.getAccountId(), customFields, requestOptions);
+
+        final List<CustomField> accountCustomFields = killBillClient.getAccountCustomFields(accountJson.getAccountId(), requestOptions);
+        assertEquals(accountCustomFields.size(), 3);
+
+        final List<AuditLog> auditLogsJson = killBillClient.getAccountAuditLogs(accountJson.getAccountId());
+        assertEquals(auditLogsJson.size(), 4);
+        assertEquals(auditLogsJson.get(0).getChangeType(), ChangeType.INSERT.toString());
+        assertEquals(auditLogsJson.get(0).getObjectType(), ObjectType.ACCOUNT);
+        assertEquals(auditLogsJson.get(0).getObjectId(), accountJson.getAccountId());
+
+        assertEquals(auditLogsJson.get(1).getChangeType(), ChangeType.INSERT.toString());
+        assertEquals(auditLogsJson.get(1).getObjectType(), ObjectType.CUSTOM_FIELD);
+        assertEquals(auditLogsJson.get(1).getObjectId(), accountCustomFields.get(0).getCustomFieldId());
+
+        assertEquals(auditLogsJson.get(2).getChangeType(), ChangeType.INSERT.toString());
+        assertEquals(auditLogsJson.get(2).getObjectType(), ObjectType.CUSTOM_FIELD);
+        assertEquals(auditLogsJson.get(2).getObjectId(), accountCustomFields.get(1).getCustomFieldId());
+
+        assertEquals(auditLogsJson.get(3).getChangeType(), ChangeType.INSERT.toString());
+        assertEquals(auditLogsJson.get(3).getObjectType(), ObjectType.CUSTOM_FIELD);
+        assertEquals(auditLogsJson.get(3).getObjectId(), accountCustomFields.get(2).getCustomFieldId());
+    }
+
 }
diff --git a/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java b/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
index ae09fd2..22faf40 100644
--- a/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
+++ b/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
@@ -135,6 +135,11 @@ public class DefaultAccountAuditLogs implements AccountAuditLogs {
         return auditLogsCache.get(objectType);
     }
 
+    @Override
+    public List<AuditLog> getAuditLogs() {
+        return ImmutableList.<AuditLog>copyOf(accountAuditLogs);
+    }
+
     private final class ObjectTypeFilter extends AbstractIterator<AuditLog> {
 
         private boolean hasSeenObjectType = false;