From 94fb6414fa0bfa2eea88ae306c918914e4fd784f Mon Sep 17 00:00:00 2001 From: rbygrave Date: Thu, 29 Jul 2021 11:28:25 +1200 Subject: [PATCH] Refactor move createMutableHash() method from ScalarType to BeanProperty / BeanPropertyJsonMapper --- .../java/io/ebean/core/type/ScalarType.java | 4 -- .../server/deploy/BeanProperty.java | 4 +- .../server/deploy/BeanPropertyJsonMapper.java | 66 ++++++++++++++++++- .../type/ScalarTypeJsonObjectMapper.java | 65 ------------------ 4 files changed, 67 insertions(+), 72 deletions(-) diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java index 55c8ad9bd..67fc940d7 100644 --- a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java @@ -44,10 +44,6 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData throw new UnsupportedOperationException(); } - default MutableHash createMutableHash(String json) { - throw new UnsupportedOperationException(); - } - /** * Return true if this is a binary type and can not support parse() and format() from/to string. * This allows Ebean to optimise marshalling types to string. 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 99ef307a7..dfcea8094 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 @@ -819,12 +819,12 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { public Object parse(String value) { return scalarType.parse(value); } - + /** * creates a mutableHash for the given JSON value. */ public MutableHash createMutableHash(String json) { - return scalarType.createMutableHash(json); + throw new UnsupportedOperationException(); } /** 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 204b9aac5..38c9ebb9f 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 @@ -4,11 +4,14 @@ import io.ebean.bean.EntityBean; import io.ebean.bean.EntityBeanIntercept; import io.ebean.bean.MutableHash; import io.ebean.core.type.DataReader; +import io.ebean.core.type.ScalarType; import io.ebean.text.TextException; import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; +import io.ebeaninternal.server.util.Md5; import javax.persistence.PersistenceException; import java.sql.SQLException; +import java.util.Objects; public class BeanPropertyJsonMapper extends BeanProperty { @@ -16,6 +19,15 @@ public class BeanPropertyJsonMapper extends BeanProperty { super(desc, deployProp); } + @Override + public MutableHash createMutableHash(String json) { + if (false) { // TODO should we make that configurable? + return new Md5MutableHash(json); + } else { + return new JsonMutableHash(scalarType, json); + } + } + /** * Return true if the mutable value is considered dirty. * This is only used for 'mutable' scalar types like hstore etc. @@ -40,7 +52,7 @@ public class BeanPropertyJsonMapper extends BeanProperty { setValue(bean, value); String json = reader.popJson(); if (json != null) { - final MutableHash hash = scalarType.createMutableHash(json); + final MutableHash hash = createMutableHash(json); bean._ebean_getIntercept().mutableHash(propertyIndex, hash); } } @@ -51,4 +63,56 @@ public class BeanPropertyJsonMapper extends BeanProperty { throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); } } + + private static class Md5MutableHash implements MutableHash { + + private final String md5; + + Md5MutableHash(String json) { + md5 = Md5.hash(json); + } + + @Override + public boolean isEqualToObject(Object obj) { + return true; // we cannot determine differences... + } + + @Override + public boolean isEqualToJson(String json) { + return Md5.hash(json).equals(md5); + } + + @Override + public Object get() { + return null; // cannot create object from json + } + + } + + private static class JsonMutableHash implements MutableHash { + + private final String originalJson; + private ScalarType parent; + + JsonMutableHash(ScalarType parent, String json) { + this.parent = parent; + originalJson = json; + } + + @Override + public boolean isEqualToObject(Object obj) { + return isEqualToJson(parent.format(obj)); + } + + @Override + public boolean isEqualToJson(String json) { + return Objects.equals(originalJson, json); + } + + @Override + public Object get() { + return parent.parse(originalJson); + } + + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java index 0012c4cd6..e14b1aca9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java @@ -51,59 +51,7 @@ class ScalarTypeJsonObjectMapper { } return new GenericObject(jsonManager, field, dbType, type); } - - private static class Md5MutableHash implements MutableHash { - private final String md5; - - Md5MutableHash(String json) { - md5 = Md5.hash(json); - } - - @Override - public boolean isEqualToObject(Object obj) { - return true; // we cannot determine differences... - } - - @Override - public boolean isEqualToJson(String json) { - return Md5.hash(json).equals(md5); - } - - @Override - public Object get() { - return null; // cannot create object from json - } - - } - - private static class JsonMutableHash implements MutableHash { - - private final String originalJson; - private ScalarType parent; - - JsonMutableHash(ScalarType parent, String json) { - this.parent = parent; - originalJson = json; - } - - @Override - public boolean isEqualToObject(Object obj) { - return isEqualToJson(parent.format(obj)); - } - - @Override - public boolean isEqualToJson(String json) { - return Objects.equals(originalJson, json); - } - - @Override - public Object get() { - return parent.parse(originalJson); - } - - } - /** * Maps any type (Object) using Jackson ObjectMapper. */ @@ -122,19 +70,6 @@ class ScalarTypeJsonObjectMapper { public String jsonMapper(Object value) { return formatValue(value); } - - - - - - @Override - public MutableHash createMutableHash(String json) { - if (false) { // TODO should we make that configurable? - return new Md5MutableHash(json); - } else { - return new JsonMutableHash(this, json); - } - } @Override public Object read(DataReader reader) throws SQLException {