From 9da5ce01a73b2b16e678d30318f55309e34e60a3 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Fri, 29 Apr 2016 22:22:38 +1200 Subject: [PATCH] #686 - Trouble with non-standard java.sql.Date values caching in 7.8.1. --- .../server/type/ScalarTypeBaseDate.java | 13 ++++++++--- .../cache/CachedBeanDataFromBeanTest.java | 6 +++++ .../server/type/ScalarTypeDateTest.java | 22 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeDateTest.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java index d50079b16..8a213d464 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java @@ -52,12 +52,19 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase { public String formatValue(T t) { Date date = convertToDate(t); - return date.toString(); + // format all dates into epoch millis + long epochMillis = date.getTime(); + return Long.toString(epochMillis); } public T parse(String value) { - Date date = Date.valueOf(value); - return convertFromDate(date); + try { + long epochMillis = Long.parseLong(value); + return convertFromDate(new Date(epochMillis)); + } catch (NumberFormatException e) { + Date date = Date.valueOf(value); + return convertFromDate(date); + } } public T convertFromMillis(long systemTimeMillis) { diff --git a/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java b/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java index 1bb294fc5..c208b2fcd 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java @@ -10,6 +10,8 @@ import com.avaje.tests.model.basic.Car; import com.avaje.tests.model.basic.Customer; import org.junit.Test; +import java.sql.Date; + import static org.junit.Assert.assertEquals; public class CachedBeanDataFromBeanTest extends BaseTestCase { @@ -21,9 +23,12 @@ public class CachedBeanDataFromBeanTest extends BaseTestCase { BeanDescriptor desc = server.getBeanDescriptor(Customer.class); + Date largeDate = new Date(9223372036825200000L); + Customer customer = new Customer(); customer.setId(42); customer.setName("Rob"); + customer.setAnniversary(largeDate); Address billingAddress = new Address(); billingAddress.setId(Short.valueOf("12")); @@ -36,6 +41,7 @@ public class CachedBeanDataFromBeanTest extends BaseTestCase { assertEquals(cacheData.getData("id"), "42"); assertEquals(cacheData.getData("name"), "Rob"); assertEquals(cacheData.getData("billingAddress"), "12"); + assertEquals(cacheData.getData("anniversary"), "9223372036825200000"); } diff --git a/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeDateTest.java b/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeDateTest.java new file mode 100644 index 000000000..4742b8e17 --- /dev/null +++ b/src/test/java/com/avaje/ebeaninternal/server/type/ScalarTypeDateTest.java @@ -0,0 +1,22 @@ +package com.avaje.ebeaninternal.server.type; + +import org.junit.Test; + +import java.sql.Date; + +import static org.junit.Assert.*; + +public class ScalarTypeDateTest { + + ScalarTypeDate type = new ScalarTypeDate(); + + @Test + public void formatParse_PG_DATE_POSITIVE_INFINITY() { + + Date postgresInfinityDate = new Date(9223372036825200000L); + + String format = type.formatValue(postgresInfinityDate); + Date parsed = type.parse(format); + assertEquals(parsed, postgresInfinityDate); + } +} \ No newline at end of file