diff --git a/src/main/java/com/avaje/ebean/event/changelog/ChangeSet.java b/src/main/java/com/avaje/ebean/event/changelog/ChangeSet.java index 9b82ebfcf..5e229acf8 100644 --- a/src/main/java/com/avaje/ebean/event/changelog/ChangeSet.java +++ b/src/main/java/com/avaje/ebean/event/changelog/ChangeSet.java @@ -1,7 +1,9 @@ package com.avaje.ebean.event.changelog; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * Holds a set of changes. @@ -42,7 +44,7 @@ public class ChangeSet { /** * Arbitrary user context information expected to be optionally populated by ChangeLogPrepare. */ - String userContext; + Map userContext; /** * The bean changes. @@ -178,7 +180,10 @@ public class ChangeSet { /** * Return a user context value - anything you set yourself in ChangeLogListener prepare(). */ - public String getUserContext() { + public Map getUserContext() { + if (userContext == null) { + userContext = new LinkedHashMap(); + } return userContext; } @@ -189,7 +194,7 @@ public class ChangeSet { * in the foreground thread. *

*/ - public void setUserContext(String userContext) { + public void setUserContext(Map userContext) { this.userContext = userContext; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilder.java index 14c00bcf4..758db627d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilder.java @@ -67,14 +67,25 @@ public class ChangeJsonBuilder { gen.writeStringField("txnState", changeSet.getTxnState().getCode()); gen.writeNumberField("txnBatch", changeSet.getTxnBatch()); gen.writeNumberField("txnPosition", position); - gen.writeStringField("userId", changeSet.getUserId()); + String source = changeSet.getSource(); + if (source != null) { + gen.writeStringField("source", source); + } + String userId = changeSet.getUserId(); + if (userId != null) { + gen.writeStringField("userId", userId); + } String userIpAddress = changeSet.getUserIpAddress(); if (userIpAddress != null) { gen.writeStringField("userIpAddress", userIpAddress); } - String userContext = changeSet.getUserContext(); - if (userContext != null) { - gen.writeStringField("userContext", userContext); + Map userContext = changeSet.getUserContext(); + if (userContext != null && !userContext.isEmpty()) { + gen.writeObjectFieldStart("userContext"); + for (Map.Entry entry : userContext.entrySet()) { + gen.writeStringField(entry.getKey(), entry.getValue()); + } + gen.writeEndObject(); } } diff --git a/src/test/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilderTest.java b/src/test/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilderTest.java index 68319fe4e..366e8fee7 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilderTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/changelog/ChangeJsonBuilderTest.java @@ -10,6 +10,8 @@ import org.junit.Test; import java.io.StringWriter; import java.util.List; +import static org.assertj.core.api.StrictAssertions.assertThat; + public class ChangeJsonBuilderTest extends BaseTestCase { @@ -22,11 +24,17 @@ public class ChangeJsonBuilderTest extends BaseTestCase { ChangeJsonBuilder builder = new ChangeJsonBuilder(jsonContext); ChangeSet changeSet = helper.createChangeSet("ABCD", 10); + changeSet.getUserContext().put("altUser", "role user"); + List changes = changeSet.getChanges(); for (int i = 0; i < changes.size(); i++) { StringWriter buffer = new StringWriter(); builder.writeBeanJson(buffer, changes.get(i), changeSet, i); System.out.println(buffer.toString()); + assertThat(buffer.toString()).contains("\"source\""); + assertThat(buffer.toString()).contains("\"userId\""); + assertThat(buffer.toString()).contains("\"userIpAddress\""); + assertThat(buffer.toString()).contains("\"userContext\""); } } diff --git a/src/test/java/com/avaje/ebeaninternal/server/changelog/Helper.java b/src/test/java/com/avaje/ebeaninternal/server/changelog/Helper.java index 280759bbe..25d7196c1 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/changelog/Helper.java +++ b/src/test/java/com/avaje/ebeaninternal/server/changelog/Helper.java @@ -24,7 +24,7 @@ public class Helper { cs.setSource("myApp"); cs.setUserId("user234"); cs.setUserIpAddress("123.4.5.6"); - cs.setUserContext("user defined input"); + cs.getUserContext().put("someKey","user defined input"); List changes = cs.getChanges(); diff --git a/src/test/resources/junk.json b/src/test/resources/junk.json index efe1c09ee..02880f9ba 100644 --- a/src/test/resources/junk.json +++ b/src/test/resources/junk.json @@ -1,228 +1,20 @@ -[ - { - "id": 4, - "status": "ACTIVE", - "name": "NocCust", - "billingAddress": { - "id": 5, - "line1": "Bos town", - "city": "Auckland", - "country": { - "code": "NZ", - "name": "New Zealand", - "countryExtra": "extra2" - }, - "billingExtra": "extra1" +{ + "txnId": "ABCD", + "txnState": "C", + "txnBatch": 0, + "txnPosition": 0, + "userId": "user234", + "userIpAddress": "123.4.5.6", + "object": "mytable", + "objectId": "11", + "change": "I", + "eventTime": 1440465178268, + "values": { + "name": { + "new": "rob" }, - "contacts": [ - { - "id": 10, - "firstName": "Jim1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 11, - "firstName": "Fred1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 12, - "firstName": "Bugs1", - "email": null, - "contactExtra": "extra3" - } - ], - "selected": null, - "customerExtra": "extra4", - "startObj": { - "yesno": true - }, - "secObj": { - "yesno": false - }, - "startList": [ - true, - "one", - 1, - 2, - 34.45, - null - ], - "secondList": [ - 3, - "rawVal" - ], - "rawField": { - "ra": 42 - } - }, - { - "id": 3, - "status": "ACTIVE", - "name": "Fiona", - "billingAddress": { - "id": 3, - "line1": "West Coast Rd", - "city": "Auckland", - "country": { - "code": "NZ", - "name": "New Zealand", - "countryExtra": "extra2" - }, - "billingExtra": "extra1" - }, - "contacts": [ - { - "id": 5, - "firstName": "Jim1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 6, - "firstName": "Fred1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 7, - "firstName": "Bugs1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 8, - "firstName": "Fiona", - "email": "black2@test.com", - "contactExtra": "extra3" - }, - { - "id": 9, - "firstName": "Tracy", - "email": "red3@test.com", - "contactExtra": "extra3" - } - ], - "selected": null, - "customerExtra": "extra4", - "startObj": { - "yesno": true - }, - "secObj": { - "yesno": false - }, - "startList": [ - true, - "one", - 1, - 2, - 34.45, - null - ], - "secondList": [ - 3, - "rawVal" - ], - "rawField": { - "ra": 42 - } - }, - { - "id": 2, - "status": "NEW", - "name": "Cust NoAddress", - "billingAddress": null, - "contacts": [ - { - "id": 4, - "firstName": "Jack", - "email": "black1@test.com", - "contactExtra": "extra3" - } - ], - "selected": null, - "customerExtra": "extra4", - "startObj": { - "yesno": true - }, - "secObj": { - "yesno": false - }, - "startList": [ - true, - "one", - 1, - 2, - 34.45, - null - ], - "secondList": [ - 3, - "rawVal" - ], - "rawField": { - "ra": 42 - } - }, - { - "id": 1, - "status": "NEW", - "name": "Rob", - "billingAddress": { - "id": 1, - "line1": "P.O.Box 1234", - "city": "Auckland", - "country": { - "code": "NZ", - "name": "New Zealand", - "countryExtra": "extra2" - }, - "billingExtra": "extra1" - }, - "contacts": [ - { - "id": 1, - "firstName": "Jim1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 2, - "firstName": "Fred1", - "email": null, - "contactExtra": "extra3" - }, - { - "id": 3, - "firstName": "Bugs1", - "email": null, - "contactExtra": "extra3" - } - ], - "selected": null, - "customerExtra": "extra4", - "startObj": { - "yesno": true - }, - "secObj": { - "yesno": false - }, - "startList": [ - true, - "one", - 1, - 2, - 34.45, - null - ], - "secondList": [ - 3, - "rawVal" - ], - "rawField": { - "ra": 42 + "modified": { + "new": 1440465178267 } } -] \ No newline at end of file +}