#2278 - Move null to empty json collections check to BeanPropertyJsonBasic

This commit is contained in:
rbygrave
2021-07-30 23:53:28 +12:00
parent 443e826f61
commit d601a88d82
9 changed files with 85 additions and 23 deletions
@@ -625,27 +625,13 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty {
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);
}
@@ -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);
}
}
}
@@ -18,7 +18,7 @@ import java.util.Objects;
/**
* Handle json property with MutationDetection of SOURCE or HASH only.
*/
public class BeanPropertyJsonMapper extends BeanProperty {
public class BeanPropertyJsonMapper extends BeanPropertyJsonBasic {
private final boolean sourceDetection;
@@ -316,9 +316,6 @@ public class DeployBeanProperty {
}
public MutationDetection getMutationDetection() {
if (mutationDetection == null) {
mutationDetection = MutationDetection.DEFAULT;
}
return mutationDetection;
}
@@ -1204,4 +1201,7 @@ public class DeployBeanProperty {
return scalarType != null && scalarType.isJsonMapper();
}
boolean isJsonType() {
return mutationDetection != null;
}
}
@@ -453,6 +453,9 @@ public class DeployBeanPropertyLists {
if (deployProp.isJsonMapper()) {
return new BeanPropertyJsonMapper(desc, deployProp);
}
if (deployProp.isJsonType()) {
return new BeanPropertyJsonBasic(desc, deployProp);
}
return new BeanProperty(desc, deployProp);
}
@@ -205,9 +205,6 @@ public class DeployUtil {
}
}
/**
* 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());