killbill-memoizeit
Changes
pom.xml 2(+1 -1)
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..b79e883 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,9 +39,14 @@ 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("objectType") final ObjectType objectType,
+ @JsonProperty("objectId") final UUID objectId,
@JsonProperty("changedBy") final String changedBy,
@JsonProperty("reasonCode") final String reasonCode,
@JsonProperty("comments") final String comments,
@@ -49,10 +57,12 @@ public class AuditLogJson {
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(),
+ this(auditLog.getChangeType().toString(), auditLog.getCreatedDate(), auditLog.getAuditedObjectType(), auditLog.getAuditedEntityId(), auditLog.getUserName(), auditLog.getReasonCode(),
auditLog.getComment(), auditLog.getUserToken());
}
@@ -80,12 +90,22 @@ public class AuditLogJson {
return userToken;
}
+ public ObjectType getObjectType() {
+ return objectType;
+ }
+
+ public UUID getObjectId() {
+ return objectId;
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("AuditLogJson");
sb.append("{changeType='").append(changeType).append('\'');
sb.append(", changeDate=").append(changeDate);
+ sb.append(", objectType='").append(objectType).append('\'');
+ sb.append(", objectId='").append(objectId).append('\'');
sb.append(", changedBy=").append(changedBy);
sb.append(", reasonCode='").append(reasonCode).append('\'');
sb.append(", comments='").append(comments).append('\'');
@@ -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..cef00b5 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,36 @@ 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 = 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 AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(accountId, 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..3f88ac8 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;
@@ -29,7 +30,7 @@ public abstract class JaxrsTestUtils {
public static List<AuditLogJson> createAuditLogsJson(final DateTime changeDate) {
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(),
+ auditLogs.add(new AuditLogJson(UUIDs.randomUUID().toString(), changeDate, ObjectType.BUNDLE, UUIDs.randomUUID(), UUIDs.randomUUID().toString(),
UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString(), UUIDs.randomUUID().toString()));
}
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..6dce63f 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,18 +41,25 @@ 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, objectType, objectId, changedBy, reasonCode, comments, userToken);
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() + "\"," +
"\"changeDate\":\"" + auditLogJson.getChangeDate().toDateTimeISO().toString() + "\"," +
+ "\"objectType\":\"" + auditLogJson.getObjectType().toString() + "\"," +
+ "\"objectId\":\"" + auditLogJson.getObjectId().toString() + "\"," +
"\"changedBy\":\"" + auditLogJson.getChangedBy() + "\"," +
"\"reasonCode\":\"" + auditLogJson.getReasonCode() + "\"," +
"\"comments\":\"" + auditLogJson.getComments() + "\"," +
@@ -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);
}
}
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index d340aae..da317d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill-oss-parent</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.141.55</version>
+ <version>0.141.57</version>
</parent>
<artifactId>killbill</artifactId>
<version>0.19.10-SNAPSHOT</version>
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..a9b50d7 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
@@ -16,7 +16,6 @@
package org.killbill.billing.util.audit;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -35,7 +34,7 @@ public class DefaultAccountAuditLogs implements AccountAuditLogs {
private final UUID accountId;
private final AuditLevel auditLevel;
- private final Collection<AuditLog> accountAuditLogs;
+ private final List<AuditLog> accountAuditLogs;
private final Map<ObjectType, DefaultAccountAuditLogsForObjectType> auditLogsCache = new HashMap<ObjectType, DefaultAccountAuditLogsForObjectType>();
@@ -135,6 +134,11 @@ public class DefaultAccountAuditLogs implements AccountAuditLogs {
return auditLogsCache.get(objectType);
}
+ @Override
+ public List<AuditLog> getAuditLogs() {
+ return accountAuditLogs;
+ }
+
private final class ObjectTypeFilter extends AbstractIterator<AuditLog> {
private boolean hasSeenObjectType = false;