diff --git a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index 369928843..6bdb05661 100644 --- a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -838,6 +838,7 @@ public final class DefaultTypeManager implements TypeManager { if (config.getClassLoadConfig().isJavaTimePresent()) { logger.debug("Registering java.time data types"); + typeMap.put(java.time.Period.class, new ScalarTypePeriod()); typeMap.put(java.time.LocalDate.class, new ScalarTypeLocalDate()); typeMap.put(java.time.LocalDateTime.class, new ScalarTypeLocalDateTime(mode)); typeMap.put(OffsetDateTime.class, new ScalarTypeOffsetDateTime(mode)); diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java new file mode 100644 index 000000000..573ba6e5c --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java @@ -0,0 +1,39 @@ +package io.ebeaninternal.server.type; + +import java.time.Period; + +/** + * ScalarType for Joda Period stored as DB VARCHAR + */ +public class ScalarTypePeriod extends ScalarTypeBaseVarchar { + + public ScalarTypePeriod() { + super(Period.class); + } + + @Override + public int getLength() { + return 20; + } + + @Override + public String formatValue(Period v) { + return v.toString(); + } + + @Override + public Period parse(String value) { + return Period.parse(value); + } + + @Override + public Period convertFromDbString(String dbValue) { + return Period.parse(dbValue); + } + + @Override + public String convertToDbString(Period beanValue) { + return beanValue.toString(); + } + +} diff --git a/src/test/java/io/ebeaninternal/server/type/ScalarTypePeriodTest.java b/src/test/java/io/ebeaninternal/server/type/ScalarTypePeriodTest.java new file mode 100644 index 000000000..858c2d10d --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/type/ScalarTypePeriodTest.java @@ -0,0 +1,42 @@ +package io.ebeaninternal.server.type; + +import org.junit.Test; + +import java.time.Period; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScalarTypePeriodTest { + + private ScalarTypePeriod scalarType = new ScalarTypePeriod(); + + @Test + public void getLength() { + assertThat(scalarType.getLength()).isEqualTo(20); + } + + @Test + public void formatAndParse() { + + Period original = Period.of(1,2, 4); + + String value = scalarType.formatValue(original); + assertThat(value).isEqualTo("P1Y2M4D"); + + Period period = scalarType.parse(value); + assertThat(period).isEqualTo(original); + } + + + @Test + public void convertFromDbString() { + + Period original = Period.of(1, 2, 4); + + String stringVal = scalarType.convertToDbString(original); + Period period = scalarType.convertFromDbString(stringVal); + + assertThat(period).isEqualTo(original); + } + +} diff --git a/src/test/java/org/tests/model/types/SomeNewTypesBean.java b/src/test/java/org/tests/model/types/SomeNewTypesBean.java index 3374615b2..64f0a2220 100644 --- a/src/test/java/org/tests/model/types/SomeNewTypesBean.java +++ b/src/test/java/org/tests/model/types/SomeNewTypesBean.java @@ -11,6 +11,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.time.OffsetDateTime; +import java.time.Period; import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; @@ -54,6 +55,8 @@ public class SomeNewTypesBean { Path path; + Period period; + public Long getId() { return id; } @@ -165,4 +168,12 @@ public class SomeNewTypesBean { public void setPath(Path path) { this.path = path; } + + public Period getPeriod() { + return period; + } + + public void setPeriod(Period period) { + this.period = period; + } } diff --git a/src/test/java/org/tests/types/TestNewTypes.java b/src/test/java/org/tests/types/TestNewTypes.java index a08c03b93..de34a2d71 100644 --- a/src/test/java/org/tests/types/TestNewTypes.java +++ b/src/test/java/org/tests/types/TestNewTypes.java @@ -2,11 +2,10 @@ package org.tests.types; import io.ebean.BaseTestCase; import io.ebean.Ebean; -import org.tests.model.types.SomeNewTypesBean; import org.junit.Test; +import org.tests.model.types.SomeNewTypesBean; import java.io.File; -import java.io.IOException; import java.nio.file.Paths; import java.time.DayOfWeek; import java.time.Instant; @@ -14,20 +13,23 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.time.OffsetDateTime; +import java.time.Period; import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class TestNewTypes extends BaseTestCase { private static final String TEMP_PATH = new File("/tmp").getAbsolutePath(); @Test - public void testInsertUpdate() throws IOException, InterruptedException { + public void testInsertUpdate() throws InterruptedException { SomeNewTypesBean bean = new SomeNewTypesBean(); bean.setLocalDate(LocalDate.now()); bean.setLocalDateTime(LocalDateTime.now()); @@ -41,6 +43,7 @@ public class TestNewTypes extends BaseTestCase { bean.setZoneOffset(ZonedDateTime.now().getOffset()); bean.setYearMonth(YearMonth.of(2014, 9)); bean.setPath(Paths.get(TEMP_PATH)); + bean.setPeriod(Period.of(4,3,2)); Ebean.save(bean); @@ -83,6 +86,9 @@ public class TestNewTypes extends BaseTestCase { list = Ebean.find(SomeNewTypesBean.class).where().eq("path", Paths.get(TEMP_PATH)).findList(); assertTrue(!list.isEmpty()); + list = Ebean.find(SomeNewTypesBean.class).where().eq("period", Period.of(4,3,2)).findList(); + assertTrue(!list.isEmpty()); + SomeNewTypesBean fetched = Ebean.find(SomeNewTypesBean.class, bean.getId()); assertEquals(bean.getZoneId(), fetched.getZoneId()); @@ -95,6 +101,8 @@ public class TestNewTypes extends BaseTestCase { assertEquals(bean.getOffsetDateTime(), fetched.getOffsetDateTime()); assertEquals(bean.getInstant(), fetched.getInstant()); assertEquals(bean.getPath(), fetched.getPath()); + assertEquals(bean.getPeriod(), fetched.getPeriod()); + String asJson = Ebean.json().toJson(fetched); @@ -111,6 +119,7 @@ public class TestNewTypes extends BaseTestCase { assertEquals(bean.getInstant(), toBean.getInstant()); // FIXME: This test fails on Windows with: expected:<\tmp> but was: assertEquals(bean.getPath(), toBean.getPath()); + assertEquals(bean.getPeriod(), toBean.getPeriod()); } @@ -133,6 +142,6 @@ public class TestNewTypes extends BaseTestCase { assertNull(fetched.getOffsetDateTime()); assertNull(fetched.getInstant()); assertNull(fetched.getPath()); - + assertNull(fetched.getPeriod()); } }