From 5c1b4780850d99af7a1b827f228c5cc99cedb476 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 7 Sep 2022 21:39:36 +1200 Subject: [PATCH 1/7] Refactor extract ebean-json-node module - support for Jackson JsonNode (into separate module) --- composites/ebean/pom.xml | 6 ++ ebean-bom/pom.xml | 6 ++ ebean-core-type/pom.xml | 8 ++ .../io/ebean/core}/type/PostgresHelper.java | 17 +++- .../io/ebean/core/type/ScalarTypeSet.java | 28 +++++++ .../ebean/core/type/ScalarTypeSetFactory.java | 17 ++++ .../src/main/java/module-info.java | 1 + .../ebeaninternal/server/persist/Binder.java | 1 + .../server/type/DefaultTypeManager.java | 82 ++++--------------- .../server/type/ScalarTypeCidr.java | 1 + .../server/type/ScalarTypeInet.java | 1 + .../type/ScalarTypeInetAddressPostgres.java | 1 + .../server/type/ScalarTypeJsonList.java | 5 +- .../type/ScalarTypeJsonMapPostgres.java | 1 + .../server/type/ScalarTypeJsonSet.java | 5 +- .../server/type/ScalarTypeJsonString.java | 1 + .../server/type/TypeJsonManager.java | 1 + ebean-core/src/main/java/module-info.java | 1 + ebean-json-node/pom.xml | 52 ++++++++++++ .../ebean/jackson/jsonnode/JsonNodeSet.java | 51 ++++++++++++ .../jackson/jsonnode/JsonNodeTypeFactory.java | 31 +++++++ .../jackson/jsonnode}/ScalarTypeJsonNode.java | 11 +-- .../jsonnode}/ScalarTypeJsonNodePostgres.java | 3 +- .../src/main/java/module-info.java | 10 +++ .../io.ebean.core.type.ScalarTypeSetFactory | 1 + ebean-test/pom.xml | 7 ++ pom.xml | 1 + 27 files changed, 266 insertions(+), 84 deletions(-) rename {ebean-core/src/main/java/io/ebeaninternal/server => ebean-core-type/src/main/java/io/ebean/core}/type/PostgresHelper.java (51%) create mode 100644 ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSet.java create mode 100644 ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSetFactory.java create mode 100644 ebean-json-node/pom.xml create mode 100644 ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java create mode 100644 ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java rename {ebean-core/src/main/java/io/ebeaninternal/server/type => ebean-json-node/src/main/java/io/ebean/jackson/jsonnode}/ScalarTypeJsonNode.java (95%) rename {ebean-core/src/main/java/io/ebeaninternal/server/type => ebean-json-node/src/main/java/io/ebean/jackson/jsonnode}/ScalarTypeJsonNodePostgres.java (94%) create mode 100644 ebean-json-node/src/main/java/module-info.java create mode 100644 ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory diff --git a/composites/ebean/pom.xml b/composites/ebean/pom.xml index 9bf3fe041..8c41257dc 100644 --- a/composites/ebean/pom.xml +++ b/composites/ebean/pom.xml @@ -31,6 +31,12 @@ 13.9.3-SNAPSHOT + + io.ebean + ebean-json-node + 13.9.3-SNAPSHOT + + io.ebean ebean-datasource diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index d8d18b0a8..6813c7840 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -116,6 +116,12 @@ 13.9.3-SNAPSHOT + + io.ebean + ebean-json-node + 13.9.3-SNAPSHOT + + io.ebean ebean-ddl-generator diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index f761398ee..5511e1088 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -26,6 +26,14 @@ true + + + org.postgresql + postgresql + 42.4.1 + true + + io.avaje junit diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java b/ebean-core-type/src/main/java/io/ebean/core/type/PostgresHelper.java similarity index 51% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java rename to ebean-core-type/src/main/java/io/ebean/core/type/PostgresHelper.java index 768c7a751..c18359704 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/PostgresHelper.java @@ -1,5 +1,7 @@ -package io.ebeaninternal.server.type; +package io.ebean.core.type; +import io.ebean.annotation.Platform; +import io.ebean.config.dbplatform.DatabasePlatform; import org.postgresql.util.PGobject; import java.sql.SQLException; @@ -9,12 +11,12 @@ public final class PostgresHelper { /** * The Postgres JSON DB type. */ - static final String JSON_TYPE = "json"; + public static final String JSON_TYPE = "json"; /** * The Postgres JSONB DB type. */ - static final String JSONB_TYPE = "jsonb"; + public static final String JSONB_TYPE = "jsonb"; static final String INET_TYPE = "inet"; @@ -31,4 +33,13 @@ public final class PostgresHelper { pgo.setValue(rawJson); return pgo; } + + /** + * Return true if the platform is Postgres or compatible like Yugabyte, Cockroach. + */ + public static boolean isPostgresCompatible(DatabasePlatform databasePlatform) { + return databasePlatform.isPlatform(Platform.POSTGRES) + || databasePlatform.isPlatform(Platform.YUGABYTE) + || databasePlatform.isPlatform(Platform.COCKROACH); + } } diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSet.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSet.java new file mode 100644 index 000000000..725ebac3f --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSet.java @@ -0,0 +1,28 @@ +package io.ebean.core.type; + +import io.avaje.lang.Nullable; + +/** + * A ScalarType that has variations based on the mapped JDBC type (like VARCHAR, CLOB, JSON etc). + */ +public interface ScalarTypeSet { + + /** + * The property type these scalar types map to. + */ + Class type(); + + /** + * Return a default ScalarType to use when no other annotations like {@code @DbJson} are present. + */ + @Nullable + ScalarType defaultType(); + + /** + * Return the scalarType to use for the given jdbc type. + *

+ * For example VARCHAR, CLOB, JSON etc. + */ + ScalarType forType(int jdbcType); + +} diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSetFactory.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSetFactory.java new file mode 100644 index 000000000..21d133a37 --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeSetFactory.java @@ -0,0 +1,17 @@ +package io.ebean.core.type; + +import io.avaje.lang.Nullable; +import io.ebean.config.DatabaseConfig; + +/** + * Factory to create ScalarTypeSet. + */ +public interface ScalarTypeSetFactory { + + /** + * Create the ScalarTypeSet given the config and optional objectMapper. + */ + @Nullable + ScalarTypeSet createTypeSet(DatabaseConfig config, @Nullable Object objectMapper); + +} diff --git a/ebean-core-type/src/main/java/module-info.java b/ebean-core-type/src/main/java/module-info.java index 557d5a302..88be6d462 100644 --- a/ebean-core-type/src/main/java/module-info.java +++ b/ebean-core-type/src/main/java/module-info.java @@ -4,6 +4,7 @@ module io.ebean.core.type { requires transitive java.sql; requires transitive io.ebean.api; + requires static org.postgresql.jdbc; requires static com.fasterxml.jackson.core; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java index 5dd0af06a..e51dee906 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.persist; import io.ebean.config.dbplatform.DbPlatformType; import io.ebean.core.type.DataReader; +import io.ebean.core.type.PostgresHelper; import io.ebean.core.type.ScalarType; import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.CoreLog; 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 bc644954e..b3a5d99bd 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 @@ -1,6 +1,5 @@ package io.ebeaninternal.server.type; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.ebean.annotation.*; import io.ebean.config.DatabaseConfig; @@ -9,9 +8,7 @@ import io.ebean.config.PlatformConfig; import io.ebean.config.ScalarTypeConverter; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.DbPlatformType; -import io.ebean.core.type.DocPropertyType; -import io.ebean.core.type.ExtraTypeFactory; -import io.ebean.core.type.ScalarType; +import io.ebean.core.type.*; import io.ebean.types.Cidr; import io.ebean.types.Inet; import io.ebean.util.AnnotationUtil; @@ -51,6 +48,7 @@ public final class DefaultTypeManager implements TypeManager { private static final System.Logger log = CoreLog.internal; + private final Map, ScalarTypeSet> typeSets = new HashMap<>(); private final ConcurrentHashMap, ScalarType> typeMap; private final ConcurrentHashMap> nativeMap; private final ConcurrentHashMap> logicalMap; @@ -71,28 +69,7 @@ public final class DefaultTypeManager implements TypeManager { private final EnumType defaultEnumType; private final DatabasePlatform databasePlatform; - // OPTIONAL ScalarTypes registered if Jackson/JsonNode is in the classpath - /** - * Jackson's JsonNode storage to Clob. - */ - private ScalarType jsonNodeClob; - /** - * Jackson's JsonNode storage to Blob. - */ - private ScalarType jsonNodeBlob; - /** - * Jackson's JsonNode storage to Varchar. - */ - private ScalarType jsonNodeVarchar; - /** - * Jackson's JsonNode storage to Postgres JSON or Clob. - */ - private ScalarType jsonNodeJson; - /** - * Jackson's JsonNode storage to Postgres JSONB or Clob. - */ - private ScalarType jsonNodeJsonb; private final PlatformArrayTypeFactory arrayTypeListFactory; private final PlatformArrayTypeFactory arrayTypeSetFactory; @@ -120,7 +97,6 @@ public final class DefaultTypeManager implements TypeManager { initialiseStandard(config); initialiseJavaTimeTypes(config); - initialiseJacksonTypes(); loadTypesFromProviders(config, objectMapper); loadGeoTypeBinder(config); @@ -160,16 +136,21 @@ public final class DefaultTypeManager implements TypeManager { * Load custom scalar types registered via ExtraTypeFactory and ServiceLoader. */ private void loadTypesFromProviders(DatabaseConfig config, Object objectMapper) { - ServiceLoader factories = ServiceLoader.load(ExtraTypeFactory.class); - Iterator iterator = factories.iterator(); - if (iterator.hasNext()) { - // use the cacheFactory (via classpath service loader) - ExtraTypeFactory plugin = iterator.next(); - List> types = plugin.createTypes(config, objectMapper); - for (ScalarType type : types) { + for (ExtraTypeFactory plugin : ServiceLoader.load(ExtraTypeFactory.class)) { + for (ScalarType type : plugin.createTypes(config, objectMapper)) { add(type); } } + for (ScalarTypeSetFactory factory : ServiceLoader.load(ScalarTypeSetFactory.class)) { + ScalarTypeSet typeSet = factory.createTypeSet(config, objectMapper); + if (typeSet != null) { + typeSets.put(typeSet.type(), typeSet); + ScalarType defaultType = typeSet.defaultType(); + if (defaultType != null) { + typeMap.put(typeSet.type(), defaultType); + } + } + } } private boolean isPostgresCompatible(DatabasePlatform databasePlatform) { @@ -350,19 +331,9 @@ public final class DefaultTypeManager implements TypeManager { } } if (objectMapperPresent && prop.getMutationDetection() == MutationDetection.DEFAULT) { - if (type.equals(JsonNode.class)) { - switch (dbType) { - case Types.VARCHAR: - return jsonNodeVarchar; - case Types.BLOB: - return jsonNodeBlob; - case Types.CLOB: - return jsonNodeClob; - case DbPlatformType.JSONB: - return jsonNodeJsonb; - default: - return jsonNodeJson; - } + ScalarTypeSet typeSet = typeSets.get(type); + if (typeSet != null) { + return typeSet.forType(dbType); } } return createJsonObjectMapperType(prop, dbType, DocPropertyType.OBJECT); @@ -709,25 +680,6 @@ public final class DefaultTypeManager implements TypeManager { } } - /** - * Add support for Jackson's JsonNode mapping to Clob, Blob, Varchar, JSON and JSONB. - */ - private void initialiseJacksonTypes() { - if (objectMapper != null) { - ObjectMapper mapper = (ObjectMapper) objectMapper; - jsonNodeClob = new ScalarTypeJsonNode.Clob(mapper); - jsonNodeBlob = new ScalarTypeJsonNode.Blob(mapper); - jsonNodeVarchar = new ScalarTypeJsonNode.Varchar(mapper); - jsonNodeJson = jsonNodeClob; // Default for non-Postgres databases - jsonNodeJsonb = jsonNodeClob; // Default for non-Postgres databases - if (postgres) { - jsonNodeJson = new ScalarTypeJsonNodePostgres.JSON(mapper); - jsonNodeJsonb = new ScalarTypeJsonNodePostgres.JSONB(mapper); - } - // add as default mapping for JsonNode (when not annotated with @DbJson etc) - typeMap.put(JsonNode.class, jsonNodeJson); - } - } private void initialiseJavaTimeTypes(DatabaseConfig config) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCidr.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCidr.java index e355c2936..7cc2238e7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCidr.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCidr.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import io.ebean.core.type.ScalarTypeBaseVarchar; import io.ebean.types.Cidr; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInet.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInet.java index 40f52aca6..828e42a64 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInet.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import io.ebean.core.type.ScalarTypeBaseVarchar; import io.ebean.types.Inet; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddressPostgres.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddressPostgres.java index a09e7cfb0..fadcf3038 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddressPostgres.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddressPostgres.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import io.ebean.core.type.ScalarTypeBaseVarchar; import io.ebean.text.TextException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonList.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonList.java index 74b23c799..e37ff8cb6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonList.java @@ -3,10 +3,7 @@ package io.ebeaninternal.server.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.config.dbplatform.DbPlatformType; -import io.ebean.core.type.DataBinder; -import io.ebean.core.type.DataReader; -import io.ebean.core.type.DocPropertyType; -import io.ebean.core.type.ScalarType; +import io.ebean.core.type.*; import io.ebean.text.TextException; import io.ebean.text.json.EJson; import io.ebeaninternal.json.ModifyAwareList; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMapPostgres.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMapPostgres.java index ae33fa0e4..612048447 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMapPostgres.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMapPostgres.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.dbplatform.DbPlatformType; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import java.sql.SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonSet.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonSet.java index 334e86417..0ae3248a4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonSet.java @@ -3,10 +3,7 @@ package io.ebeaninternal.server.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.config.dbplatform.DbPlatformType; -import io.ebean.core.type.DataBinder; -import io.ebean.core.type.DataReader; -import io.ebean.core.type.DocPropertyType; -import io.ebean.core.type.ScalarType; +import io.ebean.core.type.*; import io.ebean.text.TextException; import io.ebean.text.json.EJson; import io.ebeaninternal.json.ModifyAwareSet; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonString.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonString.java index 51fb54d4b..aa69300ed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonString.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonString.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.dbplatform.DbPlatformType; import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import io.ebean.core.type.ScalarType; import java.sql.SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java index 25034e409..84ceac12b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.ebean.ModifyAwareType; import io.ebean.annotation.MutationDetection; import io.ebean.config.dbplatform.DbPlatformType; +import io.ebean.core.type.PostgresHelper; import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; final class TypeJsonManager { diff --git a/ebean-core/src/main/java/module-info.java b/ebean-core/src/main/java/module-info.java index ee9ba85ea..58a3438c9 100644 --- a/ebean-core/src/main/java/module-info.java +++ b/ebean-core/src/main/java/module-info.java @@ -8,6 +8,7 @@ module io.ebean.core { uses io.ebean.config.dbplatform.DatabasePlatformProvider; uses io.ebean.datasource.DataSourceAlertFactory; uses io.ebean.core.type.ExtraTypeFactory; + uses io.ebean.core.type.ScalarTypeSetFactory; uses io.ebeanservice.docstore.api.DocStoreFactory; uses io.ebean.migration.auto.AutoMigrationRunner; uses io.avaje.classpath.scanner.ClassPathScannerFactory; diff --git a/ebean-json-node/pom.xml b/ebean-json-node/pom.xml new file mode 100644 index 000000000..dfefb9b9f --- /dev/null +++ b/ebean-json-node/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 13.9.3-SNAPSHOT + + + ebean-json-node + + + 19 + 19 + UTF-8 + + + + + + + io.ebean + ebean-core-type + 13.9.3-SNAPSHOT + provided + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + provided + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + provided + + + + io.avaje + junit + 1.1 + test + + + + diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java new file mode 100644 index 000000000..c932d5339 --- /dev/null +++ b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java @@ -0,0 +1,51 @@ +package io.ebean.jackson.jsonnode; + +import com.fasterxml.jackson.databind.JsonNode; +import io.ebean.config.dbplatform.DbPlatformType; +import io.ebean.core.type.ScalarType; +import io.ebean.core.type.ScalarTypeSet; + +import java.sql.Types; + +class JsonNodeSet implements ScalarTypeSet { + + final ScalarType varchar; + final ScalarType clob; + final ScalarType blob; + final ScalarType jsonb; + final ScalarType json; + + JsonNodeSet(ScalarType varchar, ScalarType clob, ScalarType blob, ScalarType jsonb, ScalarType json) { + this.varchar = varchar; + this.clob = clob; + this.blob = blob; + this.jsonb = jsonb; + this.json = json; + } + + @Override + public Class type() { + return JsonNode.class; + } + + @Override + public ScalarType defaultType() { + return json; + } + + @Override + public ScalarType forType(int dbType) { + switch (dbType) { + case Types.VARCHAR: + return varchar; + case Types.BLOB: + return blob; + case Types.CLOB: + return clob; + case DbPlatformType.JSONB: + return jsonb; + default: + return json; + } + } +} diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java new file mode 100644 index 000000000..af8f198fe --- /dev/null +++ b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java @@ -0,0 +1,31 @@ +package io.ebean.jackson.jsonnode; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.ebean.config.DatabaseConfig; +import io.ebean.core.type.PostgresHelper; +import io.ebean.core.type.ScalarType; +import io.ebean.core.type.ScalarTypeSet; +import io.ebean.core.type.ScalarTypeSetFactory; + +public class JsonNodeTypeFactory implements ScalarTypeSetFactory { + + @Override + public ScalarTypeSet createTypeSet(DatabaseConfig config, Object objectMapper) { + if (objectMapper == null) { + return null; + } + + ObjectMapper mapper = (ObjectMapper) objectMapper; + var varchar = new ScalarTypeJsonNode.Varchar(mapper); + var clob = new ScalarTypeJsonNode.Clob(mapper); + var blob = new ScalarTypeJsonNode.Blob(mapper); + ScalarType json = clob; // Default for non-Postgres databases + ScalarType jsonb = clob; // Default for non-Postgres databases + if (PostgresHelper.isPostgresCompatible(config.getDatabasePlatform())) { + json = new ScalarTypeJsonNodePostgres.JSON(mapper); + jsonb = new ScalarTypeJsonNodePostgres.JSONB(mapper); + } + return new JsonNodeSet(varchar, clob, blob, jsonb, json); + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java similarity index 95% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java rename to ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java index 0c7959038..ca9859bde 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java +++ b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.jackson.jsonnode; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -11,11 +11,7 @@ import io.ebean.core.type.ScalarTypeBase; import io.ebean.text.TextException; import io.ebean.util.IOUtils; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; +import java.io.*; import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.sql.Types; @@ -182,7 +178,8 @@ abstract class ScalarTypeJsonNode extends ScalarTypeBase { if (value == null) { dataOutput.writeBoolean(false); } else { - ScalarHelp.writeUTF(dataOutput, format(value)); + dataOutput.writeBoolean(true); + dataOutput.writeUTF(format(value)); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java similarity index 94% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java rename to ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java index b23252367..c78a69b2b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java +++ b/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java @@ -1,9 +1,10 @@ -package io.ebeaninternal.server.type; +package io.ebean.jackson.jsonnode; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.ebean.config.dbplatform.DbPlatformType; import io.ebean.core.type.DataBinder; +import io.ebean.core.type.PostgresHelper; import java.sql.SQLException; diff --git a/ebean-json-node/src/main/java/module-info.java b/ebean-json-node/src/main/java/module-info.java new file mode 100644 index 000000000..ae48a30fb --- /dev/null +++ b/ebean-json-node/src/main/java/module-info.java @@ -0,0 +1,10 @@ +import io.ebean.jackson.jsonnode.JsonNodeTypeFactory; + +module io.ebean.json.node { + + requires io.ebean.core.type; + requires com.fasterxml.jackson.core; + requires com.fasterxml.jackson.databind; + + provides io.ebean.core.type.ScalarTypeSetFactory with JsonNodeTypeFactory; +} diff --git a/ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory b/ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory new file mode 100644 index 000000000..3ed48464a --- /dev/null +++ b/ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory @@ -0,0 +1 @@ +io.ebean.jackson.jsonnode.JsonNodeTypeFactory diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index 4c50ebdc2..9e334b365 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -109,6 +109,13 @@ test + + io.ebean + ebean-json-node + 13.9.3-SNAPSHOT + test + + io.ebean ebean-platform-all diff --git a/pom.xml b/pom.xml index 15d12f281..f2c505822 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,7 @@ composites ebean-joda-time ebean-csv-reader + ebean-json-node From edddc935dfbfb9e228c4d25da3e17b52ae96f259 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 7 Sep 2022 22:38:09 +1200 Subject: [PATCH 2/7] Update DefaultTypeManager to reuse PostgresHelper.isPostgresCompatible() --- .../server/type/DefaultTypeManager.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) 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 b3a5d99bd..babd896d9 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 @@ -37,6 +37,7 @@ import java.time.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import static io.ebean.core.type.PostgresHelper.isPostgresCompatible; import static java.lang.System.Logger.Level.*; /** @@ -69,8 +70,6 @@ public final class DefaultTypeManager implements TypeManager { private final EnumType defaultEnumType; private final DatabasePlatform databasePlatform; - - private final PlatformArrayTypeFactory arrayTypeListFactory; private final PlatformArrayTypeFactory arrayTypeSetFactory; private GeoTypeBinder geoTypeBinder; @@ -153,12 +152,6 @@ public final class DefaultTypeManager implements TypeManager { } } - private boolean isPostgresCompatible(DatabasePlatform databasePlatform) { - return databasePlatform.isPlatform(Platform.POSTGRES) - || databasePlatform.isPlatform(Platform.YUGABYTE) - || databasePlatform.isPlatform(Platform.COCKROACH); - } - private boolean hstoreSupport() { return databasePlatform.isPlatform(Platform.POSTGRES); } @@ -194,10 +187,10 @@ public final class DefaultTypeManager implements TypeManager { @Override public ScalarType getScalarType(Type propertyType, Class propertyClass) { if (propertyType instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType)propertyType; + ParameterizedType pt = (ParameterizedType) propertyType; Type rawType = pt.getRawType(); if (List.class == rawType || Set.class == rawType) { - return getArrayScalarType((Class)rawType, propertyType, true); + return getArrayScalarType((Class) rawType, propertyType, true); } } return getScalarType(propertyClass); @@ -241,7 +234,7 @@ public final class DefaultTypeManager implements TypeManager { return found; } // second step - loop through interfaces of this type - for (Class iface: parent.getInterfaces()) { + for (Class iface : parent.getInterfaces()) { found = checkInheritedTypes(iface); if (found != null && found != ScalarTypeNotFound.INSTANCE) { typeMap.put(type, found); // store type for next lookup @@ -349,7 +342,7 @@ public final class DefaultTypeManager implements TypeManager { private DocPropertyType getDocType(Type genericType) { if (genericType instanceof Class) { - ScalarType found = getScalarType((Class)genericType); + ScalarType found = getScalarType((Class) genericType); if (found != null) { return found.docType(); } From aeb4b8ed25f5cc8446f6d6cdc8ee5b1d6f439bda Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 7 Sep 2022 22:41:56 +1200 Subject: [PATCH 3/7] Refactor TypeManager - remove unnecessary add() method from interface allowing it to be private --- .../io/ebeaninternal/server/type/DefaultTypeManager.java | 3 +-- .../main/java/io/ebeaninternal/server/type/TypeManager.java | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) 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 babd896d9..75b2e5622 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 @@ -159,8 +159,7 @@ public final class DefaultTypeManager implements TypeManager { /** * Register a custom ScalarType. */ - @Override - public void add(ScalarType scalarType) { + private void add(ScalarType scalarType) { typeMap.put(scalarType.type(), scalarType); logAdd(scalarType); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java index 746dce154..0c9206149 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java @@ -11,11 +11,6 @@ import java.lang.reflect.Type; */ public interface TypeManager { - /** - * Register a ScalarType with the system. - */ - void add(ScalarType scalarType); - /** * Return the scalar type for the given logical type. */ From 27beab2980b05017477a46c87c70493c8e9a9826 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 7 Sep 2022 22:53:15 +1200 Subject: [PATCH 4/7] Refactor internal TypeManager change/improve its method names --- .../server/deploy/BeanDescriptorManager.java | 6 +- .../deploy/parse/AnnotationAssocManys.java | 6 +- .../server/deploy/parse/AnnotationFields.java | 2 +- .../deploy/parse/DeployCreateProperties.java | 4 +- .../server/deploy/parse/DeployUtil.java | 12 +-- .../server/dto/DtoMetaConstructor.java | 2 +- .../server/dto/DtoMetaProperty.java | 2 +- .../server/json/DJsonScalar.java | 2 +- .../ebeaninternal/server/persist/Binder.java | 4 +- .../server/type/DefaultTypeManager.java | 83 +++++++++---------- .../server/type/TypeManager.java | 23 +++-- .../server/type/DefaultTypeManagerTest.java | 26 +++--- .../server/type/TestTypeManager.java | 26 +++--- 13 files changed, 98 insertions(+), 100 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 9293d9d2c..db5430566 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -184,12 +184,12 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy @Override public ScalarType scalarType(String cast) { - return typeManager.getScalarType(cast); + return typeManager.type(cast); } @Override public ScalarType scalarType(int jdbcType) { - return typeManager.getScalarType(jdbcType); + return typeManager.type(jdbcType); } /** @@ -884,7 +884,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy private void makeOrderColumn(DeployBeanPropertyAssocMany oneToMany) { DeployBeanDescriptor targetDesc = targetDescriptor(oneToMany); DeployOrderColumn orderColumn = oneToMany.getOrderColumn(); - final ScalarType scalarType = typeManager.getScalarType(Integer.class); + final ScalarType scalarType = typeManager.type(Integer.class); DeployBeanProperty orderProperty = new DeployBeanProperty(targetDesc, Integer.class, scalarType, null); orderProperty.setName(DeployOrderColumn.LOGICAL_NAME); orderProperty.setDbColumn(orderColumn.getName()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java index 736602695..538d7c715 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java @@ -222,7 +222,7 @@ final class AnnotationAssocManys extends AnnotationAssoc { dbKeyColumn = mapKeyColumn.name(); } - ScalarType keyScalarType = util.getTypeManager().getScalarType(prop.getMapKeyType()); + ScalarType keyScalarType = util.getTypeManager().type(prop.getMapKeyType()); DeployBeanProperty keyProp = new DeployBeanProperty(elementDescriptor, elementType, keyScalarType, null); setElementProperty(keyProp, "key", dbKeyColumn, sortOrder++); @@ -234,10 +234,10 @@ final class AnnotationAssocManys extends AnnotationAssoc { } } - ScalarType valueScalarType = util.getTypeManager().getScalarType(elementType); + ScalarType valueScalarType = util.getTypeManager().type(elementType); if (valueScalarType == null && elementType.isEnum()) { Class> enumClass = (Class>)elementType; - valueScalarType = util.getTypeManager().createEnumScalarType(enumClass, EnumType.STRING); + valueScalarType = util.getTypeManager().enumType(enumClass, EnumType.STRING); } boolean scalar = true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java index abedce6e4..7111dbfac 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -427,7 +427,7 @@ final class AnnotationFields extends AnnotationParser { private ScalarTypeBytesBase getDbEncryptType(DeployBeanProperty prop) { int dbType = prop.isLob() ? Types.BLOB : Types.VARBINARY; - return (ScalarTypeBytesBase) util.getTypeManager().getScalarType(dbType); + return (ScalarTypeBytesBase) util.getTypeManager().type(dbType); } private DataEncryptSupport createDataEncryptSupport(DeployBeanProperty prop) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployCreateProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployCreateProperties.java index cab048376..e8466ebae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployCreateProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployCreateProperties.java @@ -108,7 +108,7 @@ public final class DeployCreateProperties { @SuppressWarnings({"unchecked"}) private DeployBeanProperty createManyType(DeployBeanDescriptor desc, Class targetType, ManyType manyType) { try { - ScalarType scalarType = typeManager.getScalarType(targetType); + ScalarType scalarType = typeManager.type(targetType); if (scalarType != null) { return new DeployBeanPropertySimpleCollection(desc, targetType, manyType); } @@ -141,7 +141,7 @@ public final class DeployCreateProperties { if (propertyType.isEnum() || propertyType.isPrimitive()) { return new DeployBeanProperty(desc, propertyType, null, null); } - ScalarType scalarType = typeManager.getScalarType(propertyType); + ScalarType scalarType = typeManager.type(propertyType); if (scalarType != null) { return new DeployBeanProperty(desc, propertyType, scalarType, null); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java index c20c0ad86..df0705f65 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java @@ -102,7 +102,7 @@ public final class DeployUtil { try { Class> enumClass = (Class>) enumType; EnumType type = enumerated != null ? enumerated.value() : null; - ScalarType scalarType = typeManager.createEnumScalarType(enumClass, type); + ScalarType scalarType = typeManager.enumType(enumClass, type); prop.setScalarType(scalarType); prop.setDbType(scalarType.jdbcType()); } catch (IllegalStateException e) { @@ -137,7 +137,7 @@ public final class DeployUtil { // set via annotations Class propType = property.getPropertyType(); try { - ScalarType scalarType = typeManager.getScalarType(propType, property.getDbType()); + ScalarType scalarType = typeManager.type(propType, property.getDbType()); if (scalarType != null || property.isTransient()) { return scalarType; } @@ -155,7 +155,7 @@ public final class DeployUtil { * Map to Postgres HSTORE type (with fallback to JSON storage in VARCHAR). */ void setDbMap(DeployBeanProperty prop, DbMap dbMap) { - ScalarType scalarType = typeManager.getDbMapScalarType(); + ScalarType scalarType = typeManager.dbMapType(); int dbType = scalarType.jdbcType(); prop.setDbType(dbType); prop.setScalarType(scalarType); @@ -172,7 +172,7 @@ public final class DeployUtil { */ void setDbArray(DeployBeanProperty prop, DbArray dbArray) { Class type = prop.getPropertyType(); - ScalarType scalarType = typeManager.getArrayScalarType(type, prop.getGenericType(), prop.isNullable()); + ScalarType scalarType = typeManager.dbArrayType(type, prop.getGenericType(), prop.isNullable()); if (scalarType == null) { throw new RuntimeException("No ScalarType for @DbArray type for " + prop.getFullBeanName()); } @@ -204,7 +204,7 @@ public final class DeployUtil { private void setDbJsonType(DeployBeanProperty prop, int dbType, int dbLength, MutationDetection mutationDetection) { prop.setDbType(dbType); prop.setMutationDetection(mutationDetection); - ScalarType scalarType = typeManager.getJsonScalarType(prop, dbType, dbLength); + ScalarType scalarType = typeManager.dbJsonType(prop, dbType, dbLength); if (scalarType == null) { throw new RuntimeException("No ScalarType for JSON property " + prop + " dbType:" + dbType); } @@ -248,7 +248,7 @@ public final class DeployUtil { // this also sets the lob flag on DeployBeanProperty int lobType = isClobType(type) ? dbCLOBType : dbBLOBType; - scalarType = typeManager.getScalarType(type, lobType); + scalarType = typeManager.type(type, lobType); if (scalarType == null) { // this should never occur actually throw new RuntimeException("No ScalarType for LOB type " + type + " dbType:" + lobType); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaConstructor.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaConstructor.java index efd7c97d2..04f213ef0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaConstructor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaConstructor.java @@ -21,7 +21,7 @@ final class DtoMetaConstructor { this.types = constructor.getParameterTypes(); this.scalarTypes = new ScalarType[types.length]; for (int i = 0; i < types.length; i++) { - scalarTypes[i] = typeManager.getScalarType(types[i]); + scalarTypes[i] = typeManager.type(types[i]); } this.handle = LOOKUP.findConstructor(someClass, typeFor(types)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java index b73500434..846c559ed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java @@ -25,7 +25,7 @@ final class DtoMetaProperty implements DtoReadSet { this.name = name; if (writeMethod != null) { this.setter = lookupMethodHandle(dtoType, writeMethod); - this.scalarType = typeManager.getScalarType(propertyType(writeMethod), propertyClass(writeMethod)); + this.scalarType = typeManager.type(propertyType(writeMethod), propertyClass(writeMethod)); } else { this.scalarType = null; this.setter = null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java index 19607be79..cd3420773 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java @@ -36,7 +36,7 @@ public final class DJsonScalar { gen.writeRaw(']'); } else { - ScalarType scalarType = typeManager.getScalarType(value.getClass()); + ScalarType scalarType = typeManager.type(value.getClass()); if (scalarType == null) { throw new IllegalArgumentException("unhandled type " + value.getClass()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java index e51dee906..008163c30 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -38,7 +38,7 @@ public final class Binder { public Binder(TypeManager typeManager, SpiLogManager logManager, int asOfBindCount, boolean asOfStandardsBased, DbExpressionHandler dbExpressionHandler, DataTimeZone dataTimeZone, MultiValueBind multiValueBind) { this.typeManager = typeManager; - this.geoTypeBinder = typeManager.getGeoTypeBinder(); + this.geoTypeBinder = typeManager.geoTypeBinder(); this.asOfBindCount = asOfBindCount; this.asOfStandardsBased = asOfStandardsBased; this.dbExpressionHandler = dbExpressionHandler; @@ -154,7 +154,7 @@ public final class Binder { } public ScalarType getScalarType(Class clazz) { - ScalarType type = typeManager.getScalarType(clazz); + ScalarType type = typeManager.type(clazz); if (type == null) { throw new PersistenceException("No ScalarType registered for " + clazz); } 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 75b2e5622..29685ea99 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 @@ -171,7 +171,7 @@ public final class DefaultTypeManager implements TypeManager { } @Override - public ScalarType getScalarType(String cast) { + public ScalarType type(String cast) { return logicalMap.get(cast); } @@ -179,27 +179,27 @@ public final class DefaultTypeManager implements TypeManager { * Return the ScalarType for the given jdbc type as per java.sql.Types. */ @Override - public ScalarType getScalarType(int jdbcType) { + public ScalarType type(int jdbcType) { return nativeMap.get(jdbcType); } @Override - public ScalarType getScalarType(Type propertyType, Class propertyClass) { + public ScalarType type(Type propertyType, Class propertyClass) { if (propertyType instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) propertyType; Type rawType = pt.getRawType(); if (List.class == rawType || Set.class == rawType) { - return getArrayScalarType((Class) rawType, propertyType, true); + return dbArrayType((Class) rawType, propertyType, true); } } - return getScalarType(propertyClass); + return type(propertyClass); } /** * This can return null if no matching ScalarType is found. */ @Override - public ScalarType getScalarType(Class type) { + public ScalarType type(Class type) { ScalarType found = typeMap.get(type); if (found == null) { if (type.getName().equals("org.joda.time.LocalTime")) { @@ -247,37 +247,37 @@ public final class DefaultTypeManager implements TypeManager { } @Override - public GeoTypeBinder getGeoTypeBinder() { + public GeoTypeBinder geoTypeBinder() { return geoTypeBinder; } @Override - public ScalarType getDbMapScalarType() { + public ScalarType dbMapType() { return hstoreSupport() ? hstoreType : ScalarTypeJsonMap.typeFor(false, Types.VARCHAR, false); } @Override - public ScalarType getArrayScalarType(Class type, Type genericType, boolean nullable) { - Type valueType = getValueType(genericType); + public ScalarType dbArrayType(Class type, Type genericType, boolean nullable) { + Type valueType = valueType(genericType); if (type.equals(List.class)) { - return getArrayScalarTypeList(valueType, nullable); + return dbArrayTypeList(valueType, nullable); } else if (type.equals(Set.class)) { - return getArrayScalarTypeSet(valueType, nullable); + return dbArrayTypeSet(valueType, nullable); } else { throw new IllegalStateException("@DbArray does not support type " + type); } } - private ScalarType getArrayScalarTypeSet(Type valueType, boolean nullable) { + private ScalarType dbArrayTypeSet(Type valueType, boolean nullable) { if (isEnumType(valueType)) { - return arrayTypeSetFactory.typeForEnum(createEnumScalarType(asEnumClass(valueType), null), nullable); + return arrayTypeSetFactory.typeForEnum(enumType(asEnumClass(valueType), null), nullable); } return arrayTypeSetFactory.typeFor(valueType, nullable); } - private ScalarType getArrayScalarTypeList(Type valueType, boolean nullable) { + private ScalarType dbArrayTypeList(Type valueType, boolean nullable) { if (isEnumType(valueType)) { - return arrayTypeListFactory.typeForEnum(createEnumScalarType(asEnumClass(valueType), null), nullable); + return arrayTypeListFactory.typeForEnum(enumType(asEnumClass(valueType), null), nullable); } return arrayTypeListFactory.typeFor(valueType, nullable); } @@ -291,7 +291,7 @@ public final class DefaultTypeManager implements TypeManager { } @Override - public ScalarType getJsonScalarType(DeployBeanProperty prop, int dbType, int dbLength) { + public ScalarType dbJsonType(DeployBeanProperty prop, int dbType, int dbLength) { Class type = prop.getPropertyType(); Type genericType = prop.getGenericType(); boolean hasJacksonAnnotations = objectMapperPresent && checkJacksonAnnotations(prop); @@ -300,7 +300,7 @@ public final class DefaultTypeManager implements TypeManager { return ScalarTypeJsonString.typeFor(postgres, dbType); } if (type.equals(List.class)) { - DocPropertyType docType = getDocType(genericType); + DocPropertyType docType = docType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); } else { @@ -308,7 +308,7 @@ public final class DefaultTypeManager implements TypeManager { } } if (type.equals(Set.class)) { - DocPropertyType docType = getDocType(genericType); + DocPropertyType docType = docType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); } else { @@ -339,9 +339,9 @@ public final class DefaultTypeManager implements TypeManager { return prop.getMetaAnnotation(com.fasterxml.jackson.annotation.JacksonAnnotation.class) != null; } - private DocPropertyType getDocType(Type genericType) { + private DocPropertyType docType(Type genericType) { if (genericType instanceof Class) { - ScalarType found = getScalarType((Class) genericType); + ScalarType found = type((Class) genericType); if (found != null) { return found.docType(); } @@ -357,7 +357,7 @@ public final class DefaultTypeManager implements TypeManager { return String.class.equals(typeArg) || Long.class.equals(typeArg); } - private Type getValueType(Type collectionType) { + private Type valueType(Type collectionType) { return TypeReflectHelper.getValueType(collectionType); } @@ -384,7 +384,7 @@ public final class DefaultTypeManager implements TypeManager { * different jdbcTypes in a single system. */ @Override - public ScalarType getScalarType(Class type, int jdbcType) { + public ScalarType type(Class type, int jdbcType) { // File is a special Lob so check for that first if (File.class.equals(type)) { return fileType; @@ -393,13 +393,13 @@ public final class DefaultTypeManager implements TypeManager { // check for Clob, LongVarchar etc ... // the reason being that String maps to multiple jdbc types // varchar, clob, longVarchar. - ScalarType scalarType = getLobTypes(jdbcType); + ScalarType scalarType = lobTypes(jdbcType); if (scalarType != null) { // it is a specific Lob type... return scalarType; } - scalarType = getScalarType(type); + scalarType = type(type); if (scalarType != null) { if (jdbcType == 0 || scalarType.jdbcType() == jdbcType) { // matching type @@ -425,8 +425,8 @@ public final class DefaultTypeManager implements TypeManager { * types - like String - Varchar, LongVarchar, Clob. For this reason I check * for the specific Lob types first before looking for a matching type. */ - private ScalarType getLobTypes(int jdbcType) { - return getScalarType(jdbcType); + private ScalarType lobTypes(int jdbcType) { + return type(jdbcType); } /** @@ -470,7 +470,7 @@ public final class DefaultTypeManager implements TypeManager { *

* Return null if the EnumValue annotations are not present/used. */ - private ScalarTypeEnum createEnumScalarType2(Class enumType) { + private ScalarTypeEnum enumTypeEnumValue(Class enumType) { boolean integerType = true; Map nameValueMap = new LinkedHashMap<>(); for (Field field : enumType.getDeclaredFields()) { @@ -499,8 +499,8 @@ public final class DefaultTypeManager implements TypeManager { * much shorter codes used in the DB. */ @Override - public ScalarType createEnumScalarType(Class> enumType, EnumType type) { - ScalarType scalarType = getScalarType(enumType); + public ScalarType enumType(Class> enumType, EnumType type) { + ScalarType scalarType = type(enumType); if (scalarType instanceof ScalarTypeWrapper) { // no override or further mapping required return scalarType; @@ -512,16 +512,16 @@ public final class DefaultTypeManager implements TypeManager { } return scalarEnum; } - scalarEnum = createEnumScalarTypePerExtentions(enumType); + scalarEnum = enumTypePerExtensions(enumType); if (scalarEnum == null) { // use JPA normal Enum type (without mapping) - scalarEnum = createEnumScalarTypePerSpec(enumType, type); + scalarEnum = enumTypePerSpec(enumType, type); } add(scalarEnum); return scalarEnum; } - private ScalarTypeEnum createEnumScalarTypePerSpec(Class enumType, EnumType type) { + private ScalarTypeEnum enumTypePerSpec(Class enumType, EnumType type) { if (type == null) { if (defaultEnumType == EnumType.ORDINAL) { return new ScalarTypeEnumStandard.OrdinalEnum(enumType); @@ -535,16 +535,16 @@ public final class DefaultTypeManager implements TypeManager { } } - private ScalarTypeEnum createEnumScalarTypePerExtentions(Class> enumType) { + private ScalarTypeEnum enumTypePerExtensions(Class> enumType) { for (Method method : enumType.getMethods()) { DbEnumValue dbValue = AnnotationUtil.get(method, DbEnumValue.class); if (dbValue != null) { boolean integerValues = DbEnumType.INTEGER == dbValue.storage(); - return createEnumScalarTypeDbValue(enumType, method, integerValues, dbValue.length(), dbValue.withConstraint()); + return enumTypeDbValue(enumType, method, integerValues, dbValue.length(), dbValue.withConstraint()); } } // look for EnumValue annotations instead - return createEnumScalarType2(enumType); + return enumTypeEnumValue(enumType); } /** @@ -552,7 +552,7 @@ public final class DefaultTypeManager implements TypeManager { *

* Return null if the EnumValue annotations are not present/used. */ - private ScalarTypeEnum createEnumScalarTypeDbValue(Class> enumType, Method method, boolean integerType, int length, boolean withConstraint) { + private ScalarTypeEnum enumTypeDbValue(Class> enumType, Method method, boolean integerType, int length, boolean withConstraint) { Map nameValueMap = new LinkedHashMap<>(); for (Enum enumConstant : enumType.getEnumConstants()) { try { @@ -634,7 +634,7 @@ public final class DefaultTypeManager implements TypeManager { } Class logicalType = paramTypes[0]; Class persistType = paramTypes[1]; - ScalarType wrappedType = getScalarType(persistType); + ScalarType wrappedType = type(persistType); if (wrappedType == null) { throw new IllegalStateException("Could not find ScalarType for: " + paramTypes[1]); } @@ -658,7 +658,7 @@ public final class DefaultTypeManager implements TypeManager { } Class logicalType = paramTypes[0]; Class persistType = paramTypes[1]; - ScalarType wrappedType = getScalarType(persistType); + ScalarType wrappedType = type(persistType); if (wrappedType == null) { throw new IllegalStateException("Could not find ScalarType for: " + paramTypes[1]); } @@ -674,8 +674,7 @@ public final class DefaultTypeManager implements TypeManager { private void initialiseJavaTimeTypes(DatabaseConfig config) { - - ZoneId zoneId = getZoneId(config); + ZoneId zoneId = zoneId(config); typeMap.put(java.nio.file.Path.class, new ScalarTypePath()); addType(java.time.Period.class, new ScalarTypePeriod()); @@ -702,7 +701,7 @@ public final class DefaultTypeManager implements TypeManager { addType(Duration.class, (durationNanos) ? new ScalarTypeDurationWithNanos() : new ScalarTypeDuration()); } - private ZoneId getZoneId(DatabaseConfig config) { + private ZoneId zoneId(DatabaseConfig config) { final String dataTimeZone = config.getDataTimeZone(); return (dataTimeZone == null) ? ZoneOffset.systemDefault() : TimeZone.getTimeZone(dataTimeZone).toZoneId(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java index 0c9206149..e683b43e6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java @@ -14,39 +14,38 @@ public interface TypeManager { /** * Return the scalar type for the given logical type. */ - ScalarType getScalarType(String cast); + ScalarType type(String cast); /** * Return the ScalarType for a given jdbc type. * * @param jdbcType as per java.sql.Types */ - ScalarType getScalarType(int jdbcType); + ScalarType type(int jdbcType); /** * Return the ScalarType for a given logical type. */ - ScalarType getScalarType(Class type); + ScalarType type(Class type); /** * For java.util.Date and java.util.Calendar additionally pass the jdbc type * that you would like the ScalarType to map to. This is because these types * can map to different java.sql.Types depending on the property. */ - ScalarType getScalarType(Class type, int jdbcType); + ScalarType type(Class type, int jdbcType); /** * Find and return the ScalarType taking into account the property type with generics. *

* For example Array based ScalarType for types like {@code List}. */ - ScalarType getScalarType(Type propertyType, Class type); + ScalarType type(Type propertyType, Class type); /** - * Create a ScalarType for an Enum using a mapping (rather than JPA Ordinal - * or String which has limitations). + * Create a ScalarType for an Enum using a mapping (rather than JPA Ordinal or String which has limitations). */ - ScalarType createEnumScalarType(Class> enumType, EnumType enumerated); + ScalarType enumType(Class> enumType, EnumType enumerated); /** * Return the ScalarType used to handle JSON content. @@ -54,20 +53,20 @@ public interface TypeManager { * Note that type expected to be JsonNode or Map. *

*/ - ScalarType getJsonScalarType(DeployBeanProperty prop, int dbType, int dbLength); + ScalarType dbJsonType(DeployBeanProperty prop, int dbType, int dbLength); /** * Return the ScalarType used to handle DB ARRAY. */ - ScalarType getArrayScalarType(Class type, Type genericType, boolean nullable); + ScalarType dbArrayType(Class type, Type genericType, boolean nullable); /** * Return the ScalarType used to handle HSTORE (Map). */ - ScalarType getDbMapScalarType(); + ScalarType dbMapType(); /** * Return the Geometry type binder if provided. */ - GeoTypeBinder getGeoTypeBinder(); + GeoTypeBinder geoTypeBinder(); } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/DefaultTypeManagerTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/type/DefaultTypeManagerTest.java index bf5d7a3df..b3bdc17db 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/DefaultTypeManagerTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/type/DefaultTypeManagerTest.java @@ -46,14 +46,14 @@ public class DefaultTypeManagerTest { public void enumDayMonth_builtIn_overrideAsString() { DefaultTypeManager typeManager = create(); - ScalarType type = typeManager.createEnumScalarType(Month.class, null); + ScalarType type = typeManager.enumType(Month.class, null); assertThat(type).isInstanceOf(ScalarTypeEnumWithMapping.class).as("built in type"); // mapped explicitly as JPA EnumType.STRING - type = typeManager.createEnumScalarType(Month.class, EnumType.STRING); + type = typeManager.enumType(Month.class, EnumType.STRING); assertThat(type).isInstanceOf(ScalarTypeEnumStandard.StringEnum.class).as("override built in type"); try { - typeManager.createEnumScalarType(Month.class, EnumType.ORDINAL); + typeManager.enumType(Month.class, EnumType.ORDINAL); assertThat(true).isFalse().as("never get here"); } catch (IllegalStateException e) { @@ -66,10 +66,10 @@ public class DefaultTypeManagerTest { DefaultTypeManager typeManager = create(); // mapped explicitly as JPA EnumType.STRING - ScalarType type = typeManager.createEnumScalarType(Month.class, EnumType.ORDINAL); + ScalarType type = typeManager.enumType(Month.class, EnumType.ORDINAL); assertThat(type).isInstanceOf(ScalarTypeEnumStandard.OrdinalEnum.class).as("override built in type"); try { - typeManager.createEnumScalarType(Month.class, EnumType.STRING); + typeManager.enumType(Month.class, EnumType.STRING); assertThat(true).isFalse().as("never get here"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("It is mapped using 2 different modes when only one is supported"); @@ -80,14 +80,14 @@ public class DefaultTypeManagerTest { public void enumDayOfWeek_builtIn_overrideAsString() { DefaultTypeManager typeManager = create(); - ScalarType type = typeManager.createEnumScalarType(DayOfWeek.class, null); + ScalarType type = typeManager.enumType(DayOfWeek.class, null); assertThat(type).isInstanceOf(ScalarTypeEnumWithMapping.class).as("built in type"); // mapped explicitly as JPA EnumType.STRING - type = typeManager.createEnumScalarType(DayOfWeek.class, EnumType.STRING); + type = typeManager.enumType(DayOfWeek.class, EnumType.STRING); assertThat(type).isInstanceOf(ScalarTypeEnumStandard.StringEnum.class).as("override built in type"); try { - typeManager.createEnumScalarType(DayOfWeek.class, EnumType.ORDINAL); + typeManager.enumType(DayOfWeek.class, EnumType.ORDINAL); assertThat(true).isFalse().as("never get here"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("It is mapped using 2 different modes when only one is supported"); @@ -99,10 +99,10 @@ public class DefaultTypeManagerTest { DefaultTypeManager typeManager = create(); // mapped explicitly as JPA EnumType.STRING - ScalarType type = typeManager.createEnumScalarType(DayOfWeek.class, EnumType.ORDINAL); + ScalarType type = typeManager.enumType(DayOfWeek.class, EnumType.ORDINAL); assertThat(type).isInstanceOf(ScalarTypeEnumStandard.OrdinalEnum.class).as("override built in type"); try { - typeManager.createEnumScalarType(DayOfWeek.class, EnumType.STRING); + typeManager.enumType(DayOfWeek.class, EnumType.STRING); assertThat(true).isFalse().as("never get here"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("It is mapped using 2 different modes when only one is supported"); @@ -113,19 +113,19 @@ public class DefaultTypeManagerTest { public void createEnumScalarTypePerExtentions() { DefaultTypeManager typeManager = create(); - ScalarType type = typeManager.createEnumScalarType(VarcharEnum.class, EnumType.ORDINAL); + ScalarType type = typeManager.enumType(VarcharEnum.class, EnumType.ORDINAL); assertThat(type).isInstanceOf(ScalarTypeEnumWithMapping.class); // withConstraint false assertThat(((ScalarTypeEnumWithMapping) type).getDbCheckConstraintValues()).isNull(); - type = typeManager.createEnumScalarType(IntEnum.class, EnumType.ORDINAL); + type = typeManager.enumType(IntEnum.class, EnumType.ORDINAL); assertThat(type).isInstanceOf(ScalarTypeEnumWithMapping.class); ScalarTypeEnumWithMapping enumWithMapping = (ScalarTypeEnumWithMapping) type; // withConstraint true assertThat(enumWithMapping.getDbCheckConstraintValues()).hasSize(3); assertThat(enumWithMapping.getDbCheckConstraintValues()).contains("100", "101", "102"); - type = typeManager.createEnumScalarType(Car.Size.class, EnumType.ORDINAL); + type = typeManager.enumType(Car.Size.class, EnumType.ORDINAL); assertThat(type).isInstanceOf(ScalarTypeEnumWithMapping.class); enumWithMapping = (ScalarTypeEnumWithMapping) type; // withConstraint true diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java b/ebean-core/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java index 342a02b5f..f99991ebd 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java @@ -31,7 +31,7 @@ class TestTypeManager extends BaseTest { void testEnumWithSubclasses() throws SQLException { DefaultTypeManager typeManager = createTypeManager(); - ScalarType type = typeManager.createEnumScalarType(MyEnum.class, null); + ScalarType type = typeManager.enumType(MyEnum.class, null); DataReader reader = mock(DataReader.class); when(reader.getString()).thenReturn("A"); @@ -44,17 +44,17 @@ class TestTypeManager extends BaseTest { val = type.read(reader); assertThat(val).isEqualTo(MyEnum.Cval); - ScalarType typeGeneral = typeManager.getScalarType(MyEnum.class); + ScalarType typeGeneral = typeManager.type(MyEnum.class); assertThat(typeGeneral).isNotNull(); - ScalarType typeB = typeManager.getScalarType(MyEnum.Bval.getClass()); + ScalarType typeB = typeManager.type(MyEnum.Bval.getClass()); assertThat(typeB).isNotNull(); - ScalarType typeA = typeManager.getScalarType(MyEnum.Aval.getClass()); + ScalarType typeA = typeManager.type(MyEnum.Aval.getClass()); assertThat(typeA).isNotNull(); - ScalarType typeC = typeManager.getScalarType(MyEnum.Cval.getClass()); + ScalarType typeC = typeManager.type(MyEnum.Cval.getClass()); assertThat(typeC).isNotNull(); try { - typeManager.createEnumScalarType(MyEnum.class, EnumType.STRING); + typeManager.enumType(MyEnum.class, EnumType.STRING); fail("never get here"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("It is mapped using 2 different modes when only one is supported"); @@ -65,7 +65,7 @@ class TestTypeManager extends BaseTest { void testEnumWithChar() throws SQLException { DefaultTypeManager typeManager = createTypeManager(); - ScalarType dayOfWeekType = typeManager.createEnumScalarType(MyDayOfWeek.class, null); + ScalarType dayOfWeekType = typeManager.enumType(MyDayOfWeek.class, null); DataReader reader = mock(DataReader.class); when(reader.getString()).thenReturn("MONDAY "); Object val = dayOfWeekType.read(reader); @@ -88,7 +88,7 @@ class TestTypeManager extends BaseTest { assertThat(val).isEqualTo(MyDayOfWeek.FRIDAY); try { - typeManager.createEnumScalarType(MyDayOfWeek.class, EnumType.ORDINAL); + typeManager.enumType(MyDayOfWeek.class, EnumType.ORDINAL); fail("never get here"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("It is mapped using 2 different modes when only one is supported"); @@ -99,7 +99,7 @@ class TestTypeManager extends BaseTest { void test() { DefaultTypeManager typeManager = createTypeManager(); - ScalarType scalarType = typeManager.getScalarType(Money.class); + ScalarType scalarType = typeManager.type(Money.class); assertEquals(Types.DECIMAL, scalarType.jdbcType()); assertFalse(scalarType.jdbcNative()); assertEquals(Money.class, scalarType.type()); @@ -108,15 +108,15 @@ class TestTypeManager extends BaseTest { @Test void testWithConfig() { DefaultTypeManager typeManager1 = createTypeManager(); - ScalarType type1 = typeManager1.createEnumScalarType(MySex.class, null); + ScalarType type1 = typeManager1.enumType(MySex.class, null); assertThat(type1).isInstanceOf(ScalarTypeEnumStandard.OrdinalEnum.class); // DefaultTypeManager typeManager2 = createTypeManagerDefaultEnumTypeString(); - ScalarType type2 = typeManager2.createEnumScalarType(MySex.class, null); + ScalarType type2 = typeManager2.enumType(MySex.class, null); assertThat(type2).isInstanceOf(ScalarTypeEnumStandard.StringEnum.class); // DefaultTypeManager typeManager3 = createTypeManagerDefaultEnumTypeString(); - ScalarType type3 = typeManager3.createEnumScalarType(MySex.class, EnumType.ORDINAL); + ScalarType type3 = typeManager3.enumType(MySex.class, EnumType.ORDINAL); assertThat(type3).isInstanceOf(ScalarTypeEnumStandard.OrdinalEnum.class); } @@ -144,7 +144,7 @@ class TestTypeManager extends BaseTest { @Test void testCalendar() { DefaultTypeManager typeManager = createTypeManager(); - ScalarType typeB = typeManager.getScalarType(GregorianCalendar.class); + ScalarType typeB = typeManager.type(GregorianCalendar.class); assertThat(typeB).isInstanceOf(ScalarTypeCalendar.class); } From cba3d24df129bc235bac69c0319720242121fa13 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 7 Sep 2022 22:56:43 +1200 Subject: [PATCH 5/7] Refactor DeployUtil rename methods (change/improve method names) --- .../server/deploy/BeanDescriptorManager.java | 2 +- .../deploy/parse/AnnotationAssocManys.java | 6 +++--- .../server/deploy/parse/AnnotationBase.java | 4 ++-- .../server/deploy/parse/AnnotationFields.java | 6 +++--- .../server/deploy/parse/DeployUtil.java | 16 ++++++++-------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index db5430566..5f2792f6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -145,7 +145,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy this.dbIdentity = config.getDatabasePlatform().dbIdentity(); this.deplyInherit = config.getDeployInherit(); this.deployUtil = config.getDeployUtil(); - this.typeManager = deployUtil.getTypeManager(); + this.typeManager = deployUtil.typeManager(); this.beanManagerFactory = new BeanManagerFactory(config.getDatabasePlatform()); this.beanLifecycleAdapterFactory = new BeanLifecycleAdapterFactory(this.config); this.persistControllerManager = new PersistControllerManager(bootupClasses); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java index 538d7c715..0d29c3ba4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java @@ -222,7 +222,7 @@ final class AnnotationAssocManys extends AnnotationAssoc { dbKeyColumn = mapKeyColumn.name(); } - ScalarType keyScalarType = util.getTypeManager().type(prop.getMapKeyType()); + ScalarType keyScalarType = util.typeManager().type(prop.getMapKeyType()); DeployBeanProperty keyProp = new DeployBeanProperty(elementDescriptor, elementType, keyScalarType, null); setElementProperty(keyProp, "key", dbKeyColumn, sortOrder++); @@ -234,10 +234,10 @@ final class AnnotationAssocManys extends AnnotationAssoc { } } - ScalarType valueScalarType = util.getTypeManager().type(elementType); + ScalarType valueScalarType = util.typeManager().type(elementType); if (valueScalarType == null && elementType.isEnum()) { Class> enumClass = (Class>)elementType; - valueScalarType = util.getTypeManager().enumType(enumClass, EnumType.STRING); + valueScalarType = util.typeManager().enumType(enumClass, EnumType.STRING); } boolean scalar = true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationBase.java index 1d182c6a6..35179b876 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationBase.java @@ -52,9 +52,9 @@ abstract class AnnotationBase { AnnotationBase(DeployUtil util) { this.util = util; - this.databasePlatform = util.getDbPlatform(); + this.databasePlatform = util.dbPlatform(); this.platform = databasePlatform.platform(); - this.namingConvention = util.getNamingConvention(); + this.namingConvention = util.namingConvention(); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java index 7111dbfac..b2b0a4dd7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -301,7 +301,7 @@ final class AnnotationFields extends AnnotationParser { private void initEncrypt(DeployBeanProperty prop) { if (!prop.isTransient()) { - EncryptDeploy encryptDeploy = util.getEncryptDeploy(info.getDescriptor().getBaseTableFull(), prop.getDbColumn()); + EncryptDeploy encryptDeploy = util.encryptDeploy(info.getDescriptor().getBaseTableFull(), prop.getDbColumn()); if (encryptDeploy == null || encryptDeploy.getMode() == Mode.MODE_ANNOTATION) { Encrypted encrypted = get(prop, Encrypted.class); if (encrypted != null) { @@ -398,7 +398,7 @@ final class AnnotationFields extends AnnotationParser { return; } if (dbEncString) { - DbEncrypt dbEncrypt = util.getDbPlatform().dbEncrypt(); + DbEncrypt dbEncrypt = util.dbPlatform().dbEncrypt(); if (dbEncrypt != null) { // check if we have a DB encryption function for this type int jdbcType = prop.getScalarType().jdbcType(); @@ -427,7 +427,7 @@ final class AnnotationFields extends AnnotationParser { private ScalarTypeBytesBase getDbEncryptType(DeployBeanProperty prop) { int dbType = prop.isLob() ? Types.BLOB : Types.VARBINARY; - return (ScalarTypeBytesBase) util.getTypeManager().type(dbType); + return (ScalarTypeBytesBase) util.typeManager().type(dbType); } private DataEncryptSupport createDataEncryptSupport(DeployBeanProperty prop) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java index df0705f65..956de6314 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployUtil.java @@ -60,15 +60,15 @@ public final class DeployUtil { this.useValidationNotNull = config.isUseValidationNotNull(); } - public TypeManager getTypeManager() { + public TypeManager typeManager() { return typeManager; } - public DatabasePlatform getDbPlatform() { + public DatabasePlatform dbPlatform() { return dbPlatform; } - public NamingConvention getNamingConvention() { + public NamingConvention namingConvention() { return namingConvention; } @@ -82,7 +82,7 @@ public final class DeployUtil { } } - EncryptDeploy getEncryptDeploy(TableName table, String column) { + EncryptDeploy encryptDeploy(TableName table, String column) { if (encryptDeployManager == null) { return EncryptDeploy.ANNOTATION; } @@ -123,7 +123,7 @@ public final class DeployUtil { // this will be an Enum type... return; } - ScalarType scalarType = getScalarType(property); + ScalarType scalarType = scalarType(property); if (scalarType != null) { // set the jdbc type this maps to property.setDbType(scalarType.jdbcType()); @@ -132,7 +132,7 @@ public final class DeployUtil { } } - private ScalarType getScalarType(DeployBeanProperty property) { + private ScalarType scalarType(DeployBeanProperty property) { // Note that Temporal types already have dbType // set via annotations Class propType = property.getPropertyType(); @@ -193,7 +193,7 @@ public final class DeployUtil { } void setDbJsonType(DeployBeanProperty prop, DbJson dbJsonType) { - int dbType = getDbJsonStorage(dbJsonType.storage()); + int dbType = dbJsonStorage(dbJsonType.storage()); setDbJsonType(prop, dbType, dbJsonType.length(), dbJsonType.mutationDetection()); } @@ -219,7 +219,7 @@ public final class DeployUtil { /** * Return the JDBC type for the JSON storage type. */ - private int getDbJsonStorage(DbJsonType dbJsonType) { + private int dbJsonStorage(DbJsonType dbJsonType) { switch (dbJsonType) { case JSONB: return DbPlatformType.JSONB; From 5981d313ae786f00bdfbfa71b4e052b9edf0b030 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 8 Sep 2022 14:50:58 +1200 Subject: [PATCH 6/7] Rename ebean-json-node module to ebean-jackson-jsonnode --- composites/ebean/pom.xml | 2 +- ebean-bom/pom.xml | 2 +- {ebean-json-node => ebean-jackson-jsonnode}/pom.xml | 2 +- .../src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java | 0 .../java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java | 0 .../main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java | 0 .../io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java | 0 .../src/main/java/module-info.java | 2 +- .../META-INF/services/io.ebean.core.type.ScalarTypeSetFactory | 0 ebean-test/pom.xml | 2 +- pom.xml | 2 +- 11 files changed, 6 insertions(+), 6 deletions(-) rename {ebean-json-node => ebean-jackson-jsonnode}/pom.xml (96%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java (100%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java (100%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java (100%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java (100%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/java/module-info.java (87%) rename {ebean-json-node => ebean-jackson-jsonnode}/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory (100%) diff --git a/composites/ebean/pom.xml b/composites/ebean/pom.xml index 8c41257dc..d6ef2cb13 100644 --- a/composites/ebean/pom.xml +++ b/composites/ebean/pom.xml @@ -33,7 +33,7 @@ io.ebean - ebean-json-node + ebean-jackson-jsonnode 13.9.3-SNAPSHOT diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index 6813c7840..eb1e958e3 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -118,7 +118,7 @@ io.ebean - ebean-json-node + ebean-jackson-jsonnode 13.9.3-SNAPSHOT diff --git a/ebean-json-node/pom.xml b/ebean-jackson-jsonnode/pom.xml similarity index 96% rename from ebean-json-node/pom.xml rename to ebean-jackson-jsonnode/pom.xml index dfefb9b9f..6f84c8d21 100644 --- a/ebean-json-node/pom.xml +++ b/ebean-jackson-jsonnode/pom.xml @@ -9,7 +9,7 @@ 13.9.3-SNAPSHOT - ebean-json-node + ebean-jackson-jsonnode 19 diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java b/ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java similarity index 100% rename from ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java rename to ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/JsonNodeSet.java diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java b/ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java similarity index 100% rename from ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java rename to ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/JsonNodeTypeFactory.java diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java b/ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java similarity index 100% rename from ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java rename to ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNode.java diff --git a/ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java b/ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java similarity index 100% rename from ebean-json-node/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java rename to ebean-jackson-jsonnode/src/main/java/io/ebean/jackson/jsonnode/ScalarTypeJsonNodePostgres.java diff --git a/ebean-json-node/src/main/java/module-info.java b/ebean-jackson-jsonnode/src/main/java/module-info.java similarity index 87% rename from ebean-json-node/src/main/java/module-info.java rename to ebean-jackson-jsonnode/src/main/java/module-info.java index ae48a30fb..84fc02973 100644 --- a/ebean-json-node/src/main/java/module-info.java +++ b/ebean-jackson-jsonnode/src/main/java/module-info.java @@ -1,6 +1,6 @@ import io.ebean.jackson.jsonnode.JsonNodeTypeFactory; -module io.ebean.json.node { +module io.ebean.jackson.jsonnode { requires io.ebean.core.type; requires com.fasterxml.jackson.core; diff --git a/ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory b/ebean-jackson-jsonnode/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory similarity index 100% rename from ebean-json-node/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory rename to ebean-jackson-jsonnode/src/main/resources/META-INF/services/io.ebean.core.type.ScalarTypeSetFactory diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index 9e334b365..4a71e45cf 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -111,7 +111,7 @@ io.ebean - ebean-json-node + ebean-jackson-jsonnode 13.9.3-SNAPSHOT test diff --git a/pom.xml b/pom.xml index f2c505822..de0c4f3b7 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ composites ebean-joda-time ebean-csv-reader - ebean-json-node + ebean-jackson-jsonnode From c53ca6c16e13a0606d9e50fa8cc80a341e418503 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 8 Sep 2022 14:53:33 +1200 Subject: [PATCH 7/7] Rename ebean-json-node module to ebean-jackson-jsonnode --- ebean-jackson-jsonnode/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ebean-jackson-jsonnode/pom.xml b/ebean-jackson-jsonnode/pom.xml index 6f84c8d21..a77ddcdcc 100644 --- a/ebean-jackson-jsonnode/pom.xml +++ b/ebean-jackson-jsonnode/pom.xml @@ -11,13 +11,6 @@ ebean-jackson-jsonnode - - 19 - 19 - UTF-8 - - -