From 3ba9a52b0e1a1b680eba340899feca55a76a6fc0 Mon Sep 17 00:00:00 2001 From: ooknight Date: Wed, 20 Mar 2019 16:45:44 +0800 Subject: [PATCH] add server config : default enum type (#1655) ENH: add server config : default enum type --- .../java/io/ebean/config/ServerConfig.java | 12 ++++++++ .../server/type/DefaultTypeManager.java | 13 +++++++-- src/test/java/io/ebean/server/type/MySex.java | 5 ++++ .../io/ebean/server/type/TestTypeManager.java | 28 +++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/test/java/io/ebean/server/type/MySex.java diff --git a/src/main/java/io/ebean/config/ServerConfig.java b/src/main/java/io/ebean/config/ServerConfig.java index f9a9e3d7d..899044d9f 100644 --- a/src/main/java/io/ebean/config/ServerConfig.java +++ b/src/main/java/io/ebean/config/ServerConfig.java @@ -32,6 +32,7 @@ import io.ebean.meta.MetaInfoManager; import io.ebean.migration.MigrationRunner; import io.ebean.util.StringHelper; +import javax.persistence.EnumType; import javax.sql.DataSource; import java.time.Clock; import java.util.ArrayList; @@ -229,6 +230,8 @@ public class ServerConfig { private int persistBatchSize = 20; + private EnumType defaultEnumType = EnumType.ORDINAL; + private boolean disableLazyLoading; /** @@ -978,6 +981,14 @@ public class ServerConfig { this.queryBatchSize = queryBatchSize; } + public EnumType getDefaultEnumType() { + return defaultEnumType; + } + + public void setDefaultEnumType(EnumType defaultEnumType) { + this.defaultEnumType = defaultEnumType; + } + /** * Return true if lazy loading is disabled on queries by default. */ @@ -2963,6 +2974,7 @@ public class ServerConfig { localTimeWithNanos = p.getBoolean("localTimeWithNanos", localTimeWithNanos); jodaLocalTimeMode = p.get("jodaLocalTimeMode", jodaLocalTimeMode); + defaultEnumType = p.getEnum(EnumType.class, "defaultEnumType", defaultEnumType); disableLazyLoading = p.getBoolean("disableLazyLoading", disableLazyLoading); lazyLoadBatchSize = p.getInt("lazyLoadBatchSize", lazyLoadBatchSize); queryBatchSize = p.getInt("queryBatchSize", queryBatchSize); diff --git a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index cf8308e68..ca630c36f 100644 --- a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -154,6 +154,8 @@ public final class DefaultTypeManager implements TypeManager { private final boolean offlineMigrationGeneration; + private final EnumType defaultEnumType; + // OPTIONAL ScalarTypes registered if Jackson/JsonNode is in the classpath /** @@ -201,6 +203,8 @@ public final class DefaultTypeManager implements TypeManager { this.offlineMigrationGeneration = DbOffline.isGenerateMigration(); + this.defaultEnumType = config.getDefaultEnumType(); + initialiseStandard(jsonDateTime, config); initialiseJavaTimeTypes(jsonDateTime, config); initialiseJodaTypes(jsonDateTime, config); @@ -645,8 +649,13 @@ public final class DefaultTypeManager implements TypeManager { private ScalarTypeEnum createEnumScalarTypePerSpec(Class enumType, EnumType type) { if (type == null) { - // default as per spec is ORDINAL - return new ScalarTypeEnumStandard.OrdinalEnum(enumType); + + if(defaultEnumType == EnumType.ORDINAL) { + return new ScalarTypeEnumStandard.OrdinalEnum(enumType); + + } else { + return new ScalarTypeEnumStandard.StringEnum(enumType); + } } else if (type == EnumType.ORDINAL) { return new ScalarTypeEnumStandard.OrdinalEnum(enumType); diff --git a/src/test/java/io/ebean/server/type/MySex.java b/src/test/java/io/ebean/server/type/MySex.java new file mode 100644 index 000000000..b66ca2e82 --- /dev/null +++ b/src/test/java/io/ebean/server/type/MySex.java @@ -0,0 +1,5 @@ +package io.ebean.server.type; + +public enum MySex { + MALE, FEMALE +} diff --git a/src/test/java/io/ebean/server/type/TestTypeManager.java b/src/test/java/io/ebean/server/type/TestTypeManager.java index e5ab13393..90f3c2c8d 100644 --- a/src/test/java/io/ebean/server/type/TestTypeManager.java +++ b/src/test/java/io/ebean/server/type/TestTypeManager.java @@ -7,6 +7,7 @@ import io.ebeaninternal.server.core.bootup.BootupClasses; import io.ebeaninternal.server.type.DefaultTypeManager; import io.ebeaninternal.server.type.RsetDataReader; import io.ebeaninternal.server.type.ScalarType; +import io.ebeaninternal.server.type.ScalarTypeEnumStandard; import org.junit.Assert; import org.junit.Test; import org.tests.model.ivo.Money; @@ -95,6 +96,21 @@ public class TestTypeManager extends BaseTestCase { } + @Test + public void testWithConfig() { + DefaultTypeManager typeManager1 = createTypeManager(); + ScalarType type1 = typeManager1.createEnumScalarType(MySex.class, null); + assertThat(type1 instanceof ScalarTypeEnumStandard.OrdinalEnum); + // + DefaultTypeManager typeManager2 = createTypeManagerDefaultEnumTypeString(); + ScalarType type2 = typeManager2.createEnumScalarType(MySex.class, null); + assertThat(type2 instanceof ScalarTypeEnumStandard.StringEnum); + // + DefaultTypeManager typeManager3 = createTypeManagerDefaultEnumTypeString(); + ScalarType type3 = typeManager3.createEnumScalarType(MySex.class, EnumType.ORDINAL); + assertThat(type3 instanceof ScalarTypeEnumStandard.OrdinalEnum); + } + private DefaultTypeManager createTypeManager() { ServerConfig serverConfig = new ServerConfig(); @@ -106,6 +122,18 @@ public class TestTypeManager extends BaseTestCase { return new DefaultTypeManager(serverConfig, bootupClasses); } + private DefaultTypeManager createTypeManagerDefaultEnumTypeString() { + + ServerConfig serverConfig = new ServerConfig(); + serverConfig.setDatabasePlatform(new H2Platform()); + serverConfig.setDefaultEnumType(EnumType.STRING); + + BootupClasses bootupClasses = new BootupClasses(); + bootupClasses.getAttributeConverters().add(MoneyTypeConverter.class); + + return new DefaultTypeManager(serverConfig, bootupClasses); + } + /** * Test double DataReader implementation. */