diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index 8bb9680e7..49c03dc57 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -147,7 +147,6 @@ public final class DefaultTypeManager implements TypeManager { initialiseStandard(config); initialiseJavaTimeTypes(config); - initialiseJodaTypes(config); initialiseJacksonTypes(config); loadTypesFromProviders(config, objectMapper); loadGeoTypeBinder(config); @@ -261,7 +260,7 @@ public final class DefaultTypeManager implements TypeManager { if (found == null) { if (type.getName().equals("org.joda.time.LocalTime")) { throw new IllegalStateException( - "ScalarType of Joda LocalTime not defined. You need to set DatabaseConfig.jodaLocalTimeMode to" + "ScalarType of Joda LocalTime not defined. 1) Check ebean-joda-time dependency has been added 2) Check DatabaseConfig.jodaLocalTimeMode is set to" + " either 'normal' or 'utc'. UTC is the old mode using UTC timezone but local time zone is now preferred as 'normal' mode."); } found = checkInheritedTypes(type); @@ -798,36 +797,6 @@ public final class DefaultTypeManager implements TypeManager { logicalMap.putIfAbsent(clazz.getSimpleName(), scalarType); } - /** - * Detect if Joda classes are in the classpath and if so register the Joda data types. - */ - @SuppressWarnings("deprecation") - private void initialiseJodaTypes(DatabaseConfig config) { - // detect if Joda classes are in the classpath - if (config.getClassLoadConfig().isJodaTimePresent()) { - // Joda classes are in the classpath so register the types - log.log(DEBUG, "Registering Joda data types"); - addType(LocalDateTime.class, new ScalarTypeJodaLocalDateTime(jsonDateTime)); - addType(DateTime.class, new ScalarTypeJodaDateTime(jsonDateTime)); - if (config.getDatabasePlatform().supportsNativeJavaTime()) { - addType(LocalDate.class, new ScalarTypeJodaLocalDateNative(jsonDate)); - } else { - addType(LocalDate.class, new ScalarTypeJodaLocalDate(jsonDate)); - } - addType(org.joda.time.DateMidnight.class, new ScalarTypeJodaDateMidnight(jsonDate)); - addType(org.joda.time.Period.class, new ScalarTypeJodaPeriod()); - - String jodaLocalTimeMode = config.getJodaLocalTimeMode(); - if ("normal".equalsIgnoreCase(jodaLocalTimeMode)) { - // use the expected/normal local time zone - addType(LocalTime.class, new ScalarTypeJodaLocalTime()); - } else if ("utc".equalsIgnoreCase(jodaLocalTimeMode)) { - // use the old UTC based - addType(LocalTime.class, new ScalarTypeJodaLocalTimeUTC()); - } - } - } - /** * Register all the standard types supported. This is the standard JDBC types * plus some other common types such as java.util.Date and java.util.Calendar. diff --git a/ebean-core/src/test/java/org/tests/model/basic/TJodaEntity.java b/ebean-core/src/test/java/org/tests/model/basic/TJodaEntity.java deleted file mode 100644 index 311a20424..000000000 --- a/ebean-core/src/test/java/org/tests/model/basic/TJodaEntity.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tests.model.basic; - -import org.joda.time.LocalTime; - -import javax.persistence.Entity; -import javax.persistence.Id; - -@Entity -public class TJodaEntity { - - @Id - Integer id; - - LocalTime localTime; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public LocalTime getLocalTime() { - return localTime; - } - - public void setLocalTime(LocalTime localTime) { - this.localTime = localTime; - } - -} diff --git a/ebean-joda-time/pom.xml b/ebean-joda-time/pom.xml new file mode 100644 index 000000000..4c082cdae --- /dev/null +++ b/ebean-joda-time/pom.xml @@ -0,0 +1,44 @@ + + + + ebean-parent + io.ebean + 13.8.2-SNAPSHOT + + 4.0.0 + + ebean-joda-time + + + + + io.ebean + ebean-core-type + 13.8.2-SNAPSHOT + provided + + + + joda-time + joda-time + 2.11.0 + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + io.avaje + junit + 1.1 + test + + + + diff --git a/ebean-joda-time/src/main/java/io/ebean/joda/time/JodaExtraTypeFactory.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/JodaExtraTypeFactory.java new file mode 100644 index 000000000..c4883368e --- /dev/null +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/JodaExtraTypeFactory.java @@ -0,0 +1,40 @@ +package io.ebean.joda.time; + +import io.ebean.config.DatabaseConfig; +import io.ebean.core.type.ExtraTypeFactory; +import io.ebean.core.type.ScalarType; + +import java.util.ArrayList; +import java.util.List; + +/** + * Register the Joda-Time ScalarType support. + */ +public class JodaExtraTypeFactory implements ExtraTypeFactory { + + @Override + public List> createTypes(DatabaseConfig config, Object objectMapper) { + var jsonDateTime = config.getJsonDateTime(); + var jsonDate = config.getJsonDate(); + + List> types = new ArrayList<>(); + types.add(new ScalarTypeJodaLocalDateTime(jsonDateTime)); + types.add(new ScalarTypeJodaDateTime(jsonDateTime)); + if (config.getDatabasePlatform().supportsNativeJavaTime()) { + types.add(new ScalarTypeJodaLocalDateNative(jsonDate)); + } else { + types.add(new ScalarTypeJodaLocalDate(jsonDate)); + } + types.add(new ScalarTypeJodaDateMidnight(jsonDate)); + types.add(new ScalarTypeJodaPeriod()); + String jodaLocalTimeMode = config.getJodaLocalTimeMode(); + if ("normal".equalsIgnoreCase(jodaLocalTimeMode)) { + // use the expected/normal local time zone + types.add(new ScalarTypeJodaLocalTime()); + } else if ("utc".equalsIgnoreCase(jodaLocalTimeMode)) { + // use the old UTC based + types.add(new ScalarTypeJodaLocalTimeUTC()); + } + return types; + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateMidnight.java similarity index 97% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateMidnight.java index 78a625327..e2520906d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateMidnight.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.config.JsonConfig; import io.ebean.core.type.ScalarTypeBaseDate; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateTime.java similarity index 97% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateTime.java index c9d61bd1e..594795f2b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaDateTime.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.config.JsonConfig; import io.ebean.core.type.ScalarTypeBaseDateTime; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDate.java similarity index 97% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDate.java index 163775fb0..fa10d20e9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDate.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import java.sql.Date; import java.sql.Types; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateNative.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateNative.java similarity index 96% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateNative.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateNative.java index 328cccabb..b25a9609f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateNative.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateNative.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import java.sql.SQLException; import java.sql.Types; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTime.java similarity index 97% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTime.java index 348ce28d6..3b0ec373b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTime.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.config.JsonConfig; import io.ebean.core.type.ScalarTypeBaseDateTime; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTime.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTime.java index 072046b0f..9e62b683a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTime.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeUTC.java similarity index 97% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeUTC.java index 81edfe24a..163c1f7ec 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeUTC.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaPeriod.java similarity index 94% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java rename to ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaPeriod.java index abe0c9da3..27914fc1c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java +++ b/ebean-joda-time/src/main/java/io/ebean/joda/time/ScalarTypeJodaPeriod.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.core.type.ScalarTypeBaseVarchar; import org.joda.time.Period; diff --git a/ebean-joda-time/src/main/java/module-info.java b/ebean-joda-time/src/main/java/module-info.java new file mode 100644 index 000000000..941aeb4bd --- /dev/null +++ b/ebean-joda-time/src/main/java/module-info.java @@ -0,0 +1,9 @@ + +module io.ebean.joda.time { + + requires io.ebean.core.type; + requires org.joda.time; + requires com.fasterxml.jackson.core; + + provides io.ebean.core.type.ExtraTypeFactory with io.ebean.joda.time.JodaExtraTypeFactory; +} diff --git a/ebean-joda-time/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory b/ebean-joda-time/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory new file mode 100644 index 000000000..3f23de83c --- /dev/null +++ b/ebean-joda-time/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory @@ -0,0 +1 @@ +io.ebean.joda.time.JodaExtraTypeFactory diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTest.java similarity index 81% rename from ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java rename to ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTest.java index 0d3719f8a..94ad4f855 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTest.java +++ b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTest.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.config.JsonConfig; import org.joda.time.LocalDate; @@ -78,15 +78,5 @@ public class ScalarTypeJodaLocalDateTest { assertThat(beanType).isEqualTo(localDate); } - @Test - public void json() throws IOException { - LocalDate val = new LocalDate(2019, 5, 9); - - JsonTester jsonMillis = new JsonTester<>(type); - assertThat(jsonMillis.test(val)).isEqualTo("{\"key\":1557360000000}"); - - JsonTester jsonIso = new JsonTester<>(new ScalarTypeJodaLocalDate(JsonConfig.Date.ISO8601) ); - assertThat(jsonIso.test(val)).isEqualTo("{\"key\":\"2019-05-09\"}"); - } } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTimeTest.java b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTimeTest.java similarity index 96% rename from ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTimeTest.java rename to ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTimeTest.java index 933176623..ed1232aa9 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTimeTest.java +++ b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalDateTimeTest.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import io.ebean.config.JsonConfig; import org.joda.time.DateTimeZone; diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeTest.java b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeTest.java similarity index 71% rename from ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeTest.java rename to ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeTest.java index 9eaf9b452..9e8b9f161 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeTest.java +++ b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaLocalTimeTest.java @@ -1,12 +1,9 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; -import io.ebean.DB; import org.joda.time.DateTimeZone; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.tests.model.basic.TJodaEntity; import java.sql.Timestamp; @@ -47,18 +44,5 @@ public class ScalarTypeJodaLocalTimeTest { } - @Test - public void toJson() { - LocalTime now = new LocalTime(); - - TJodaEntity bean = new TJodaEntity(); - bean.setId(42); - bean.setLocalTime(now); - - String json = DB.json().toJson(bean); - TJodaEntity bean1 = DB.json().toBean(TJodaEntity.class, json); - - Assertions.assertEquals(bean1.getLocalTime(), now); - } } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaPeriodTest.java similarity index 96% rename from ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java rename to ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaPeriodTest.java index 32edd86b2..12f1f3496 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriodTest.java +++ b/ebean-joda-time/src/test/java/io/ebean/joda/time/ScalarTypeJodaPeriodTest.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.joda.time; import org.joda.time.Period; import org.junit.jupiter.api.Test; diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index 55c78b52b..e38598080 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -102,6 +102,13 @@ + + io.ebean + ebean-joda-time + 13.8.2-SNAPSHOT + test + + io.ebean ebean-platform-all @@ -148,7 +155,7 @@ joda-time joda-time - 2.9.7 + 2.11.0 test diff --git a/ebean-test/src/test/java/org/tests/basic/TestJodaType.java b/ebean-test/src/test/java/org/tests/basic/TestJodaType.java index c5ed8b008..945572787 100644 --- a/ebean-test/src/test/java/org/tests/basic/TestJodaType.java +++ b/ebean-test/src/test/java/org/tests/basic/TestJodaType.java @@ -6,18 +6,19 @@ import io.ebean.core.type.ScalarType; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; +import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.junit.jupiter.api.Test; import org.tests.model.basic.TJodaEntity; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -public class TestJodaType extends BaseTestCase { +class TestJodaType extends BaseTestCase { @Test - public void test() { - + void test() { SpiEbeanServer server = (SpiEbeanServer) DB.getDefault(); BeanDescriptor beanDescriptor = server.descriptor(TJodaEntity.class); BeanProperty beanProperty = beanDescriptor.beanProperty("localTime"); @@ -27,8 +28,7 @@ public class TestJodaType extends BaseTestCase { } @Test - public void test_insert_find() { - + void test_insert_find() { LocalTime now = new LocalTime().withMillisOfSecond(0); TJodaEntity bean = new TJodaEntity(); @@ -40,4 +40,19 @@ public class TestJodaType extends BaseTestCase { assertThat(foundBean.getLocalTime()).isEqualTo(bean.getLocalTime()); } + @Test + void toJson() { + LocalTime now = new LocalTime(); + + TJodaEntity bean = new TJodaEntity(); + bean.setId(42); + bean.setLocalTime(now); + bean.setLocalDate(LocalDate.parse("2022-04-07")); + + String json = DB.json().toJson(bean); + TJodaEntity bean1 = DB.json().toBean(TJodaEntity.class, json); + + assertEquals(bean1.getLocalTime(), now); + assertEquals(bean1.getLocalDate(), LocalDate.parse("2022-04-07")); + } } diff --git a/ebean-test/src/test/java/org/tests/model/basic/TJodaEntity.java b/ebean-test/src/test/java/org/tests/model/basic/TJodaEntity.java index 311a20424..c20e06772 100644 --- a/ebean-test/src/test/java/org/tests/model/basic/TJodaEntity.java +++ b/ebean-test/src/test/java/org/tests/model/basic/TJodaEntity.java @@ -1,5 +1,6 @@ package org.tests.model.basic; +import org.joda.time.LocalDate; import org.joda.time.LocalTime; import javax.persistence.Entity; @@ -12,6 +13,7 @@ public class TJodaEntity { Integer id; LocalTime localTime; + LocalDate localDate; public Integer getId() { return id; @@ -29,4 +31,12 @@ public class TJodaEntity { this.localTime = localTime; } + public LocalDate getLocalDate() { + return localDate; + } + + public TJodaEntity setLocalDate(LocalDate localDate) { + this.localDate = localDate; + return this; + } } diff --git a/pom.xml b/pom.xml index 1bc7781db..c764791df 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,7 @@ ebean-redis platforms composites + ebean-joda-time ebean-csv-reader