#1145 - Refactor @ChangeLog based on JSON documents for 'new values' and 'old values'

This commit is contained in:
rob bygrave
2017-10-03 01:31:37 +13:00
parent daf3d97266
commit 368d22baa6
35 changed files with 743 additions and 503 deletions
@@ -735,6 +735,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer {
return null;
}
@Override
public SpiJsonContext jsonExtended() {
return null;
}
@Override
public int saveAll(Collection<?> beans) throws OptimisticLockException {
return 0;
@@ -29,7 +29,7 @@ public class ChangeJsonBuilderTest extends BaseTestCase {
List<BeanChange> changes = changeSet.getChanges();
for (int i = 0; i < changes.size(); i++) {
StringWriter buffer = new StringWriter();
builder.writeBeanJson(buffer, changes.get(i), changeSet, i);
builder.writeBeanJson(buffer, changes.get(i), changeSet);
assertThat(buffer.toString()).contains("\"source\"");
assertThat(buffer.toString()).contains("\"userId\"");
@@ -1,6 +1,5 @@
package io.ebeaninternal.server.changelog;
import io.ebean.ValuePair;
import io.ebean.event.changelog.BeanChange;
import io.ebean.event.changelog.ChangeSet;
import io.ebean.event.changelog.ChangeType;
@@ -8,7 +7,6 @@ import io.ebean.event.changelog.TxnState;
import org.jetbrains.annotations.NotNull;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -37,32 +35,40 @@ public class Helper {
@NotNull
private BeanChange createInsert(long startId) {
Map<String, ValuePair> values = new LinkedHashMap<>();
values.put("name", new ValuePair("rob", null));
values.put("modified", new ValuePair(new Timestamp(System.currentTimeMillis()), null));
BeanChange bean = new BeanChange("mytable", null, startId + 1, ChangeType.INSERT, null);
bean.setValues(values);
return bean;
Map<String, Object> values = new LinkedHashMap<>();
values.put("name", "rob");
values.put("modified", new Timestamp(System.currentTimeMillis()));
Map<String, Object> oldValues = new LinkedHashMap<>();
oldValues.put("name", "rob");
oldValues.put("modified", new Timestamp(System.currentTimeMillis() - 100000));
return new BeanChange("mytable", null, startId + 1, ChangeType.INSERT, "");//values, oldValues);
}
@NotNull
private BeanChange createUpdate(long startId) {
Map<String, ValuePair> values = new LinkedHashMap<>();
values.put("name", new ValuePair("jim", "steve"));
values.put("nowHasVal", new ValuePair("wasNull", null));
values.put("nowNull", new ValuePair(null, "hadVal"));
Map<String, Object> values = new LinkedHashMap<>();
values.put("name", "jim");
values.put("nowHasVal", "wasNull");
values.put("nowNull", null);
values.put("modified", new Timestamp(System.currentTimeMillis()));
values.put("modified", new ValuePair(new Timestamp(System.currentTimeMillis()), null));
BeanChange bean = new BeanChange("mytable", null, startId + 2, ChangeType.UPDATE, null);
bean.setValues(values);
return bean;
Map<String, Object> oldValues = new LinkedHashMap<>();
oldValues.put("name", "steve");
oldValues.put("nowHasVal", null);
oldValues.put("nowNull", "hadVal");
oldValues.put("modified", new Timestamp(System.currentTimeMillis() - 100000));
return new BeanChange("mytable", null, startId + 2, ChangeType.UPDATE, "");//values, oldValues);
}
@NotNull
private BeanChange createDelete(long startId) {
return new BeanChange("mytable", null, startId + 3, ChangeType.DELETE, new HashMap<>());
return new BeanChange("mytable", null, startId + 3, ChangeType.DELETE, null);
}
}
@@ -1,105 +0,0 @@
package io.ebeaninternal.server.core;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.ValuePair;
import io.ebean.bean.EntityBean;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import org.tests.model.embedded.EMain;
import org.tests.model.embedded.Eembeddable;
import org.junit.Test;
import java.util.Map;
import static org.junit.Assert.*;
public class TestDiffHelpInsertWithEmbedded extends BaseTestCase {
EbeanServer server;
BeanDescriptor<EMain> emainDesc;
public TestDiffHelpInsertWithEmbedded() {
server = Ebean.getServer(null);
SpiEbeanServer spiServer = (SpiEbeanServer) server;
emainDesc = spiServer.getBeanDescriptor(EMain.class);
}
@Test
public void simple() {
EMain emain1 = createEMain();
Map<String, ValuePair> diff = emainDesc.diffForInsert((EntityBean) emain1);
assertEquals(3, diff.size());
assertEquals("foo", diff.get("name").getNewValue());
assertEquals(13L, diff.get("version").getNewValue());
ValuePair valuePair = diff.get("embeddable.description");
assertNotNull(valuePair);
assertEquals("bar", valuePair.getNewValue());
assertNull(valuePair.getOldValue());
}
@Test
public void scalarPropertyAsNull() {
EMain emain1 = createEMain();
emain1.setName(null);
Map<String, ValuePair> diff = emainDesc.diffForInsert((EntityBean) emain1);
assertEquals(2, diff.size());
assertNull(diff.get("name"));
assertEquals(13L, diff.get("version").getNewValue());
ValuePair valuePair = diff.get("embeddable.description");
assertNotNull(valuePair);
assertEquals("bar", valuePair.getNewValue());
assertNull(valuePair.getOldValue());
}
@Test
public void embeddedAsNull() {
EMain emain1 = createEMain();
emain1.setEmbeddable(null);
Map<String, ValuePair> diff = emainDesc.diffForInsert((EntityBean) emain1);
assertEquals(2, diff.size());
assertEquals("foo", diff.get("name").getNewValue());
assertEquals(13L, diff.get("version").getNewValue());
assertNull(diff.get("embeddable.description"));
}
@Test
public void embeddedPropertiesAsNull() {
EMain emain1 = createEMain();
emain1.getEmbeddable().setDescription(null);
Map<String, ValuePair> diff = emainDesc.diffForInsert((EntityBean) emain1);
assertEquals(2, diff.size());
assertEquals("foo", diff.get("name").getNewValue());
assertEquals(13L, diff.get("version").getNewValue());
assertNull(diff.get("embeddable.description"));
}
private EMain createEMain() {
EMain emain = new EMain();
emain.setName("foo");
emain.setVersion(13l);
Eembeddable embeddable = new Eembeddable();
embeddable.setDescription("bar");
emain.setEmbeddable(embeddable);
return emain;
}
}
@@ -1,31 +1,31 @@
package io.ebeaninternal.server.core;
package io.ebeaninternal.server.deploy;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.ValuePair;
import io.ebean.bean.EntityBean;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.text.json.SpiJsonWriter;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import org.tests.model.basic.Order.Status;
import org.junit.Test;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.assertThat;
public class TestDiffHelpInsertSimple extends BaseTestCase {
long firstTime = System.currentTimeMillis() - 10000;
private long firstTime = System.currentTimeMillis() - 10000;
EbeanServer server;
private EbeanServer server;
BeanDescriptor<Order> orderDesc;
private BeanDescriptor<Order> orderDesc;
public TestDiffHelpInsertSimple() {
server = Ebean.getServer(null);
@@ -45,20 +45,24 @@ public class TestDiffHelpInsertSimple extends BaseTestCase {
}
@Test
public void basic() {
public void basic() throws IOException {
Date date = Date.valueOf("2000-01-01");
Order order1 = createBaseOrder(server);
order1.setOrderDate(date);
Map<String, ValuePair> diff = orderDesc.diffForInsert((EntityBean) order1);
StringWriter buffer = new StringWriter();
assertEquals(4, diff.size());
SpiJsonWriter jsonWriter = spiEbeanServer().jsonExtended().createJsonWriter(buffer);
Set<String> keySet = diff.keySet();
assertTrue(keySet.contains("cretime"));
assertTrue(keySet.contains("status"));
assertTrue(keySet.contains("orderDate"));
assertTrue(keySet.contains("customer.id"));
assertFalse(keySet.contains("shipDate"));
orderDesc.jsonWriteForInsert(jsonWriter, (EntityBean) order1);
jsonWriter.gen().flush();
String asJson = buffer.toString();
assertThat(asJson).startsWith("{\"status\":\"NEW\",\"orderDate\":946638000000,\"cretime\":");
assertThat(asJson).endsWith(",\"customer\":{\"id\":1234}}");
}
}
@@ -0,0 +1,100 @@
package io.ebeaninternal.server.deploy;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.bean.EntityBean;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.text.json.SpiJsonWriter;
import org.junit.Test;
import org.tests.model.embedded.EMain;
import org.tests.model.embedded.Eembeddable;
import java.io.IOException;
import java.io.StringWriter;
import static org.assertj.core.api.Assertions.assertThat;
public class TestDiffHelpInsertWithEmbedded extends BaseTestCase {
private EbeanServer server;
private BeanDescriptor<EMain> emainDesc;
public TestDiffHelpInsertWithEmbedded() {
server = Ebean.getServer(null);
SpiEbeanServer spiServer = (SpiEbeanServer) server;
emainDesc = spiServer.getBeanDescriptor(EMain.class);
}
@Test
@SuppressWarnings("unchecked")
public void simple() throws IOException {
EMain emain1 = createEMain();
String asJson = asInsertJson((EntityBean) emain1);
assertThat(asJson).contains("{\"name\":\"foo\",\"version\":13,\"embeddable\":{\"description\":\"bar\"}}");
}
private String asInsertJson(EntityBean emain1) throws IOException {
StringWriter buffer = new StringWriter();
SpiJsonWriter jsonWriter = spiEbeanServer().jsonExtended().createJsonWriter(buffer);
emainDesc.jsonWriteForInsert(jsonWriter, emain1);
jsonWriter.gen().flush();
return buffer.toString();
}
@Test
public void scalarPropertyAsNull() throws IOException {
EMain emain1 = createEMain();
emain1.setName(null);
String asJson = asInsertJson((EntityBean) emain1);
assertThat(asJson).contains("{\"version\":13,\"embeddable\":{\"description\":\"bar\"}}");
}
@Test
public void embeddedAsNull() throws IOException {
EMain emain1 = createEMain();
emain1.setEmbeddable(null);
String asJson = asInsertJson((EntityBean) emain1);
assertThat(asJson).contains("{\"name\":\"foo\",\"version\":13}");
}
@Test
public void embeddedPropertiesAsNull() throws IOException {
EMain emain1 = createEMain();
emain1.getEmbeddable().setDescription(null);
String asJson = asInsertJson((EntityBean) emain1);
assertThat(asJson).contains("{\"name\":\"foo\",\"version\":13,\"embeddable\":{}}");
}
private EMain createEMain() {
EMain emain = new EMain();
emain.setName("foo");
emain.setVersion(13l);
Eembeddable embeddable = new Eembeddable();
embeddable.setDescription("bar");
emain.setEmbeddable(embeddable);
return emain;
}
}
@@ -0,0 +1,22 @@
package org.tests.changelog;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import org.junit.Test;
import org.tests.model.basic.EBasicChangeLog;
public class TestChangeLogInt extends BaseTestCase {
@Test
public void test() {
EBasicChangeLog bean3 = new EBasicChangeLog();
bean3.setName("bean3");
bean3.setShortDescription("bean3 hi");
Ebean.save(bean3);
bean3.setName("mod bean3");
bean3.setShortDescription("update bean3");
Ebean.save(bean3);
}
}