From 265bda8cf23b3499d6d11c95189696ecbbe0e60b Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 23 Feb 2018 17:41:01 +1300 Subject: [PATCH] #1272 - ENH: Add built in support for Joda Period --- .../server/type/DefaultTypeManager.java | 1 + .../server/type/ScalarTypeJodaPeriod.java | 39 +++++++++++++++++ .../server/type/ScalarTypeJodaPeriodTest.java | 43 +++++++++++++++++++ .../org/tests/model/joda/BasicJodaEntity.java | 11 +++++ .../model/joda/TestJodaInsertUpdate.java | 12 +++++- 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java create mode 100644 src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java diff --git a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index a6dd341d4..369928843 100644 --- a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -875,6 +875,7 @@ public final class DefaultTypeManager implements TypeManager { typeMap.put(DateTime.class, new ScalarTypeJodaDateTime(mode)); typeMap.put(LocalDate.class, new ScalarTypeJodaLocalDate()); typeMap.put(org.joda.time.DateMidnight.class, new ScalarTypeJodaDateMidnight()); + typeMap.put(org.joda.time.Period.class, new ScalarTypeJodaPeriod()); String jodaLocalTimeMode = config.getJodaLocalTimeMode(); if ("normal".equalsIgnoreCase(jodaLocalTimeMode)) { diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java new file mode 100644 index 000000000..5d3e3ee4e --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java @@ -0,0 +1,39 @@ +package io.ebeaninternal.server.type; + +import org.joda.time.Period; + +/** + * ScalarType for Joda Period stored as DB VARCHAR + */ +public class ScalarTypeJodaPeriod extends ScalarTypeBaseVarchar { + + public ScalarTypeJodaPeriod() { + super(Period.class); + } + + @Override + public int getLength() { + return 50; + } + + @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/ScalarTypeJodaPeriodTest.java b/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java new file mode 100644 index 000000000..3a58e9fbf --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java @@ -0,0 +1,43 @@ +package io.ebeaninternal.server.type; + +import org.joda.time.Period; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScalarTypeJodaPeriodTest { + + private ScalarTypeJodaPeriod scalarType = new ScalarTypeJodaPeriod(); + + @Test + public void getLength() { + assertThat(scalarType.getLength()).isEqualTo(50); + } + + @Test + public void formatAndParse() { + + Period original = Period.years(1).plusMonths(2).plusDays(4) + .plusHours(12).plusMinutes(19).plusSeconds(20); + + String value = scalarType.formatValue(original); + assertThat(value).isEqualTo("P1Y2M4DT12H19M20S"); + + Period period = scalarType.parse(value); + assertThat(period).isEqualTo(original); + } + + + @Test + public void convertFromDbString() { + + Period original = Period.years(1).plusMonths(2).plusDays(4) + .plusHours(23).plusMinutes(19).plusSeconds(20).plusMillis(987); + + String stringVal = scalarType.convertToDbString(original); + Period period = scalarType.convertFromDbString(stringVal); + + assertThat(period).isEqualTo(original); + } + +} diff --git a/src/test/java/org/tests/model/joda/BasicJodaEntity.java b/src/test/java/org/tests/model/joda/BasicJodaEntity.java index acb025fe0..52e528e27 100644 --- a/src/test/java/org/tests/model/joda/BasicJodaEntity.java +++ b/src/test/java/org/tests/model/joda/BasicJodaEntity.java @@ -4,6 +4,7 @@ import io.ebean.annotation.CreatedTimestamp; import io.ebean.annotation.UpdatedTimestamp; import org.joda.time.DateTime; import org.joda.time.LocalDateTime; +import org.joda.time.Period; import javax.persistence.Entity; import javax.persistence.Id; @@ -23,6 +24,8 @@ public class BasicJodaEntity { @UpdatedTimestamp DateTime updated; + Period period; + @Version LocalDateTime version; @@ -42,6 +45,14 @@ public class BasicJodaEntity { this.name = name; } + public Period getPeriod() { + return period; + } + + public void setPeriod(Period period) { + this.period = period; + } + public LocalDateTime getCreated() { return created; } diff --git a/src/test/java/org/tests/model/joda/TestJodaInsertUpdate.java b/src/test/java/org/tests/model/joda/TestJodaInsertUpdate.java index 7240eca43..df8a79fb5 100644 --- a/src/test/java/org/tests/model/joda/TestJodaInsertUpdate.java +++ b/src/test/java/org/tests/model/joda/TestJodaInsertUpdate.java @@ -4,9 +4,13 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import org.joda.time.DateTime; import org.joda.time.LocalDateTime; +import org.joda.time.Period; import org.junit.Test; -import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; public class TestJodaInsertUpdate extends BaseTestCase { @@ -27,6 +31,7 @@ public class TestJodaInsertUpdate extends BaseTestCase { Thread.sleep(10); e0.setName("bar"); + e0.setPeriod(Period.years(12).plusDays(1)); Ebean.save(e0); LocalDateTime created1 = e0.getCreated(); @@ -36,5 +41,10 @@ public class TestJodaInsertUpdate extends BaseTestCase { assertSame(created, created1); assertNotSame(updated, updated1); assertNotSame(version, version1); + + + BasicJodaEntity found = Ebean.find(BasicJodaEntity.class, e0.getId()); + + assertThat(found.getPeriod()).isEqualTo(e0.getPeriod()); } }