mirror of
https://github.com/ebean-orm/ebean.git
synced 2026-10-24 10:38:57 +00:00
#1145 - Refactor @ChangeLog based on JSON documents for 'new values' and 'old values'
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+23
-19
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user