From d601a88d827cafdfaa879060e882df1b01370ee4 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Fri, 30 Jul 2021 23:53:28 +1200 Subject: [PATCH] #2278 - Move null to empty json collections check to BeanPropertyJsonBasic --- .../server/deploy/BeanProperty.java | 14 ----- .../server/deploy/BeanPropertyJsonBasic.java | 58 +++++++++++++++++++ .../server/deploy/BeanPropertyJsonMapper.java | 2 +- .../deploy/meta/DeployBeanProperty.java | 6 +- .../deploy/meta/DeployBeanPropertyLists.java | 3 + .../server/deploy/parse/DeployUtil.java | 3 - .../org/tests/model/embedded/EAddress.java | 12 ++++ .../model/json/EBasicJsonMapVarchar.java | 2 +- .../nativesql/TestNativeWithEmbedded.java | 8 ++- 9 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java index ad054c59b8..413d0b4602 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java @@ -625,27 +625,13 @@ public Object read(DataReader reader) throws SQLException { return scalarType.read(reader); } - protected Object checkForEmpty(EntityBean bean) { - final Object value = getValue(bean); - if (value instanceof Collection && ((Collection) value).isEmpty() - || value instanceof Map && ((Map) value).isEmpty()) { - return value; - } - return null; - } - public Object readSet(DataReader reader, EntityBean bean) throws SQLException { try { Object value = scalarType.read(reader); - if (value == null) { - value = checkForEmpty(bean); - } if (bean != null) { setValue(bean, value); } return value; - } catch (TextException e) { - throw e; } catch (Exception e) { throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java new file mode 100644 index 0000000000..6593186a62 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java @@ -0,0 +1,58 @@ +package io.ebeaninternal.server.deploy; + +import io.ebean.bean.EntityBean; +import io.ebean.core.type.DataReader; +import io.ebean.text.TextException; +import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; + +import javax.persistence.PersistenceException; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Map; + +/** + * A DbJson property that does not use Jackson ObjectMapper. + */ +public class BeanPropertyJsonBasic extends BeanProperty { + + public BeanPropertyJsonBasic(BeanDescriptor descriptor, DeployBeanProperty deploy) { + super(descriptor, deploy); + } + + protected BeanPropertyJsonBasic(BeanProperty source, BeanPropertyOverride override) { + super(source, override); + } + + @Override + public BeanProperty override(BeanPropertyOverride override) { + return new BeanPropertyJsonBasic(this, override); + } + + protected Object checkForEmpty(EntityBean bean) { + final Object value = getValue(bean); + if (value instanceof Collection && ((Collection) value).isEmpty() + || value instanceof Map && ((Map) value).isEmpty()) { + return value; + } + return null; + } + + @Override + public Object readSet(DataReader reader, EntityBean bean) throws SQLException { + try { + Object value = scalarType.read(reader); + if (value == null) { + value = checkForEmpty(bean); + } + if (bean != null) { + setValue(bean, value); + } + return value; + } catch (TextException e) { + throw e; + } catch (Exception e) { + throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); + } + } + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java index bc13b1a8b9..fdea2e4495 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java @@ -18,7 +18,7 @@ /** * Handle json property with MutationDetection of SOURCE or HASH only. */ -public class BeanPropertyJsonMapper extends BeanProperty { +public class BeanPropertyJsonMapper extends BeanPropertyJsonBasic { private final boolean sourceDetection; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java index 3da06d5596..5e5455b2f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java @@ -316,9 +316,6 @@ public void setJsonDeserialize(boolean jsonDeserialize) { } public MutationDetection getMutationDetection() { - if (mutationDetection == null) { - mutationDetection = MutationDetection.DEFAULT; - } return mutationDetection; } @@ -1204,4 +1201,7 @@ boolean isJsonMapper() { return scalarType != null && scalarType.isJsonMapper(); } + boolean isJsonType() { + return mutationDetection != null; + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java index 90503c93f4..5466d5bca9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java @@ -453,6 +453,9 @@ private BeanProperty createBeanProperty(BeanDescriptorMap owner, DeployBeanPrope if (deployProp.isJsonMapper()) { return new BeanPropertyJsonMapper(desc, deployProp); } + if (deployProp.isJsonType()) { + return new BeanPropertyJsonBasic(desc, deployProp); + } return new BeanProperty(desc, deployProp); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java index 0792c66d55..68cb1c741f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java @@ -205,9 +205,6 @@ void setDbArray(DeployBeanProperty prop, DbArray dbArray) { } } - /** - * This property is marked as a Lob object. - */ void setDbJsonType(DeployBeanProperty prop, DbJson dbJsonType) { int dbType = getDbJsonStorage(dbJsonType.storage()); setDbJsonType(prop, dbType, dbJsonType.length(), dbJsonType.mutationDetection()); diff --git a/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java b/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java index 3563990056..4b737f0f55 100644 --- a/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java +++ b/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java @@ -7,6 +7,7 @@ import javax.persistence.Embeddable; import javax.persistence.EnumType; import javax.persistence.Enumerated; +import java.util.Map; @Embeddable public class EAddress { @@ -24,6 +25,9 @@ public class EAddress { @DbJson PlainBean jbean; + @DbJson + Map jraw; + public String getStreet() { return street; } @@ -56,6 +60,14 @@ public void setJbean(PlainBean jbean) { this.jbean = jbean; } + public Map getJraw() { + return jraw; + } + + public void setJraw(Map jraw) { + this.jraw = jraw; + } + public EAddressStatus getStatus() { return status; } diff --git a/ebean-core/src/test/java/org/tests/model/json/EBasicJsonMapVarchar.java b/ebean-core/src/test/java/org/tests/model/json/EBasicJsonMapVarchar.java index c08c4e9fe1..2b470ef45c 100644 --- a/ebean-core/src/test/java/org/tests/model/json/EBasicJsonMapVarchar.java +++ b/ebean-core/src/test/java/org/tests/model/json/EBasicJsonMapVarchar.java @@ -20,7 +20,7 @@ public class EBasicJsonMapVarchar { String name; @DbJson(storage = DbJsonType.VARCHAR)//, length = 2200) - Map content; + Map content; public Long getId() { return id; diff --git a/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java b/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java index 09084ccc20..39f63c31bf 100644 --- a/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java +++ b/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java @@ -9,7 +9,9 @@ import org.tests.model.embedded.EPerson; import org.tests.model.json.PlainBean; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -18,17 +20,20 @@ public class TestNativeWithEmbedded extends BaseTestCase { @Test public void test() { + Map rawMap = new LinkedHashMap<>(); + rawMap.put("a","1"); EPerson person = new EPerson(); person.setName("Frank"); EAddress address = new EAddress(); address.setStreet("1 foo st"); address.setCity("barv"); address.setJbean(new PlainBean("hi", 3)); + address.setJraw(rawMap); person.setAddress(address); DB.save(person); - String sql = "select id, name, street, suburb, addr_city, addr_status, addr_jbean from eperson where id = ?"; + String sql = "select id, name, street, suburb, addr_city, addr_status, addr_jbean, jraw from eperson where id = ?"; LoggedSqlCollector.start(); @@ -39,6 +44,7 @@ public void test() { assertThat(one.getName()).isEqualTo("Frank"); assertThat(one.getAddress().getStreet()).isEqualTo("1 foo st"); assertThat(one.getAddress().getJbean().getName()).isEqualTo("hi"); + assertThat(one.getAddress().getJraw().get("a")).isEqualTo("1"); List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1);