From 5a6cdb9a86da28afabf708f021e352373325f104 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Wed, 18 Jul 2018 06:33:36 +0200 Subject: [PATCH] FIX: null handling in ScalarType.toBeanType (#1455) --- .../server/type/ScalarTypeChar.java | 1 + .../server/type/ScalarTypeCharArray.java | 1 + .../server/type/ScalarTypeDuration.java | 1 + .../type/ScalarTypeDurationWithNanos.java | 1 + .../server/type/ScalarTypeInstant.java | 4 +- .../server/type/ScalarTypeLocalDateTime.java | 4 +- .../server/type/ScalarTypeOffsetDateTime.java | 4 +- .../server/type/ScalarTypeYear.java | 1 + .../server/type/ScalarTypeYearMonthDate.java | 1 + .../server/type/ScalarTypeZonedDateTime.java | 4 +- .../java/org/tests/types/TestNewTypes.java | 93 ++++++++++++++++++- 11 files changed, 104 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java index 5fd8a1c5d..bc43726ba 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java @@ -51,6 +51,7 @@ public class ScalarTypeChar extends ScalarTypeBaseVarchar { @Override public Character toBeanType(Object value) { + if (value == null) return null; String s = BasicTypeConverter.toString(value); return s.charAt(0); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java index f966a2ff9..da7789a37 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java @@ -54,6 +54,7 @@ public class ScalarTypeCharArray extends ScalarTypeBaseVarchar { @Override public char[] toBeanType(Object value) { + if (value == null) return null; String s = BasicTypeConverter.toString(value); return s.toCharArray(); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java index 778435676..93cca744c 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java @@ -59,6 +59,7 @@ public class ScalarTypeDuration extends ScalarTypeBase { @Override public Duration toBeanType(Object value) { if (value instanceof Duration) return (Duration) value; + if (value == null) return null; return Duration.ofSeconds(BasicTypeConverter.toLong(value)); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java index 1961a5fb7..3289f4b64 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java @@ -42,6 +42,7 @@ public class ScalarTypeDurationWithNanos extends ScalarTypeDuration { @Override public Duration toBeanType(Object value) { if (value instanceof Duration) return (Duration) value; + if (value == null) return null; return convertFromBigDecimal(BasicTypeConverter.toBigDecimal(value)); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java index a5d7c0c2a..3b98929ce 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java @@ -53,7 +53,7 @@ public class ScalarTypeInstant extends ScalarTypeBaseDateTime { @Override public Instant toBeanType(Object value) { - if (value instanceof Instant) return (Instant) value; - return convertFromTimestamp((Timestamp) value); + if (value instanceof Timestamp) return convertFromTimestamp((Timestamp) value); + return (Instant) value; } } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java index 46c38cdaa..05a6f1a2f 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java @@ -54,7 +54,7 @@ public class ScalarTypeLocalDateTime extends ScalarTypeBaseDateTime { @Override public Year toBeanType(Object value) { if (value instanceof Year) return (Year) value; + if (value == null) return null; return Year.of(BasicTypeConverter.toInteger(value)); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeYearMonthDate.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeYearMonthDate.java index 0feff27e0..175fd6be9 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeYearMonthDate.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeYearMonthDate.java @@ -61,6 +61,7 @@ public class ScalarTypeYearMonthDate extends ScalarTypeBaseDate { public YearMonth toBeanType(Object value) { if (value instanceof YearMonth) return (YearMonth) value; if (value instanceof LocalDate) return fromLocalDate((LocalDate) value); + if (value == null) return null; return fromLocalDate(BasicTypeConverter.toDate(value).toLocalDate()); } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeZonedDateTime.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeZonedDateTime.java index 67f08f880..d580f563b 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeZonedDateTime.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeZonedDateTime.java @@ -55,7 +55,7 @@ public class ScalarTypeZonedDateTime extends ScalarTypeBaseDateTime beanType = Ebean.getDefaultServer().getPluginApi().getBeanType(SomeNewTypesBean.class); + ExpressionPath localDate = beanType.getExpressionPath("localDate"); + ExpressionPath localDateTime = beanType.getExpressionPath("localDateTime"); + ExpressionPath offsetDateTime = beanType.getExpressionPath("offsetDateTime"); + ExpressionPath zonedDateTime = beanType.getExpressionPath("zonedDateTime"); + ExpressionPath instant = beanType.getExpressionPath("instant"); + ExpressionPath year = beanType.getExpressionPath("year"); + ExpressionPath month = beanType.getExpressionPath("month"); + ExpressionPath dayOfWeek = beanType.getExpressionPath("dayOfWeek"); + ExpressionPath zoneId = beanType.getExpressionPath("zoneId"); + ExpressionPath zoneOffset = beanType.getExpressionPath("zoneOffset"); + ExpressionPath yearMonth = beanType.getExpressionPath("yearMonth"); + ExpressionPath path = beanType.getExpressionPath("path"); + ExpressionPath period = beanType.getExpressionPath("period"); + + localDate.pathSet(testBean, refBean.getLocalDate()); + assertThat(localDate.pathGet(testBean)).isEqualTo(refBean.getLocalDate()); + + localDateTime.pathSet(testBean, refBean.getLocalDateTime()); + assertThat(localDateTime.pathGet(testBean)).isEqualTo(refBean.getLocalDateTime()); + + offsetDateTime.pathSet(testBean, refBean.getOffsetDateTime()); + assertThat(offsetDateTime.pathGet(testBean)).isEqualTo(refBean.getOffsetDateTime()); + + zonedDateTime.pathSet(testBean, refBean.getZonedDateTime()); + assertThat(zonedDateTime.pathGet(testBean)).isEqualTo(refBean.getZonedDateTime()); + + instant.pathSet(testBean, refBean.getInstant()); + assertThat(instant.pathGet(testBean)).isEqualTo(refBean.getInstant()); + + year.pathSet(testBean, refBean.getYear()); + assertThat(year.pathGet(testBean)).isEqualTo(refBean.getYear()); + + month.pathSet(testBean, refBean.getMonth()); + assertThat(month.pathGet(testBean)).isEqualTo(refBean.getMonth()); + + dayOfWeek.pathSet(testBean, refBean.getDayOfWeek()); + assertThat(dayOfWeek.pathGet(testBean)).isEqualTo(refBean.getDayOfWeek()); + + zoneId.pathSet(testBean, refBean.getZoneId()); + assertThat(zoneId.pathGet(testBean)).isEqualTo(refBean.getZoneId()); + + zoneOffset.pathSet(testBean, refBean.getZoneOffset()); + assertThat(zoneOffset.pathGet(testBean)).isEqualTo(refBean.getZoneOffset()); + + yearMonth.pathSet(testBean, refBean.getYearMonth()); + assertThat(yearMonth.pathGet(testBean)).isEqualTo(refBean.getYearMonth()); + + path.pathSet(testBean, refBean.getPath()); + assertThat(path.pathGet(testBean)).isEqualTo(refBean.getPath()); + + period.pathSet(testBean, refBean.getPeriod()); + assertThat(period.pathGet(testBean)).isEqualTo(refBean.getPeriod()); + + Ebean.save(refBean); + Ebean.save(testBean); + } + }