diff --git a/composites/ebean-clickhouse/pom.xml b/composites/ebean-clickhouse/pom.xml index 5af91d8b0..29758dc5e 100644 --- a/composites/ebean-clickhouse/pom.xml +++ b/composites/ebean-clickhouse/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-clickhouse @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-clickhouse - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-cockroach/pom.xml b/composites/ebean-cockroach/pom.xml index ab97f9642..cae0bb35a 100644 --- a/composites/ebean-cockroach/pom.xml +++ b/composites/ebean-cockroach/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-cockroach @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-postgres - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-db2/pom.xml b/composites/ebean-db2/pom.xml index 3718fd183..cece1db86 100644 --- a/composites/ebean-db2/pom.xml +++ b/composites/ebean-db2/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-db2 @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-db2 - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-h2/pom.xml b/composites/ebean-h2/pom.xml index 8918b1a3e..be909354c 100644 --- a/composites/ebean-h2/pom.xml +++ b/composites/ebean-h2/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-h2 @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-h2 - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-hana/pom.xml b/composites/ebean-hana/pom.xml index 31619dbdf..b16776d69 100644 --- a/composites/ebean-hana/pom.xml +++ b/composites/ebean-hana/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-hana @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-hana - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-mariadb/pom.xml b/composites/ebean-mariadb/pom.xml index f3a5c357b..07112691b 100644 --- a/composites/ebean-mariadb/pom.xml +++ b/composites/ebean-mariadb/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-mariadb @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-mariadb - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-mysql/pom.xml b/composites/ebean-mysql/pom.xml index 0e9219f31..7fa5080ab 100644 --- a/composites/ebean-mysql/pom.xml +++ b/composites/ebean-mysql/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-mysql @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-mysql - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-nuodb/pom.xml b/composites/ebean-nuodb/pom.xml index 67d293d1e..01d6fb3ee 100644 --- a/composites/ebean-nuodb/pom.xml +++ b/composites/ebean-nuodb/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-nuodb @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-nuodb - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-oracle/pom.xml b/composites/ebean-oracle/pom.xml index cf9a9224c..a6451554f 100644 --- a/composites/ebean-oracle/pom.xml +++ b/composites/ebean-oracle/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-oracle @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-oracle - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-postgres/pom.xml b/composites/ebean-postgres/pom.xml index c08967655..e65fa5477 100644 --- a/composites/ebean-postgres/pom.xml +++ b/composites/ebean-postgres/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-postgres @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-postgres - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-sqlite/pom.xml b/composites/ebean-sqlite/pom.xml index 8149565f9..823d3d387 100644 --- a/composites/ebean-sqlite/pom.xml +++ b/composites/ebean-sqlite/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-sqlite @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-sqlite - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-sqlserver/pom.xml b/composites/ebean-sqlserver/pom.xml index 9ab1a547a..a4702098d 100644 --- a/composites/ebean-sqlserver/pom.xml +++ b/composites/ebean-sqlserver/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-sqlserver @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-sqlserver - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean-yugabyte/pom.xml b/composites/ebean-yugabyte/pom.xml index 9a0b0c8ea..5222eed93 100644 --- a/composites/ebean-yugabyte/pom.xml +++ b/composites/ebean-yugabyte/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-yugabyte @@ -16,13 +16,13 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -35,13 +35,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-postgres - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/ebean/pom.xml b/composites/ebean/pom.xml index e30c463f9..f524e247b 100644 --- a/composites/ebean/pom.xml +++ b/composites/ebean/pom.xml @@ -4,7 +4,7 @@ composites io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean (all platforms) @@ -16,13 +16,31 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-joda-time + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-jackson-jsonnode + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-jackson-mapper + 13.10.1-SNAPSHOT @@ -35,13 +53,13 @@ io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-platform-all - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT diff --git a/composites/pom.xml b/composites/pom.xml index 3a32d4775..29c05f3ca 100644 --- a/composites/pom.xml +++ b/composites/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT composites diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index df62cb7f4..0770152d5 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean api @@ -13,15 +13,17 @@ - - org.slf4j - slf4j-api - 1.7.36 - provided + io.avaje + avaje-applog + 1.0 + + + + + io.avaje + avaje-applog-slf4j + 1.0 @@ -30,12 +32,6 @@ 2.2 - - io.avaje - avaje-applog-slf4j - 1.0 - - + + org.slf4j + slf4j-api + 1.7.36 + true + + com.fasterxml.jackson.core diff --git a/ebean-api/src/main/java/io/ebean/DB.java b/ebean-api/src/main/java/io/ebean/DB.java index e922fd94e..f20bcb740 100644 --- a/ebean-api/src/main/java/io/ebean/DB.java +++ b/ebean-api/src/main/java/io/ebean/DB.java @@ -5,7 +5,6 @@ import io.avaje.lang.Nullable; import io.ebean.annotation.TxIsolation; import io.ebean.cache.ServerCacheManager; import io.ebean.plugin.Property; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import javax.persistence.OptimisticLockException; @@ -785,12 +784,6 @@ public final class DB { return getDefault().createUpdate(beanType, ormUpdate); } - /** - * Create a CsvReader for a given beanType. - */ - public static CsvReader createCsvReader(Class beanType) { - return getDefault().createCsvReader(beanType); - } /** * Create a named query. diff --git a/ebean-api/src/main/java/io/ebean/Database.java b/ebean-api/src/main/java/io/ebean/Database.java index 7c976eb0c..6dd0ab3cf 100644 --- a/ebean-api/src/main/java/io/ebean/Database.java +++ b/ebean-api/src/main/java/io/ebean/Database.java @@ -9,7 +9,6 @@ import io.ebean.config.DatabaseConfig; import io.ebean.meta.MetaInfoManager; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import javax.persistence.OptimisticLockException; @@ -204,10 +203,6 @@ public interface Database { */ T createEntityBean(Class type); - /** - * Create a CsvReader for a given beanType. - */ - CsvReader createCsvReader(Class beanType); /** * Create an Update query to perform a bulk update. diff --git a/ebean-api/src/main/java/io/ebean/DbContext.java b/ebean-api/src/main/java/io/ebean/DbContext.java index 3ce395cf7..8f3883e8e 100644 --- a/ebean-api/src/main/java/io/ebean/DbContext.java +++ b/ebean-api/src/main/java/io/ebean/DbContext.java @@ -2,20 +2,20 @@ package io.ebean; import io.ebean.config.BeanNotEnhancedException; import io.ebean.datasource.DataSourceConfigurationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.ERROR; + /** * Holds Database instances. */ final class DbContext { - private static final Logger log = LoggerFactory.getLogger("io.ebean"); + private static final System.Logger log = EbeanVersion.log; static { EbeanVersion.getVersion(); } @@ -23,14 +23,9 @@ final class DbContext { private static final DbContext INSTANCE = new DbContext(); private final ConcurrentHashMap concMap = new ConcurrentHashMap<>(); - private final HashMap syncMap = new HashMap<>(); - private final ReentrantLock lock = new ReentrantLock(); - /** - * The 'default' Database. - */ private Database defaultDatabase; private DbContext() { @@ -52,7 +47,7 @@ final class DbContext { throw new DataSourceConfigurationException(msg, e); } catch (Throwable e) { - log.error("Error trying to create the default Database", e); + log.log(ERROR, "Error trying to create the default Database", e); throw new RuntimeException(e); } } @@ -69,9 +64,9 @@ final class DbContext { */ Database getDefault() { if (defaultDatabase == null) { - String msg = "The default Database has not been defined?"; - msg += " This is normally set via the ebean.datasource.default property."; - msg += " Otherwise it should be registered programmatically via registerServer()"; + String msg = "The default Database has not been defined?" + + " This is normally set via the ebean.datasource.default property." + + " Otherwise it should be registered programmatically via registerServer()"; throw new PersistenceException(msg); } return defaultDatabase; diff --git a/ebean-api/src/main/java/io/ebean/DuplicateKeyException.java b/ebean-api/src/main/java/io/ebean/DuplicateKeyException.java index 681b4dd27..0495015da 100644 --- a/ebean-api/src/main/java/io/ebean/DuplicateKeyException.java +++ b/ebean-api/src/main/java/io/ebean/DuplicateKeyException.java @@ -2,6 +2,28 @@ package io.ebean; /** * Thrown when a duplicate is attempted on a unique constraint. + *

+ * In terms of catching this exception with the view of continuing processing + * using the same transaction look to use {@link Transaction#rollbackAndContinue()}. + * + *

{@code
+ *
+ *   try (Transaction txn = database.beginTransaction()) {
+ *
+ *     try {
+ *       ...
+ *       database.save(bean);
+ *       database.flush();
+ *     } catch (DuplicateKeyException e) {
+ *       // carry on processing using the transaction
+ *       txn.rollbackAndContinue();
+ *       ...
+ *     }
+ *
+ *     txn.commit();
+ *   }
+ *
+ * }
*/ public class DuplicateKeyException extends DataIntegrityException { private static final long serialVersionUID = -4771932723285724817L; diff --git a/ebean-api/src/main/java/io/ebean/EbeanVersion.java b/ebean-api/src/main/java/io/ebean/EbeanVersion.java index ec976a74e..aeb855efc 100644 --- a/ebean-api/src/main/java/io/ebean/EbeanVersion.java +++ b/ebean-api/src/main/java/io/ebean/EbeanVersion.java @@ -1,11 +1,15 @@ package io.ebean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.avaje.applog.AppLog; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; import java.util.Properties; +import static java.lang.System.Logger.Level.*; + /** * Class to determine the ebean version. * @@ -13,7 +17,7 @@ import java.util.Properties; */ public final class EbeanVersion { - private static final Logger log = LoggerFactory.getLogger("io.ebean"); + public static final System.Logger log = AppLog.getLogger("io.ebean"); /** * Maintain the minimum ebean-agent version manually based on required ebean-agent bug fixes. @@ -21,6 +25,7 @@ public final class EbeanVersion { private static final int MIN_AGENT_MAJOR_VERSION = 12; private static final int MIN_AGENT_MINOR_VERSION = 12; private static String version = "unknown"; + static { readVersion(); checkAgentVersion(); @@ -32,12 +37,12 @@ public final class EbeanVersion { if (in != null) { try (LineNumberReader reader = new LineNumberReader(new InputStreamReader(in))) { version = reader.readLine(); + log.log(INFO, "ebean version: {0}", version); } } } - log.info("ebean version: {}", version); } catch (IOException e) { - log.warn("Could not determine ebean version: {}", e.getMessage()); + log.log(WARNING, "Could not determine ebean version: {0}", e.getMessage()); } } @@ -49,13 +54,13 @@ public final class EbeanVersion { String agentVersion = readVersion(in); if (agentVersion != null) { if (checkMinAgentVersion(agentVersion)) { - log.error("Expected minimum ebean-agent version {}.{}.0 but we have {}, please update the ebean-agent", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, agentVersion); + log.log(ERROR, "Expected minimum ebean-agent version {0}.{1}.0 but we have {2}, please update the ebean-agent", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, agentVersion); } } } } } catch (IOException e) { - log.warn("Could not check minimum ebean-agent version {}.{}.0 required due to - {}", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, e.getMessage()); + log.log(WARNING, "Could not check minimum ebean-agent version {0}.{1}.0 required due to - {2}", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, e.getMessage()); } } diff --git a/ebean-api/src/main/java/io/ebean/Query.java b/ebean-api/src/main/java/io/ebean/Query.java index a9793a7ce..0d0fe1e5e 100644 --- a/ebean-api/src/main/java/io/ebean/Query.java +++ b/ebean-api/src/main/java/io/ebean/Query.java @@ -931,7 +931,7 @@ public interface Query extends CancelableQuery { Set findSingleAttributeSet(); /** - * Execute a query returning a single value of a single property/column. + * Execute a query returning a single value or null for a single property/column. *

*

{@code
    *
@@ -943,6 +943,7 @@ public interface Query extends CancelableQuery {
    *
    * }
*/ + @Nullable
A findSingleAttribute(); /** diff --git a/ebean-api/src/main/java/io/ebean/Transaction.java b/ebean-api/src/main/java/io/ebean/Transaction.java index 08c584231..065396a92 100644 --- a/ebean-api/src/main/java/io/ebean/Transaction.java +++ b/ebean-api/src/main/java/io/ebean/Transaction.java @@ -144,6 +144,35 @@ public interface Transaction extends AutoCloseable { */ void rollback(Throwable e) throws PersistenceException; + /** + * Performs a rollback on the underlying JDBC connection with the intention of + * continuing to use this same transaction and performing a commit or rollback + * later to complete the transaction. + *

+ * Typically used when catching {@link DuplicateKeyException} where we wish to + * rollback work done at that point but carry on processing using the transaction. + * + *

{@code
+   *
+   *   try (Transaction txn = database.beginTransaction()) {
+   *
+   *     try {
+   *       ...
+   *       database.save(bean);
+   *       database.flush();
+   *     } catch (DuplicateKeyException e) {
+   *       // carry on processing using the transaction
+   *       txn.rollbackAndContinue();
+   *       ...
+   *     }
+   *
+   *     txn.commit();
+   *   }
+   *
+   * }
+ */ + void rollbackAndContinue(); + /** * Set when we want nested transactions to use Savepoint's. *

diff --git a/ebean-api/src/main/java/io/ebean/config/AbstractNamingConvention.java b/ebean-api/src/main/java/io/ebean/config/AbstractNamingConvention.java index 33d607e97..b317ad7a5 100644 --- a/ebean-api/src/main/java/io/ebean/config/AbstractNamingConvention.java +++ b/ebean-api/src/main/java/io/ebean/config/AbstractNamingConvention.java @@ -237,7 +237,7 @@ public abstract class AbstractNamingConvention implements NamingConvention { } buffer.append(rhsTableName); - int maxTableNameLength = databasePlatform.getMaxTableNameLength(); + int maxTableNameLength = databasePlatform.maxTableNameLength(); // maxConstraintNameLength is used as the max table name length. if (buffer.length() > maxTableNameLength) { diff --git a/ebean-api/src/main/java/io/ebean/config/BackgroundExecutorWrapper.java b/ebean-api/src/main/java/io/ebean/config/BackgroundExecutorWrapper.java index b290e5863..28081c30f 100644 --- a/ebean-api/src/main/java/io/ebean/config/BackgroundExecutorWrapper.java +++ b/ebean-api/src/main/java/io/ebean/config/BackgroundExecutorWrapper.java @@ -6,6 +6,10 @@ import java.util.concurrent.Callable; * BackgroundExecutorWrapper that can be used to wrap tasks that are sent to background (i.e. another thread). * It should copy all necessary thread-local variables. See {@link MdcBackgroundExecutorWrapper} for implementation details. * + * Note: only tasks that are executed immediately (submit, execute) are wrapped. Periodic or scheduled tasks are not wrapped, + * as these may keep copied variables in memory either forever or until the scheduled task is finished. + * The caller is responsible to handle these cases. + * * @author Roland Praml, FOCONIS AG */ public interface BackgroundExecutorWrapper { diff --git a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java index 0ed96efda..ca778d02c 100644 --- a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java @@ -3024,7 +3024,7 @@ public class DatabaseConfig { public PersistBatch appliedPersistBatchOnCascade() { if (persistBatchOnCascade == PersistBatch.INHERIT) { // use the platform default (ALL except SQL Server which has NONE) - return databasePlatform.getPersistBatchOnCascade(); + return databasePlatform.persistBatchOnCascade(); } return persistBatchOnCascade; } diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java index 20b7ccd00..7de8de142 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java @@ -1,49 +1,26 @@ package io.ebean.config.dbplatform; import io.ebean.BackgroundExecutor; +import io.ebean.EbeanVersion; import io.ebean.Query; -import io.ebean.annotation.PartitionMode; import io.ebean.annotation.PersistBatch; import io.ebean.annotation.Platform; import io.ebean.config.CustomDbTypeMapping; import io.ebean.config.PlatformConfig; import io.ebean.util.JdbcClose; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Types; +import java.sql.*; + +import static java.lang.System.Logger.Level.*; /** * Database platform specific settings. */ public class DatabasePlatform { - private static final Logger log = LoggerFactory.getLogger("io.ebean"); - - /** - * Behavior used when ending a query only transaction (at read committed isolation level). - */ - public enum OnQueryOnly { - - /** - * Rollback the transaction. - */ - ROLLBACK, - - /** - * Commit the transaction - */ - COMMIT - } - + private static final System.Logger log = EbeanVersion.log; /** * Set to true for MySql, no other jdbc drivers need this workaround. @@ -60,16 +37,11 @@ public class DatabasePlatform { * Can we use native java time API objects in * {@link ResultSet#getObject(int, Class)} and * {@link PreparedStatement#setObject(int, Object)}. - * + *

* Not all drivers (DB2 e.g.) will support this. */ protected boolean supportsNativeJavaTime = true; - /** - * The behaviour used when ending a read only transaction at read committed isolation level. - */ - protected OnQueryOnly onQueryOnly = OnQueryOnly.COMMIT; - /** * The open quote used by quoted identifiers. */ @@ -146,11 +118,6 @@ public class DatabasePlatform { */ protected int clobDbType = Types.CLOB; - /** - * For Oracle treat empty strings as null. - */ - protected boolean treatEmptyStringsAsNull; - /** * The database platform name. */ @@ -165,7 +132,7 @@ public class DatabasePlatform { * want to use quoted identifiers for. The backticks get converted to the * appropriate characters in convertQuotedIdentifiers */ - private static final char[] QUOTED_IDENTIFIERS = new char[] { '"', '\'', '[', ']', '`' }; + private static final char[] QUOTED_IDENTIFIERS = new char[]{'"', '\'', '[', ']', '`'}; /** * The non-escaped like clause (to stop slash being escaped on some platforms). @@ -299,7 +266,7 @@ public class DatabasePlatform { /** * Return the platform key. */ - public Platform getPlatform() { + public Platform platform() { return platform; } @@ -309,14 +276,14 @@ public class DatabasePlatform { * "generic" is returned when no specific database platform has been set or found. *

*/ - public String getName() { + public String name() { return platform.name().toLowerCase(); } /** * Return true if we are using Sequence batch mode rather than STEP. */ - public boolean isSequenceBatchMode() { + public boolean sequenceBatchMode() { return sequenceBatchMode; } @@ -330,52 +297,52 @@ public class DatabasePlatform { /** * Return true if this database platform supports native ILIKE expression. */ - public boolean isSupportsNativeIlike() { + public boolean supportsNativeIlike() { return supportsNativeIlike; } /** * Return true if the platform supports delete statements with table alias. */ - public boolean isSupportsDeleteTableAlias() { + public boolean supportsDeleteTableAlias() { return supportsDeleteTableAlias; } /** - * Return true if the collation is case sensitive. + * Return true if the collation is case-sensitive. *

* This is expected to be used for testing only. *

*/ - public boolean isCaseSensitiveCollation() { + public boolean caseSensitiveCollation() { return caseSensitiveCollation; } /** * Return true if the platform supports SavepointId values. */ - public boolean isSupportsSavepointId() { + public boolean supportsSavepointId() { return supportsSavepointId; } /** * Return true if migrations should use stored procedures. */ - public boolean isUseMigrationStoredProcedures() { + public boolean useMigrationStoredProcedures() { return useMigrationStoredProcedures; } /** * Return true if the platform supports LIMIT with sql update. */ - public boolean isInlineSqlUpdateLimit() { + public boolean inlineSqlUpdateLimit() { return inlineSqlUpdateLimit; } /** * Return the maximum number of bind values this database platform allows or zero for no limit. */ - public int getMaxInBinding() { + public int maxInBinding() { return maxInBinding; } @@ -385,14 +352,14 @@ public class DatabasePlatform { * This is used when deriving names of intersection tables. *

*/ - public int getMaxTableNameLength() { + public int maxTableNameLength() { return maxTableNameLength; } /** * Return the maximum constraint name allowed for the platform. */ - public int getMaxConstraintNameLength() { + public int maxConstraintNameLength() { return maxConstraintNameLength; } @@ -420,24 +387,10 @@ public class DatabasePlatform { return null; } - /** - * Return the behaviour to use when ending a read only transaction. - */ - public OnQueryOnly getOnQueryOnly() { - return onQueryOnly; - } - - /** - * Set the behaviour to use when ending a read only transaction. - */ - public void setOnQueryOnly(OnQueryOnly onQueryOnly) { - this.onQueryOnly = onQueryOnly; - } - /** * Return the DbEncrypt handler for this DB platform. */ - public DbEncrypt getDbEncrypt() { + public DbEncrypt dbEncrypt() { return dbEncrypt; } @@ -451,7 +404,7 @@ public class DatabasePlatform { /** * Return the history support for this database platform. */ - public DbHistorySupport getHistorySupport() { + public DbHistorySupport historySupport() { return historySupport; } @@ -465,14 +418,14 @@ public class DatabasePlatform { /** * So no except for Postgres and CockroachDB. */ - public boolean isNativeArrayType() { + public boolean nativeArrayType() { return false; } /** * Return true if the DB supports native UUID. */ - public boolean isNativeUuidType() { + public boolean nativeUuidType() { return nativeUuidType; } @@ -481,21 +434,21 @@ public class DatabasePlatform { * * @return the db type map */ - public DbPlatformTypeMapping getDbTypeMap() { + public DbPlatformTypeMapping dbTypeMap() { return dbTypeMap; } /** * Return the mapping for DB column default values. */ - public DbDefaultValue getDbDefaultValue() { + public DbDefaultValue dbDefaultValue() { return dbDefaultValue; } /** * Return the column alias prefix. */ - public String getColumnAliasPrefix() { + public String columnAliasPrefix() { return columnAliasPrefix; } @@ -509,21 +462,21 @@ public class DatabasePlatform { /** * Return the close quote for quoted identifiers. */ - public String getCloseQuote() { + public String closeQuote() { return closeQuote; } /** * Return the open quote for quoted identifiers. */ - public String getOpenQuote() { + public String openQuote() { return openQuote; } /** * Return the JDBC type used to store booleans. */ - public int getBooleanDbType() { + public int booleanDbType() { return booleanDbType; } @@ -534,7 +487,7 @@ public class DatabasePlatform { * example. *

*/ - public int getBlobDbType() { + public int blobDbType() { return blobDbType; } @@ -544,25 +497,16 @@ public class DatabasePlatform { * This is typically Types.CLOB but for Postgres is Types.VARCHAR. *

*/ - public int getClobDbType() { + public int clobDbType() { return clobDbType; } - /** - * Return true if empty strings should be treated as null. - * - * @return true, if checks if is treat empty strings as null - */ - public boolean isTreatEmptyStringsAsNull() { - return treatEmptyStringsAsNull; - } - /** * Return true if a compound ID in (...) type expression needs to be in * expanded form of (a=? and b=?) or (a=? and b=?) or ... rather than (a,b) in * ((?,?),(?,?),...); */ - public boolean isIdInExpandedForm() { + public boolean idInExpandedForm() { return idInExpandedForm; } @@ -573,7 +517,7 @@ public class DatabasePlatform { * This specifically is required for MySql when processing large results. *

*/ - public boolean isForwardOnlyHintOnFindIterate() { + public boolean forwardOnlyHintOnFindIterate() { return forwardOnlyHintOnFindIterate; } @@ -591,7 +535,7 @@ public class DatabasePlatform { * This specifically is required for Hana which doesn't support CONCUR_UPDATABLE *

*/ - public boolean isSupportsResultSetConcurrencyModeUpdatable() { + public boolean supportsResultSetConcurrencyModeUpdatable() { return supportsResultSetConcurrencyModeUpdatable; } @@ -611,7 +555,7 @@ public class DatabasePlatform { * * @return the db identity */ - public DbIdentity getDbIdentity() { + public DbIdentity dbIdentity() { return dbIdentity; } @@ -624,14 +568,14 @@ public class DatabasePlatform { * * @return the sql limiter */ - public SqlLimiter getSqlLimiter() { + public SqlLimiter sqlLimiter() { return sqlLimiter; } /** * Return the BasicSqlLimiter for limit/offset of SqlQuery queries. */ - public BasicSqlLimiter getBasicSqlLimiter() { + public BasicSqlLimiter basicSqlLimiter() { return basicSqlLimiter; } @@ -666,7 +610,7 @@ public class DatabasePlatform { if (isQuote(dbName.charAt(dbName.length() - 1))) { return openQuote + dbName.substring(1, dbName.length() - 1) + closeQuote; } else { - log.error("Missing backquote on [" + dbName + "]"); + log.log(ERROR, "Missing backquote on [" + dbName + "]"); } } else if (allQuotedIdentifiers) { return openQuote + dbName + closeQuote; @@ -676,8 +620,8 @@ public class DatabasePlatform { } private boolean isQuote(char ch) { - for (char identifer : QUOTED_IDENTIFIERS) { - if (identifer == ch) { + for (char identifier : QUOTED_IDENTIFIERS) { + if (identifier == ch) { return true; } } @@ -700,14 +644,14 @@ public class DatabasePlatform { /** * Set to true if select count against anonymous view requires an alias. */ - public boolean isSelectCountWithAlias() { + public boolean selectCountWithAlias() { return selectCountWithAlias; } /** * Return true if select count with subquery needs column alias (SQL Server). */ - public boolean isSelectCountWithColumnAlias() { + public boolean selectCountWithColumnAlias() { return selectCountWithColumnAlias; } @@ -729,7 +673,7 @@ public class DatabasePlatform { protected String withForUpdate(String sql, Query.LockWait lockWait, Query.LockType lockType) { // silently assume the database does not support the "for update" clause. - log.info("it seems your database does not support the 'for update' clause"); + log.log(INFO, "it seems your database does not support the 'for update' clause"); return sql; } @@ -738,14 +682,14 @@ public class DatabasePlatform { *

* This may include an escape clause to disable a default escape character. */ - public String getLikeClause(boolean rawLikeExpression) { + public String likeClause(boolean rawLikeExpression) { return rawLikeExpression ? likeClauseRaw : likeClauseEscaped; } /** * Return the platform default JDBC batch mode for persist cascade. */ - public PersistBatch getPersistBatchOnCascade() { + public PersistBatch persistBatchOnCascade() { return persistBatchOnCascade; } @@ -763,7 +707,7 @@ public class DatabasePlatform { if (!schemaExists(dbSchema, connection)) { Statement query = connection.createStatement(); try { - log.debug("create schema:{}", dbSchema); + log.log(DEBUG, "create schema:{0}", dbSchema); query.executeUpdate("create schema " + dbSchema); } finally { JdbcClose.close(query); @@ -789,19 +733,6 @@ public class DatabasePlatform { return false; } - /** - * Return true if the table exists. - */ - public boolean tableExists(Connection connection, String catalog, String schema, String table) throws SQLException { - DatabaseMetaData metaData = connection.getMetaData(); - ResultSet tables = metaData.getTables(catalog, schema, table, null); - try { - return tables.next(); - } finally { - JdbcClose.close(tables); - } - } - /** * Escapes the like string for this DB-Platform */ diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java index 10e8c924b..246e8f1c0 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java @@ -1,10 +1,9 @@ package io.ebean.config.dbplatform; +import io.avaje.applog.AppLog; import io.ebean.BackgroundExecutor; import io.ebean.Transaction; import io.ebean.util.JdbcClose; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import javax.sql.DataSource; @@ -19,12 +18,15 @@ import java.util.TreeSet; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.ERROR; + /** * Database sequence based IdGenerator. */ public abstract class SequenceIdGenerator implements PlatformIdGenerator { - protected static final Logger log = LoggerFactory.getLogger("io.ebean.SEQ"); + protected static final System.Logger log = AppLog.getLogger("io.ebean.SEQ"); private final ReentrantLock lock = new ReentrantLock(); protected final String seqName; @@ -120,7 +122,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator { protected void loadInBackground(final int requestSize) { if (currentlyBackgroundLoading.get()) { // skip as already background loading - log.debug("... skip background sequence load (another load in progress)"); + log.log(DEBUG, "... skip background sequence load (another load in progress)"); return; } currentlyBackgroundLoading.set(true); @@ -152,9 +154,6 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator { resultSet = statement.executeQuery(); List newIds = readIds(resultSet, requestSize); - if (log.isTraceEnabled()) { - log.trace("seq:{} loaded:{} sql:{}", seqName, newIds.size(), sql); - } if (newIds.isEmpty()) { throw new PersistenceException("Always expecting more than 1 row from " + sql); } @@ -164,7 +163,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator { } catch (SQLException e) { if (e.getMessage().contains("Database is already closed")) { String msg = "Error getting SEQ when DB shutting down " + e.getMessage(); - log.error(msg); + log.log(ERROR, msg); System.out.println(msg); return Collections.emptyList(); } else { diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java index 8f7adc846..49fb32682 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java @@ -32,7 +32,12 @@ public class SqlCodeTranslator implements SqlExceptionTranslator { } private DataErrorType getErrorType(SQLException e) { - DataErrorType errorType = map.get(e.getSQLState()); + String sqlState = e.getSQLState(); + while (sqlState == null && e.getCause() instanceof SQLException) { + e = (SQLException)e.getCause(); + sqlState = e.getSQLState(); + } + DataErrorType errorType = map.get(sqlState); if (errorType == null) { // fall back to error code errorType = map.get(String.valueOf(e.getErrorCode())); diff --git a/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java b/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java index 4341c5cfd..91c351f30 100644 --- a/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java +++ b/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java @@ -1,9 +1,8 @@ package io.ebean.event; import io.ebean.Database; +import io.ebean.EbeanVersion; import io.ebean.service.SpiContainer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.sql.Driver; import java.sql.DriverManager; @@ -13,6 +12,8 @@ import java.util.Enumeration; import java.util.List; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; + /** * Manages the shutdown of Ebean. *

@@ -20,13 +21,14 @@ import java.util.concurrent.locks.ReentrantLock; */ public final class ShutdownManager { - private static final Logger log = LoggerFactory.getLogger("io.ebean"); + private static final System.Logger log = EbeanVersion.log; private static final ReentrantLock lock = new ReentrantLock(); private static final List databases = new ArrayList<>(); private static final ShutdownHook shutdownHook = new ShutdownHook(); private static boolean stopping; private static SpiContainer container; + static { // Register the Shutdown hook registerShutdownHook(); @@ -120,9 +122,7 @@ public final class ShutdownManager { // Already run shutdown... return; } - if (log.isDebugEnabled()) { - log.debug("Ebean shutting down"); - } + log.log(DEBUG, "Ebean shutting down"); stopping = true; deregisterShutdownHook(); @@ -133,7 +133,7 @@ public final class ShutdownManager { Runnable r = (Runnable) ClassUtil.newInstance(shutdownRunner); r.run(); } catch (Exception e) { - log.error("Error running custom shutdown runnable", e); + log.log(ERROR, "Error running custom shutdown runnable", e); } } @@ -147,7 +147,7 @@ public final class ShutdownManager { try { server.shutdown(); } catch (Exception ex) { - log.error("Error executing shutdown runnable", ex); + log.log(ERROR, "Error executing shutdown runnable", ex); ex.printStackTrace(); } } @@ -165,10 +165,10 @@ public final class ShutdownManager { while (drivers.hasMoreElements()) { Driver driver = drivers.nextElement(); try { - log.info("De-registering jdbc driver: " + driver); + log.log(INFO, "De-registering jdbc driver: " + driver); DriverManager.deregisterDriver(driver); } catch (SQLException e) { - log.error("Error de-registering driver " + driver, e); + log.log(ERROR, "Error de-registering driver " + driver, e); } } } @@ -204,6 +204,7 @@ public final class ShutdownManager { private ShutdownHook() { super("EbeanHook"); } + @Override public void run() { ShutdownManager.shutdown(); diff --git a/ebean-api/src/main/java/io/ebean/plugin/ExpressionPath.java b/ebean-api/src/main/java/io/ebean/plugin/ExpressionPath.java index 29a5abdab..975349700 100644 --- a/ebean-api/src/main/java/io/ebean/plugin/ExpressionPath.java +++ b/ebean-api/src/main/java/io/ebean/plugin/ExpressionPath.java @@ -39,18 +39,6 @@ public interface ExpressionPath { */ StringParser stringParser(); - /** - * For DateTime capable scalar types convert the long systemTimeMillis into - * an appropriate java time (Date,Timestamp,Time,Calendar, JODA type etc). - */ - Object parseDateTime(long systemTimeMillis); - - /** - * Return true if the last type is "DateTime capable" - can support - * {@link #parseDateTime(long)}. - */ - boolean isDateTimeCapable(); - /** * Return the underlying JDBC type or 0 if this is not a scalar type. */ diff --git a/ebean-api/src/main/java/io/ebean/text/StringFormatter.java b/ebean-api/src/main/java/io/ebean/text/StringFormatter.java index a7aa2631b..613e97129 100644 --- a/ebean-api/src/main/java/io/ebean/text/StringFormatter.java +++ b/ebean-api/src/main/java/io/ebean/text/StringFormatter.java @@ -6,6 +6,7 @@ package io.ebean.text; * Basic interface to support CSV, JSON and XML processing. *

*/ +@FunctionalInterface public interface StringFormatter { /** diff --git a/ebean-api/src/main/java/io/ebean/text/StringParser.java b/ebean-api/src/main/java/io/ebean/text/StringParser.java index f76421944..4fe51abe8 100644 --- a/ebean-api/src/main/java/io/ebean/text/StringParser.java +++ b/ebean-api/src/main/java/io/ebean/text/StringParser.java @@ -5,6 +5,7 @@ package io.ebean.text; *

* Basic interface to support CSV, JSON and XML processing. */ +@FunctionalInterface public interface StringParser { /** diff --git a/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java b/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java deleted file mode 100644 index b20232fc0..000000000 --- a/ebean-api/src/main/java/io/ebean/text/csv/CsvReader.java +++ /dev/null @@ -1,171 +0,0 @@ -package io.ebean.text.csv; - -import io.ebean.text.StringParser; - -import java.io.Reader; -import java.util.Locale; - -/** - * Reads CSV data turning it into object graphs that you can be saved (inserted) - * or processed yourself. - *

- * This first example doesn't use a {@link CsvCallback} and this means it will - * automatically create a transaction, save the customers and commit the - * transaction when successful. - *

- * - *
{@code
- * try {
- *   File f = new File("src/test/resources/test1.csv");
- *
- *   FileReader reader = new FileReader(f, encoding);
- *
- *   CsvReader csvReader = DB.createCsvReader(Customer.class);
- *
- *   csvReader.setPersistBatchSize(20);
- *
- *   csvReader.addProperty("status");
- *   // ignore the next property
- *   csvReader.addIgnore();
- *   csvReader.addProperty("name");
- *   csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
- *   csvReader.addProperty("billingAddress.line1");
- *   csvReader.addProperty("billingAddress.city");
- *
- *   csvReader.process(reader);
- *
- * } catch (Exception e) {
- *   throw new RuntimeException(e);
- * }
- * }
- * - * @param the entity bean type - */ -public interface CsvReader { - - /** - * Explicitly set the default Locale. - */ - void setDefaultLocale(Locale defaultLocale); - - /** - * Set the default format to use for Time types. - */ - void setDefaultTimeFormat(String defaultTimeFormat); - - /** - * Set the default format to use for Date types. - */ - void setDefaultDateFormat(String defaultDateFormat); - - /** - * Set the default format to use for Timestamp types. - */ - void setDefaultTimestampFormat(String defaultTimestampFormat); - - /** - * Set the batch size for using JDBC statement batching. - *

- * By default this is set to 20 and setting this to 1 will disable the use of - * JDBC statement batching. - *

- */ - void setPersistBatchSize(int persistBatchSize); - - /** - * Set to true if there is a header row that should be ignored. - *

- * If addPropertiesFromHeader is true then all the properties are added using - * the default time,date and timestamp formats. - *

- * If you have a mix of dateTime formats you can not use this method and must - * add the properties yourself. - *

- */ - void setHasHeader(boolean hasHeader, boolean addPropertiesFromHeader); - - /** - * Same as setHasHeader(true,true); - *

- * This will use a header to define all the properties to load using the - * default formats for time, date and datetime types. - *

- */ - void setAddPropertiesFromHeader(); - - /** - * Same as setHasHeader(true, false); - *

- * This indicates that there is a header but that it should be ignored. - *

- */ - void setIgnoreHeader(); - - /** - * Set the frequency with which a INFO message will be logged showing the - * progress of the processing. You might set this to 1000 or 10000 etc. - *

- * If this is not set then no INFO messages will be logged. - *

- */ - void setLogInfoFrequency(int logInfoFrequency); - - /** - * Ignore the next column of data. - */ - void addIgnore(); - - /** - * Define the property which will be loaded from the next column of data. - *

- * This takes into account the data type of the property and handles the - * String to object conversion automatically. - *

- */ - void addProperty(String propertyName); - - /** - * Define the next property and use a custom StringParser to convert the - * string content into the appropriate type for the property. - */ - void addProperty(String propertyName, StringParser parser); - - /** - * Add a property with a custom Date/Time/Timestamp format using the default - * Locale. This will convert the string into the appropriate java type for the - * given property (Date, Calendar, SQL Date, Time, Timestamp, JODA etc). - */ - void addDateTime(String propertyName, String dateTimeFormat); - - /** - * Add a property with a custom Date/Time/Timestamp format. This will convert - * the string into the appropriate java type for the given property (Date, - * Calendar, SQL Date, Time, Timestamp, JODA etc). - */ - void addDateTime(String propertyName, String dateTimeFormat, Locale locale); - - /** - * Automatically create a transaction if required to process all the CSV - * content from the reader. - *

- * This will check for a current transaction. If there is no current - * transaction then one is started and will commit (or rollback) at the end of - * processing. This will also set the persistBatchSize on the transaction. - *

- */ - void process(Reader reader) throws Exception; - - /** - * Process the CSV content passing the bean to the CsvCallback after each row. - *

- * This provides you with the ability to modify and process the bean. - *

- *

- * When using a CsvCallback the reader WILL NOT create a transaction or save - * the bean(s) for you. If you want to insert the processed beans you must - * create your own transaction and save the bean(s) yourself. - *

- */ - void process(Reader reader, CsvCallback callback) throws Exception; - -} diff --git a/ebean-api/src/main/java/io/ebean/text/csv/package-info.java b/ebean-api/src/main/java/io/ebean/text/csv/package-info.java deleted file mode 100644 index a14c9b1df..000000000 --- a/ebean-api/src/main/java/io/ebean/text/csv/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * CSV processing objects. - */ -package io.ebean.text.csv; diff --git a/ebean-api/src/main/java/io/ebean/util/JdbcClose.java b/ebean-api/src/main/java/io/ebean/util/JdbcClose.java index a1d04536e..d6b35539c 100644 --- a/ebean-api/src/main/java/io/ebean/util/JdbcClose.java +++ b/ebean-api/src/main/java/io/ebean/util/JdbcClose.java @@ -1,19 +1,20 @@ package io.ebean.util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.ebean.EbeanVersion; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import static java.lang.System.Logger.Level.WARNING; + /** * Utility for closing raw Jdbc resources. */ public final class JdbcClose { - private static final Logger log = LoggerFactory.getLogger("io.ebean"); + private static final System.Logger log = EbeanVersion.log; /** * Close the resultSet logging if an error occurs. @@ -24,7 +25,7 @@ public final class JdbcClose { statement.close(); } } catch (SQLException e) { - log.warn("Error closing statement", e); + log.log(WARNING, "Error closing statement", e); } } @@ -37,7 +38,7 @@ public final class JdbcClose { resultSet.close(); } } catch (SQLException e) { - log.warn("Error closing resultSet", e); + log.log(WARNING, "Error closing resultSet", e); } } @@ -50,7 +51,7 @@ public final class JdbcClose { connection.close(); } } catch (SQLException e) { - log.warn("Error closing connection", e); + log.log(WARNING, "Error closing connection", e); } } @@ -63,7 +64,7 @@ public final class JdbcClose { connection.rollback(); } } catch (SQLException e) { - log.warn("Error on connection rollback", e); + log.log(WARNING, "Error on connection rollback", e); } } @@ -76,7 +77,7 @@ public final class JdbcClose { stmt.cancel(); } } catch (SQLException e) { - log.warn("Error on cancelling statement", e); + log.log(WARNING, "Error on cancelling statement", e); } } } diff --git a/ebean-api/src/main/java/module-info.java b/ebean-api/src/main/java/module-info.java index 7c8453cea..a8fb4ea38 100644 --- a/ebean-api/src/main/java/module-info.java +++ b/ebean-api/src/main/java/module-info.java @@ -15,8 +15,9 @@ module io.ebean.api { requires transitive persistence.api; requires transitive io.ebean.annotation; requires transitive io.ebean.datasource.api; - requires transitive org.slf4j; + requires transitive io.avaje.applog; + requires static org.slf4j; requires static io.ebean.types; requires static com.fasterxml.jackson.core; requires static com.fasterxml.jackson.databind; @@ -39,7 +40,6 @@ module io.ebean.api { exports io.ebean.service; exports io.ebean.text; exports io.ebean.text.json; - exports io.ebean.text.csv; exports io.ebean.util; } diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml index 500b98f4d..90d059712 100644 --- a/ebean-autotune/pom.xml +++ b/ebean-autotune/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -26,21 +26,16 @@ io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT provided - jakarta.xml.bind - jakarta.xml.bind-api - 4.0.0 - - - com.sun.xml.bind - jaxb-impl - 4.0.0 - runtime + org.glassfish.jaxb + jaxb-runtime + 2.3.6 + provided @@ -60,7 +55,7 @@ io.ebean ebean-platform-h2 - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT test diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java index 9dc140779..f5b4954bb 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java @@ -1,9 +1,9 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlRootElement; -import jakarta.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.List; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java index 4f81e26e1..2e5d7eba3 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlRegistry; +import javax.xml.bind.annotation.XmlRegistry; /** diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java index 65b6cfc3f..6471d3877 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java @@ -1,10 +1,10 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlAttribute; -import jakarta.xml.bind.annotation.XmlRootElement; -import jakarta.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; /** diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java index 370ed7bc7..1738fead9 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java @@ -1,9 +1,9 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlRootElement; -import jakarta.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.List; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java index b038240ef..d22140aa8 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java @@ -1,9 +1,9 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlRootElement; -import jakarta.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.List; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java index 0f2666fcb..7910acb84 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java @@ -1,9 +1,9 @@ package io.ebeaninternal.server.autotune.model; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlRootElement; -import jakarta.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.List; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java index 86e328054..78deec068 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java @@ -1,2 +1,2 @@ -@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/autotune", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) +@javax.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/autotune", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package io.ebeaninternal.server.autotune.model; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java index 42c93c7d7..3b0dd797f 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java @@ -3,9 +3,9 @@ package io.ebeaninternal.server.autotune.service; import io.ebeaninternal.server.autotune.model.Autotune; -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBException; -import jakarta.xml.bind.Unmarshaller; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java index 9899ef77d..3a9fd859e 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java @@ -3,9 +3,9 @@ package io.ebeaninternal.server.autotune.service; import io.ebeaninternal.server.autotune.model.Autotune; -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBException; -import jakarta.xml.bind.Marshaller; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java index b8d302f23..a0031f938 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.autotune.service; +import io.avaje.applog.AppLog; import io.ebean.config.AutoTuneConfig; import io.ebean.config.DatabaseConfig; import io.ebeaninternal.api.SpiEbeanServer; @@ -7,8 +8,6 @@ import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.autotune.AutoTuneService; import io.ebeaninternal.server.autotune.model.Autotune; import io.ebeaninternal.server.autotune.model.Origin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -16,12 +15,14 @@ import java.io.InputStream; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; + /** * Implementation of the AutoTuneService which is comprised of profiling and query tuning. */ public class DefaultAutoTuneService implements AutoTuneService { - private static final Logger logger = LoggerFactory.getLogger(DefaultAutoTuneService.class); + private static final System.Logger logger = AppLog.getLogger(DefaultAutoTuneService.class); private final ReentrantLock lock = new ReentrantLock(); @@ -111,7 +112,7 @@ public class DefaultAutoTuneService implements AutoTuneService { if (stream != null) { loadAutoTuneProfiling(AutoTuneXmlReader.read(stream)); } else { - logger.warn("AutoTune file {} not found - no initial automatic query tuning", tuningFile); + logger.log(WARNING, "AutoTune file {0} not found - no initial automatic query tuning", tuningFile); } } catch (IOException e) { throw new IllegalStateException("Error on auto close of " + tuningFile, e); @@ -120,7 +121,7 @@ public class DefaultAutoTuneService implements AutoTuneService { } private void loadAutoTuneProfiling(Autotune profiling) { - logger.info("AutoTune loading {} tuning entries", profiling.getOrigin().size()); + logger.log(INFO, "AutoTune loading {0} tuning entries", profiling.getOrigin().size()); for (Origin origin : profiling.getOrigin()) { queryTuner.put(origin); } @@ -141,17 +142,17 @@ public class DefaultAutoTuneService implements AutoTuneService { event.process(); if (event.isEmpty()) { long exeMillis = System.currentTimeMillis() - start; - logger.debug("No query tuning updates for server:{} executionMillis:{}", serverName, exeMillis); + logger.log(DEBUG, "No query tuning updates for server:{0} executionMillis:{1}", serverName, exeMillis); } else { // report the query tuning changes that have been made runtimeChangeCount += event.getChangeCount(); event.writeFile(profilingFile + "-" + serverName + "-update"); long exeMillis = System.currentTimeMillis() - start; - logger.info("query tuning updates - new:{} diff:{} for server:{} executionMillis:{}", event.getNewCount(), event.getDiffCount(), serverName, exeMillis); + logger.log(INFO, "query tuning updates - new:{0} diff:{1} for server:{2} executionMillis:{3}", event.getNewCount(), event.getDiffCount(), serverName, exeMillis); } } catch (Throwable e) { - logger.error("Error collecting or applying automatic query tuning", e); + logger.log(ERROR, "Error collecting or applying automatic query tuning", e); } } finally { lock.unlock(); @@ -172,11 +173,11 @@ public class DefaultAutoTuneService implements AutoTuneService { AutoTuneDiffCollection event = new AutoTuneDiffCollection(profiling, queryTuner, false); event.process(); if (event.isEmpty()) { - logger.info("No new or diff entries for profiling server:{}", serverName); + logger.log(INFO, "No new or diff entries for profiling server:{0}", serverName); } else { event.writeFile(profilingFile + "-" + serverName); - logger.info("writing new:{} diff:{} profiling entries for server:{}", event.getNewCount(), event.getDiffCount(), serverName); + logger.log(INFO, "writing new:{0} diff:{1} profiling entries for server:{2}", event.getNewCount(), event.getDiffCount(), serverName); } } } finally { @@ -196,7 +197,7 @@ public class DefaultAutoTuneService implements AutoTuneService { private void outputAllTuning() { if (runtimeChangeCount == 0) { - logger.info("no runtime query tuning changes for server:{}", serverName); + logger.log(INFO, "no runtime query tuning changes for server:{0}", serverName); } else { AutoTuneAllCollection event = new AutoTuneAllCollection(queryTuner); @@ -205,12 +206,12 @@ public class DefaultAutoTuneService implements AutoTuneService { if (existingTuning.exists()) { // rename the existing autotune.xml file (appending 'now') if (!existingTuning.renameTo(new File(tuningFile + "." + AutoTuneXmlWriter.now()))) { - logger.warn("Failed to rename autotune file [{}]", tuningFile); + logger.log(WARNING, "Failed to rename autotune file [{0}]", tuningFile); } } event.writeFile(tuningFile, false); - logger.info("query tuning detected [{}] changes, writing all [{}] tuning entries for server:{}", runtimeChangeCount, size, serverName); + logger.log(INFO, "query tuning detected [{0}] changes, writing all [{1}] tuning entries for server:{2}", runtimeChangeCount, size, serverName); } } @@ -279,7 +280,7 @@ public class DefaultAutoTuneService implements AutoTuneService { } catch (InterruptedException e) { // restore the interrupted status Thread.currentThread().interrupt(); - logger.warn("Error while sleeping after System.gc() request.", e); + logger.log(WARNING, "Error while sleeping after System.gc() request.", e); } } diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java index c5a3c17db..408d9c1ff 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.autotune.service; +import io.avaje.applog.AppLog; import io.ebean.bean.NodeUsageCollector; import io.ebean.text.PathProperties; import io.ebean.util.SplitName; @@ -7,19 +8,19 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssoc; import io.ebeaninternal.server.el.ElPropertyValue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.WARNING; + /** * Collects usages statistics for a given node in the object graph. */ public class ProfileOriginNodeUsage { - private static final Logger logger = LoggerFactory.getLogger(ProfileOriginNodeUsage.class); + private static final System.Logger logger = AppLog.getLogger(ProfileOriginNodeUsage.class); private final ReentrantLock lock = new ReentrantLock(); @@ -45,7 +46,7 @@ public class ProfileOriginNodeUsage { if (path != null) { ElPropertyValue elGetValue = rootDesc.elGetValue(path); if (elGetValue == null) { - logger.warn("AutoTune: Can't find join for path[" + path + "] for " + rootDesc.name()); + logger.log(WARNING, "AutoTune: Can't find join for path[" + path + "] for " + rootDesc.name()); return; } else { BeanProperty beanProperty = elGetValue.beanProperty(); @@ -61,7 +62,7 @@ public class ProfileOriginNodeUsage { for (String propName : aggregateUsed) { BeanProperty beanProp = desc.findPropertyFromPath(propName); if (beanProp == null) { - logger.warn("AutoTune: Can't find property[" + propName + "] for " + desc.name()); + logger.log(WARNING, "AutoTune: Can't find property[" + propName + "] for " + desc.name()); } else { if (beanProp.isId()) { diff --git a/ebean-autotune/src/main/java/module-info.java b/ebean-autotune/src/main/java/module-info.java index e53081272..6cb7d3a54 100644 --- a/ebean-autotune/src/main/java/module-info.java +++ b/ebean-autotune/src/main/java/module-info.java @@ -10,5 +10,6 @@ module io.ebean.autotune { requires io.ebean.api; requires io.ebean.core; - requires jakarta.xml.bind; + requires java.xml; + requires java.xml.bind; } diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index 5bf38eaee..618e44ba0 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean bom @@ -18,12 +18,23 @@ + + io.ebean + persistence-api + ${ebean-persistence-api.version} + + io.ebean ebean-annotation ${ebean-annotation.version} + + io.ebean + ebean-types + ${ebean-types.version} + io.ebean @@ -78,88 +89,106 @@ io.ebean ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-core-type - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-joda-time + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-jackson-jsonnode + 13.10.1-SNAPSHOT + + + + io.ebean + ebean-jackson-mapper + 13.10.1-SNAPSHOT io.ebean ebean-ddl-generator - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-externalmapping-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-externalmapping-xml - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-autotune - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-querybean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean querybean-generator - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT provided io.ebean kotlin-querybean-generator - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT provided io.ebean ebean-test - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT test io.ebean ebean-postgis - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-redis - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT
diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index 872fb9730..866d3ec56 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-core-type @@ -16,7 +16,7 @@ io.ebean ebean-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -26,6 +26,21 @@ true + + + org.postgresql + postgresql + 42.4.1 + true + + + + io.avaje + junit + 1.1 + test + + diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/BasicTypeConverter.java b/ebean-core-type/src/main/java/io/ebean/core/type/BasicTypeConverter.java similarity index 77% rename from ebean-core/src/main/java/io/ebeaninternal/server/core/BasicTypeConverter.java rename to ebean-core-type/src/main/java/io/ebean/core/type/BasicTypeConverter.java index dbdf6b110..36a58b2de 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/BasicTypeConverter.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/BasicTypeConverter.java @@ -1,8 +1,5 @@ -package io.ebeaninternal.server.core; +package io.ebean.core.type; -import io.ebeaninternal.server.type.ScalarTypeUUIDBinary; - -import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; @@ -14,14 +11,9 @@ import java.util.Calendar; import java.util.UUID; /** - * Default implementation of TypeConverter. - *

- * Converts objects to the required type if required. - *

+ * Helper to converts objects to the basic types if required. */ -public final class BasicTypeConverter implements Serializable { - - private static final long serialVersionUID = 7691463236204070311L; +public final class BasicTypeConverter { /** * Type code for java.util.Calendar. @@ -43,7 +35,6 @@ public final class BasicTypeConverter implements Serializable { * @param toDataType the dataType as per java.sql.Types. */ public static Object convert(Object value, int toDataType) { - try { switch (toDataType) { case UTIL_DATE: { @@ -58,7 +49,8 @@ public final class BasicTypeConverter implements Serializable { case Types.INTEGER: { return toInteger(value); } - case Types.BIT: { + case Types.BIT: + case Types.BOOLEAN: { return toBoolean(value); } case Types.TINYINT: { @@ -67,59 +59,42 @@ public final class BasicTypeConverter implements Serializable { case Types.SMALLINT: { return toShort(value); } - case Types.NUMERIC: { - return toBigDecimal(value); - } + case Types.NUMERIC: case Types.DECIMAL: { return toBigDecimal(value); } case Types.REAL: { return toFloat(value); } - case Types.DOUBLE: { - return toDouble(value); - } + case Types.DOUBLE: case Types.FLOAT: { return toDouble(value); } - case Types.BOOLEAN: { - return toBoolean(value); - } case Types.TIMESTAMP: { return toTimestamp(value); } case Types.DATE: { return toDate(value); } - case Types.VARCHAR: { - return toString(value); - } + case Types.VARCHAR: case Types.CHAR: { return toString(value); } - case Types.OTHER: { - return value; - } - case Types.JAVA_OBJECT: { - return value; - } + case Types.OTHER: case Types.BINARY: case Types.LONGVARBINARY: - case Types.BLOB: { - return value; - } + case Types.BLOB: + case Types.JAVA_OBJECT: case Types.LONGVARCHAR: case Types.CLOB: { return value; } default: { - String msg = "Unhandled data type [" + toDataType + "] converting [" + value + "]"; - throw new RuntimeException(msg); + throw new RuntimeException("Unhandled data type - " + toDataType); } } } catch (ClassCastException e) { - String m = "ClassCastException converting to data type [" + toDataType + "] value [" + value + "]"; - throw new RuntimeException(m); + throw new RuntimeException("ClassCastException converting to data type: " + toDataType + " value: " + value); } } @@ -127,7 +102,6 @@ public final class BasicTypeConverter implements Serializable { * Convert the value to a String. */ public static String toString(Object value) { - if (value == null) { return null; } @@ -137,7 +111,6 @@ public final class BasicTypeConverter implements Serializable { if (value instanceof char[]) { return String.valueOf((char[]) value); } - return value.toString(); } @@ -145,8 +118,7 @@ public final class BasicTypeConverter implements Serializable { /** * Convert the value to a Boolean with an explicit String true value. */ - public static Boolean toBoolean(Object value, String dbTrueValue) { - + public static Boolean toBoolean(Object value, String trueValue) { if (value == null) { return null; } @@ -156,8 +128,7 @@ public final class BasicTypeConverter implements Serializable { if (value instanceof Number) { return ((Number) value).intValue() == 1; } - String s = value.toString(); - return s.equalsIgnoreCase(dbTrueValue); + return value.toString().equalsIgnoreCase(trueValue); } /** @@ -165,14 +136,12 @@ public final class BasicTypeConverter implements Serializable { * "true" or "false". */ public static Boolean toBoolean(Object value) { - if (value == null) { return null; } if (value instanceof Boolean) { return (Boolean) value; } - return Boolean.valueOf(value.toString()); } @@ -180,7 +149,6 @@ public final class BasicTypeConverter implements Serializable { * Convert the value to a UUID. */ public static UUID toUUID(Object value, boolean optimizedBinary) { - if (value == null) { return null; } @@ -191,17 +159,15 @@ public final class BasicTypeConverter implements Serializable { return UUID.fromString((String) value); } if (value instanceof byte[]) { - return ScalarTypeUUIDBinary.convertFromBytes((byte[]) value, optimizedBinary); + return ScalarTypeUtils.uuidFromBytes((byte[]) value, optimizedBinary); } return UUID.fromString(value.toString()); } /** - * convert the passed in object to a BigDecimal. It should be another - * numeric type. + * convert the passed in object to a BigDecimal. It should be another numeric type. */ public static BigDecimal toBigDecimal(Object value) { - if (value == null) { return null; } @@ -212,7 +178,6 @@ public final class BasicTypeConverter implements Serializable { } public static Float toFloat(Object value) { - if (value == null) { return null; } @@ -226,7 +191,6 @@ public final class BasicTypeConverter implements Serializable { } public static Short toShort(Object value) { - if (value == null) { return null; } @@ -240,7 +204,6 @@ public final class BasicTypeConverter implements Serializable { } public static Byte toByte(Object value) { - if (value == null) { return null; } @@ -251,11 +214,9 @@ public final class BasicTypeConverter implements Serializable { } /** - * convert the passed in object to a Integer. It should be another numeric - * type. + * convert the passed in object to an Integer. */ public static Integer toInteger(Object value) { - if (value == null) { return null; } @@ -269,10 +230,9 @@ public final class BasicTypeConverter implements Serializable { } /** - * Convert the object to a Long. It should be another numeric type. + * Convert the object to a Long. */ public static Long toLong(Object value) { - if (value == null) { return null; } @@ -294,8 +254,7 @@ public final class BasicTypeConverter implements Serializable { return Long.valueOf(value.toString()); } - public static BigInteger toMathBigInteger(Object value) { - + public static BigInteger toBigInteger(Object value) { if (value == null) { return null; } @@ -306,10 +265,9 @@ public final class BasicTypeConverter implements Serializable { } /** - * Convert the object to a Double. It should be another numberic type. + * Convert the object to a Double. */ public static Double toDouble(Object value) { - if (value == null) { return null; } @@ -323,56 +281,42 @@ public final class BasicTypeConverter implements Serializable { } /** - * convert the passed in object to a Timestamp. It is expected to be a - * java.sql.Date really. + * convert the passed in object to a Timestamp. */ public static Timestamp toTimestamp(Object value) { - if (value == null) { return null; } if (value instanceof Timestamp) { return (Timestamp) value; - } else if (value instanceof java.util.Date) { // no nanos here... so hopefully ok return new Timestamp(((java.util.Date) value).getTime()); - } else if (value instanceof Calendar) { return new Timestamp(((Calendar) value).getTime().getTime()); - } else if (value instanceof String) { return Timestamp.valueOf((String) value); - } else if (value instanceof LocalDateTime) { return Timestamp.valueOf((LocalDateTime) value); - } else if (value instanceof Number) { return new Timestamp(((Number) value).longValue()); - } else { - String msg = "Unable to convert [" + value.getClass().getName() + "] into a Timestamp."; - throw new RuntimeException(msg); + throw new RuntimeException("Unable to convert " + value); } } public static java.sql.Time toTime(Object value) { - if (value == null) { return null; } if (value instanceof java.sql.Time) { return (java.sql.Time) value; - } else if (value instanceof String) { return java.sql.Time.valueOf((String) value); - } else if (value instanceof LocalTime) { return java.sql.Time.valueOf((LocalTime) value); - } else { - String m = "Unable to convert [" + value.getClass().getName() + "] into a java.sql.Date."; - throw new RuntimeException(m); + throw new RuntimeException("Unable to convert " + value); } } @@ -380,31 +324,23 @@ public final class BasicTypeConverter implements Serializable { * convert the passed in object to a java sql Date. */ public static java.sql.Date toDate(Object value) { - if (value == null) { return null; } if (value instanceof java.sql.Date) { return (java.sql.Date) value; - } else if (value instanceof java.util.Date) { return new java.sql.Date(((java.util.Date) value).getTime()); - } else if (value instanceof Calendar) { return new java.sql.Date(((Calendar) value).getTime().getTime()); - } else if (value instanceof String) { return java.sql.Date.valueOf((String) value); - } else if (value instanceof Number) { return new java.sql.Date(((Number) value).longValue()); - } else if (value instanceof LocalDate) { - return java.sql.Date.valueOf((LocalDate)value); - + return java.sql.Date.valueOf((LocalDate) value); } else { - String m = "Unable to convert [" + value.getClass().getName() + "] into a java.sql.Date."; - throw new RuntimeException(m); + throw new RuntimeException("Unable to convert " + value); } } @@ -412,7 +348,6 @@ public final class BasicTypeConverter implements Serializable { * convert the passed in object to a java sql Date. */ public static java.util.Date toUtilDate(Object value) { - if (value == null) { return null; } @@ -420,26 +355,19 @@ public final class BasicTypeConverter implements Serializable { // loss of nanos precision return new java.util.Date(((java.sql.Timestamp) value).getTime()); } - // DEVNOTE: strictly speaking do I need to convert a java.sql.Date to - // java.util.Date? equals() is symmetrical so perhaps this is not - // really required? if (value instanceof java.sql.Date) { return new java.util.Date(((java.sql.Date) value).getTime()); } if (value instanceof java.util.Date) { return (java.util.Date) value; - } else if (value instanceof Calendar) { return ((Calendar) value).getTime(); - } else if (value instanceof String) { return new java.util.Date(Timestamp.valueOf((String) value).getTime()); - } else if (value instanceof Number) { return new java.util.Date(((Number) value).longValue()); - } else { - throw new RuntimeException("Unable to convert [" + value.getClass().getName() + "] into a java.util.Date"); + throw new RuntimeException("Unable to convert " + value); } } @@ -447,37 +375,29 @@ public final class BasicTypeConverter implements Serializable { * convert the passed in object to a java sql Date. */ public static Calendar toCalendar(Object value) { - if (value == null) { return null; } if (value instanceof Calendar) { return (Calendar) value; - } else if (value instanceof java.util.Date) { java.util.Date date = ((java.util.Date) value); return toCalendarFromDate(date); - } else if (value instanceof String) { java.util.Date date = toUtilDate(value); return toCalendarFromDate(date); - } else if (value instanceof Number) { long timeMillis = ((Number) value).longValue(); java.util.Date date = new java.util.Date(timeMillis); return toCalendarFromDate(date); - } else { - String m = "Unable to convert [" + value.getClass().getName() + "] into a java.util.Date"; - throw new RuntimeException(m); + throw new RuntimeException("Unable to convert " + value); } } private static Calendar toCalendarFromDate(java.util.Date date) { - Calendar cal = Calendar.getInstance(); cal.setTime(date); - return cal; } 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/ScalarJsonManager.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonManager.java new file mode 100644 index 000000000..f0e645d1d --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonManager.java @@ -0,0 +1,24 @@ +package io.ebean.core.type; + +import io.ebean.annotation.MutationDetection; + +/** + * Holds the configured mapper and default mutation detection mode to be used. + */ +public interface ScalarJsonManager { + + /** + * Return the default mutation detection mode. + */ + MutationDetection mutationDetection(); + + /** + * Return the object mapper supplied in DatabaseConfig. + */ + Object mapper(); + + /** + * Return the Postgres type given the jdbc type. + */ + String postgresType(int dbType); +} diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonMapper.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonMapper.java new file mode 100644 index 000000000..5a027ff96 --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonMapper.java @@ -0,0 +1,23 @@ +package io.ebean.core.type; + +import io.avaje.lang.Nullable; + +import java.lang.annotation.Annotation; + +/** + * Supports JSON bean properties that use something like Jackson ObjectMapper to convert between + * JSON content and the logical bean property value. + */ +public interface ScalarJsonMapper { + + /** + * Return a ScalarType for the given JSON property. + */ + ScalarType createType(ScalarJsonRequest request); + + /** + * Return a marker annotation to detect when the JSON mapper should be used explicitly. + */ + @Nullable +
Class markerAnnotation(); +} diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonRequest.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonRequest.java new file mode 100644 index 000000000..c47681fd1 --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarJsonRequest.java @@ -0,0 +1,67 @@ +package io.ebean.core.type; + +import io.ebean.annotation.MutationDetection; + +/** + * A request to create a ScalarType for a bean property (typically annotated with {@code @DbJson}). + */ +public final class ScalarJsonRequest { + + private final ScalarJsonManager manager; + private final int dbType; + private final DocPropertyType docType; + private final Class beanType; + private final MutationDetection mode; + private final String name; + + public ScalarJsonRequest(ScalarJsonManager manager, int dbType, DocPropertyType docType, Class beanType, MutationDetection mode, String name) { + this.manager = manager; + this.dbType = dbType; + this.docType = docType; + this.beanType = beanType; + this.mode = mode; + this.name = name; + } + + /** + * Return the manager. + */ + public ScalarJsonManager manager() { + return manager; + } + + /** + * Return the jdbc type this property maps to (e.g. JSON, JSONB etc). + */ + public int dbType() { + return dbType; + } + + /** + * Return the document store docType. + */ + public DocPropertyType docType() { + return docType; + } + + /** + * Return the type of the bean that this property belongs to. + */ + public Class beanType() { + return beanType; + } + + /** + * Return the mutation detection mode the property should use. + */ + public MutationDetection mode() { + return mode; + } + + /** + * Return the property name. + */ + public String name() { + return name; + } +} diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java index af3e73493..9047befb0 100644 --- a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarType.java @@ -2,7 +2,6 @@ package io.ebean.core.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; - import io.ebean.text.StringFormatter; import io.ebean.text.StringParser; @@ -34,7 +33,7 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData /** * Return true for types that do mutation detection based on json content. */ - default boolean isJsonMapper() { + default boolean jsonMapper() { return false; } @@ -42,14 +41,14 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData * Return true if this is a binary type and can not support parse() and format() from/to string. * This allows Ebean to optimise marshalling types to string. */ - default boolean isBinaryType() { + default boolean binary() { return false; } /** * Return true if this is a mutable scalar type (like hstore). */ - default boolean isMutable() { + default boolean mutable() { return false; } @@ -67,7 +66,7 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData * If a BeanProperty has no explicit length defined then this length should * be assigned. */ - default int getLength() { + default int length() { return 0; } @@ -77,7 +76,7 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData * If it is native to JDBC then its values/instances do not need to be * converted to and from an associated JDBC type. */ - boolean isJdbcNative(); + boolean jdbcNative(); /** * Return the type as per java.sql.Types that this maps to. @@ -85,14 +84,19 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData * This type should be consistent with the toJdbcType() method in converting * the type to the appropriate type for binding to preparedStatements. */ - int getJdbcType(); + int jdbcType(); /** * Return the type that matches the bean property type. *

* This represents the 'logical' type rather than the JDBC type this maps to. */ - Class getType(); + Class type(); + + /** + * Return the type this maps to for JSON document stores. + */ + DocPropertyType docType(); /** * Read the value from the resultSet and convert if necessary to the logical @@ -101,12 +105,6 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData @Override T read(DataReader reader) throws SQLException; - /** - * Ignore the reading of this value. Typically, this means moving the index - * position in the ResultSet. - */ - void loadIgnore(DataReader reader); - /** * Convert (if necessary) and bind the value to the preparedStatement. *

@@ -135,6 +133,14 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData */ T toBeanType(Object value); + /** + * Convert the string value to the appropriate java object. + *

+ * Mostly used to support CSV, JSON and XML parsing. + */ + @Override + T parse(String value); + /** * Convert the type into a string representation. */ @@ -147,34 +153,10 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData *

* This is so that ScalarType also implements the StringFormatter interface. */ + @SuppressWarnings("unchecked") @Override - String format(Object value); - - /** - * Convert the string value to the appropriate java object. - *

- * Mostly used to support CSV, JSON and XML parsing. - */ - @Override - T parse(String value); - - /** - * Return the type this maps to for JSON document stores. - */ - DocPropertyType getDocType(); - - /** - * Return true if the type can accept long systemTimeMillis input. - *

- * This is used to determine if it is sensible to use the - * {@link #convertFromMillis(long)} method. - *

- * This includes the Date, Calendar, sql Date, Time, Timestamp, JODA types - * as well as Long, BigDecimal and String (although it generally is not - * expected to parse systemTimeMillis to a String or BigDecimal). - */ - default boolean isDateTimeCapable() { - return false; + default String format(Object value) { + return formatValue((T) value); } /** @@ -184,15 +166,6 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData throw new UnsupportedOperationException(); } - /** - * Convert the systemTimeMillis into the appropriate java object. - *

- * For non dateTime types this will throw an exception. - */ - default T convertFromMillis(long dateTime) { - throw new UnsupportedOperationException(); - } - /** * Read the value from binary input. */ diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBase.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBase.java new file mode 100644 index 000000000..3231016c2 --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBase.java @@ -0,0 +1,33 @@ +package io.ebean.core.type; + +/** + * Base ScalarType object. + */ +public abstract class ScalarTypeBase implements ScalarType { + + protected final Class type; + protected final boolean jdbcNative; + protected final int jdbcType; + + public ScalarTypeBase(Class type, boolean jdbcNative, int jdbcType) { + this.type = type; + this.jdbcNative = jdbcNative; + this.jdbcType = jdbcType; + } + + @Override + public boolean jdbcNative() { + return jdbcNative; + } + + @Override + public int jdbcType() { + return jdbcType; + } + + @Override + public Class type() { + return type; + } + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDate.java similarity index 70% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java rename to ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDate.java index 4e55d34de..5d76cfade 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDate.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type; +package io.ebean.core.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -7,6 +7,7 @@ import io.ebean.config.JsonConfig; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import java.io.DataInput; import java.io.DataOutput; @@ -18,15 +19,20 @@ import java.sql.Types; /** * Base class for Date types. */ -abstract class ScalarTypeBaseDate extends ScalarTypeBase { +public abstract class ScalarTypeBaseDate extends ScalarTypeBase { protected final JsonConfig.Date mode; - ScalarTypeBaseDate(JsonConfig.Date mode, Class type, boolean jdbcNative, int jdbcType) { + public ScalarTypeBaseDate(JsonConfig.Date mode, Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); this.mode = mode; } + /** + * Convert the value to ISO8601 format. + */ + protected abstract String toIsoFormat(T value); + /** * Convert the target value to millis. */ @@ -53,38 +59,27 @@ abstract class ScalarTypeBaseDate extends ScalarTypeBase { @Override public T read(DataReader reader) throws SQLException { - Date ts = reader.getDate(); - return ts == null ? null : convertFromDate(ts); + final Date date = reader.getDate(); + return date == null ? null : convertFromDate(date); } @Override - public String formatValue(T t) { - Date date = convertToDate(t); - // format all dates into epoch millis - long epochMillis = date.getTime(); - return Long.toString(epochMillis); + public String formatValue(T value) { + final Date date = convertToDate(value); + return Long.toString(date.getTime()); } @Override public T parse(String value) { try { - long epochMillis = Long.parseLong(value); - return convertFromDate(new Date(epochMillis)); + return convertFromDate(new Date(Long.parseLong(value))); } catch (NumberFormatException e) { - Date date = Date.valueOf(value); - return convertFromDate(date); + return convertFromDate(Date.valueOf(value)); } } - @Override public T convertFromMillis(long systemTimeMillis) { - Date ts = new Date(systemTimeMillis); - return convertFromDate(ts); - } - - @Override - public boolean isDateTimeCapable() { - return true; + return convertFromDate(new Date(systemTimeMillis)); } @Override @@ -105,13 +100,8 @@ abstract class ScalarTypeBaseDate extends ScalarTypeBase { } } - /** - * Convert the value to ISO8601 format. - */ - protected abstract String toIsoFormat(T value); - @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.DATE; } @@ -120,9 +110,7 @@ abstract class ScalarTypeBaseDate extends ScalarTypeBase { if (!dataInput.readBoolean()) { return null; } else { - long val = dataInput.readLong(); - Date date = new Date(val); - return convertFromDate(date); + return convertFromDate(new Date(dataInput.readLong())); } } @@ -132,8 +120,7 @@ abstract class ScalarTypeBaseDate extends ScalarTypeBase { dataOutput.writeBoolean(false); } else { dataOutput.writeBoolean(true); - Date date = convertToDate(value); - dataOutput.writeLong(date.getTime()); + dataOutput.writeLong(convertToDate(value).getTime()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDateTime.java similarity index 85% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java rename to ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDateTime.java index aa1670df7..0ee2cb82f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseDateTime.java @@ -1,11 +1,8 @@ -package io.ebeaninternal.server.type; +package io.ebean.core.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.config.JsonConfig; -import io.ebean.core.type.DataBinder; -import io.ebean.core.type.DataReader; -import io.ebean.core.type.DocPropertyType; import java.io.DataInput; import java.io.DataOutput; @@ -16,16 +13,14 @@ import java.sql.Timestamp; import java.sql.Types; import java.time.Instant; -import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.parseIso; - /** * Base type for DateTime types. */ -abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { +public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { protected final JsonConfig.DateTime mode; - ScalarTypeBaseDateTime(JsonConfig.DateTime mode, Class type, boolean jdbcNative, int jdbcType) { + public ScalarTypeBaseDateTime(JsonConfig.DateTime mode, Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); this.mode = mode; } @@ -53,7 +48,6 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { /** * Convert from epoch millis to the value. */ - @Override public abstract T convertFromMillis(long systemTimeMillis); /** @@ -75,7 +69,7 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { * Convert the value to ISO8601 format. */ protected T fromJsonISO8601(String value) { - return convertFromInstant(parseIso(value)); + return convertFromInstant(ScalarTypeUtils.parseInstant(value)); } @Override @@ -101,7 +95,7 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { * Helper method that given epoch seconds and nanos return a JSON nanos formatted string. */ protected String toJsonNanos(long epochSecs, int nanos) { - return DecimalUtils.toDecimal(epochSecs, nanos); + return ScalarTypeUtils.toDecimal(epochSecs, nanos); } @Override @@ -112,7 +106,7 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { } case VALUE_NUMBER_FLOAT: { BigDecimal value = parser.getDecimalValue(); - Timestamp timestamp = DecimalUtils.toTimestamp(value); + Timestamp timestamp = ScalarTypeUtils.toTimestamp(value); return convertFromTimestamp(timestamp); } default: { @@ -139,7 +133,7 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.DATETIME; } @@ -160,11 +154,6 @@ abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { } } - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public T readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseVarchar.java similarity index 79% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java rename to ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseVarchar.java index 75eaa17b5..99c83561b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeBaseVarchar.java @@ -1,11 +1,7 @@ -package io.ebeaninternal.server.type; +package io.ebean.core.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; -import io.ebean.core.type.DataBinder; -import io.ebean.core.type.DataReader; -import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; import java.io.DataInput; import java.io.DataOutput; @@ -17,13 +13,13 @@ import java.sql.Types; * Base ScalarType for types which converts to and from a VARCHAR database * column. */ -abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { +public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { - ScalarTypeBaseVarchar(Class type) { + public ScalarTypeBaseVarchar(Class type) { super(type, false, Types.VARCHAR); } - ScalarTypeBaseVarchar(Class type, boolean jdbcNative, int jdbcType) { + public ScalarTypeBaseVarchar(Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); } @@ -88,12 +84,6 @@ abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { return format(value); } - @Override - @SuppressWarnings("unchecked") - public String format(Object value) { - return formatValue((T) value); - } - @Override public T readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -108,7 +98,8 @@ abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { if (value == null) { dataOutput.writeBoolean(false); } else { - ScalarHelp.writeUTF(dataOutput, convertToDbString(value)); + dataOutput.writeBoolean(true); + dataOutput.writeUTF(convertToDbString(value)); } } @@ -123,7 +114,7 @@ abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.TEXT; } 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/io/ebean/core/type/ScalarTypeUtils.java b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeUtils.java new file mode 100644 index 000000000..efd4b6780 --- /dev/null +++ b/ebean-core-type/src/main/java/io/ebean/core/type/ScalarTypeUtils.java @@ -0,0 +1,179 @@ +package io.ebean.core.type; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.time.Duration; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.UUID; + +/** + * Utilities to aid in the translation of decimal types to/from multiple parts. + * + * @author Nick Williams + * @since 2.2.0 + */ +public final class ScalarTypeUtils { + + private static final char[] ZEROES = new char[]{'0', '0', '0', '0', '0', '0', '0', '0', '0'}; + + private static final BigDecimal ONE_BILLION = new BigDecimal(1000000000L); + + private static final DateTimeFormatter ISO_MILLIS = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendInstant(3) + .toFormatter(); + + /** + * Parse using ISO8601. + */ + public static Instant parseInstant(String jsonDateTime) { + return Instant.parse(jsonDateTime); + } + + /** + * Format using ISO8601. + */ + public static String formatInstant(Instant value) { + return ISO_MILLIS.format(value); + } + + /** + * Convert decimal to duration with nanos. + */ + public static Duration toDuration(BigDecimal value) { + long seconds = value.longValue(); + int nanoseconds = extractNanosecondDecimal(value, seconds); + return Duration.ofSeconds(seconds, nanoseconds); + } + + /** + * Convert duration to decimal with nanos. + */ + public static BigDecimal toDecimal(Duration instant) { + return new BigDecimal(toDecimal(instant.getSeconds(), instant.getNano())); + } + + /** + * Convert decimal to timestamp with nanos. + */ + public static Timestamp toTimestamp(BigDecimal value) { + long seconds = value.longValue(); + int nanoseconds = extractNanosecondDecimal(value, seconds); + Timestamp ts = new Timestamp(seconds * 1000); + ts.setNanos(nanoseconds); + return ts; + } + + /** + * Convert timestamp to decimal with nanos. + */ + public static BigDecimal toDecimal(Timestamp instant) { + long millis = instant.getTime(); + long secs = millis / 1000; + return new BigDecimal(toDecimal(secs, instant.getNanos())); + } + + /** + * Convert to decimal string with nanos. + */ + public static String toDecimal(long seconds, int nanoseconds) { + StringBuilder string = new StringBuilder(Integer.toString(nanoseconds)); + if (string.length() < 9) + string.insert(0, ZEROES, 0, 9 - string.length()); + return seconds + "." + string; + } + + private static int extractNanosecondDecimal(BigDecimal value, long integer) { + return value.subtract(new BigDecimal(integer)).multiply(ONE_BILLION).intValue(); + } + + + /** + * Convert from byte[] to UUID. + */ + public static UUID uuidFromBytes(byte[] bytes, boolean optimized) { + int usableBytes = Math.min(bytes.length, 16); + + // Need exactly 16 bytes - pad the input if not enough bytes are provided + // Use provided bytes in the least significant position; if more than 16 bytes are given, + // then use the first 16 bytes from the array; + byte[] barr = new byte[16]; + for (int i = 15, j = usableBytes - 1; j >= 0; i--, j--) { + barr[i] = bytes[j]; + } + + long msb; + if (optimized) { + msb = ((long)barr[4] << 56) + // XXXXXXXX-____-____-... + ((long)(barr[5] & 255) << 48) + // -> put at end 4..7 of buf + ((long)(barr[6] & 255) << 40) + + ((long)(barr[7] & 255) << 32) + + ((long)(barr[2] & 255) << 24) + // ________-XXXX-____-... + ((barr[3] & 255) << 16) + // put at 2..3 in buf + ((barr[0] & 255) << 8) + // ________-____-XXXX-... + ((barr[1] & 255) << 0); // put at 0..1 in buf + } else { + msb = ((long)barr[0] << 56) + // XXXXXXXX-____-____-... + ((long)(barr[1] & 255) << 48) + + ((long)(barr[2] & 255) << 40) + + ((long)(barr[3] & 255) << 32) + + ((long)(barr[4] & 255) << 24) + // ________-XXXX-____-... + ((barr[5] & 255) << 16) + + ((barr[6] & 255) << 8) + // ________-____-XXXX-... + ((barr[7] & 255) << 0); + } + long lsb = ((long)barr[8] << 56) + + ((long)(barr[9] & 255) << 48) + + ((long)(barr[10] & 255) << 40) + + ((long)(barr[11] & 255) << 32) + + ((long)(barr[12] & 255) << 24) + + ((barr[13] & 255) << 16) + + ((barr[14] & 255) << 8) + + ((barr[15] & 255) << 0); + + return new UUID(msb, lsb); + } + + /** + * Convert from UUID to byte[]. + */ + public static byte[] uuidToBytes(UUID uuid, boolean optimized) { + byte[] ret = new byte[16]; + long l = uuid.getMostSignificantBits(); + + if (optimized) { + ret[0] = (byte) (l >>> 8); // was 6/7 + ret[1] = (byte) (l >>> 0); + + ret[2] = (byte) (l >>> 24); // was 4/5 + ret[3] = (byte) (l >>> 16); + + ret[4] = (byte) (l >>> 56); // was 0..3 + ret[5] = (byte) (l >>> 48); + ret[6] = (byte) (l >>> 40); + ret[7] = (byte) (l >>> 32); + } else { + ret[0] = (byte) (l >>> 56); + ret[1] = (byte) (l >>> 48); + ret[2] = (byte) (l >>> 40); + ret[3] = (byte) (l >>> 32); + ret[4] = (byte) (l >>> 24); + ret[5] = (byte) (l >>> 16); + ret[6] = (byte) (l >>> 8); + ret[7] = (byte) (l >>> 0); + } + l = uuid.getLeastSignificantBits(); + ret[8] = (byte) (l >>> 56); + ret[9] = (byte) (l >>> 48); + ret[10] = (byte) (l >>> 40); + ret[11] = (byte) (l >>> 32); + ret[12] = (byte) (l >>> 24); + ret[13] = (byte) (l >>> 16); + ret[14] = (byte) (l >>> 8); + ret[15] = (byte) (l >>> 0); + + return ret; + } +} 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-type/src/test/java/io/ebean/core/type/DecimalUtilsTest.java b/ebean-core-type/src/test/java/io/ebean/core/type/DecimalUtilsTest.java new file mode 100644 index 000000000..91a7c631c --- /dev/null +++ b/ebean-core-type/src/test/java/io/ebean/core/type/DecimalUtilsTest.java @@ -0,0 +1,36 @@ +package io.ebean.core.type; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.time.Duration; +import java.time.Instant; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DecimalUtilsTest { + + @Test + void testToDecimal() { + Instant now = Instant.now(); + Timestamp sourceTimestamp = Timestamp.from(now); + + BigDecimal decimal = ScalarTypeUtils.toDecimal(sourceTimestamp); + Timestamp timestamp = ScalarTypeUtils.toTimestamp(decimal); + + assertEquals(now, timestamp.toInstant()); + assertEquals(sourceTimestamp, timestamp); + } + + @Test + void testDuration() { + Duration duration = Duration.ofSeconds(323, 1500000); + + BigDecimal bigDecimal = ScalarTypeUtils.toDecimal(duration); + Duration duration1 = ScalarTypeUtils.toDuration(bigDecimal); + + assertEquals(duration, duration1); + assertEquals("PT5M23.0015S", duration1.toString()); + } +} diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/IsoJsonDateTimeParserTest.java b/ebean-core-type/src/test/java/io/ebean/core/type/IsoJsonDateTimeParserTest.java similarity index 59% rename from ebean-core/src/test/java/io/ebeaninternal/server/type/IsoJsonDateTimeParserTest.java rename to ebean-core-type/src/test/java/io/ebean/core/type/IsoJsonDateTimeParserTest.java index 75e600ee6..12740b552 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/IsoJsonDateTimeParserTest.java +++ b/ebean-core-type/src/test/java/io/ebean/core/type/IsoJsonDateTimeParserTest.java @@ -1,5 +1,4 @@ -package io.ebeaninternal.server.type; - +package io.ebean.core.type; import org.junit.jupiter.api.Test; @@ -7,43 +6,43 @@ import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; -public class IsoJsonDateTimeParserTest { +class IsoJsonDateTimeParserTest { - private IsoJsonDateTimeParser parser = new IsoJsonDateTimeParser(); + private ScalarTypeUtils parser = new ScalarTypeUtils(); @Test - public void parseFormat_when_hasMillis() { + void parseFormat_when_hasMillis() { parseAndFormat("2016-02-28T20:39:00.123Z", "2016-02-28T20:39:00.123Z"); } @Test - public void parseFormat_when_noMillis() { + void parseFormat_when_noMillis() { parseAndFormat("2016-02-28T20:39:00Z", "2016-02-28T20:39:00.000Z"); } @Test - public void parseFormat_when_millis_1dp() { + void parseFormat_when_millis_1dp() { parseAndFormat("2016-02-28T20:39:00.0Z", "2016-02-28T20:39:00.000Z"); } @Test - public void parseFormat_when_millis_2dp() { + void parseFormat_when_millis_2dp() { parseAndFormat("2016-02-28T20:39:00.00Z", "2016-02-28T20:39:00.000Z"); } @Test - public void parseFormat_when_millis_3dp() { + void parseFormat_when_millis_3dp() { parseAndFormat("2016-02-28T20:39:00.000Z", "2016-02-28T20:39:00.000Z"); } @Test - public void parseFormat_when_millis_3dp_2() { + void parseFormat_when_millis_3dp_2() { parseAndFormat("2016-02-28T20:39:32.999000Z", "2016-02-28T20:39:32.999Z"); } private void parseAndFormat(String input, String expected) { - Instant timestamp = parser.parseIso(input); - String format = parser.formatIso(timestamp); + Instant timestamp = parser.parseInstant(input); + String format = parser.formatInstant(timestamp); assertThat(format).isEqualTo(expected); } } diff --git a/ebean-core-type/src/test/java/io/ebean/core/type/ScalarTypeUtilsUuidBytesTest.java b/ebean-core-type/src/test/java/io/ebean/core/type/ScalarTypeUtilsUuidBytesTest.java new file mode 100644 index 000000000..851aa9900 --- /dev/null +++ b/ebean-core-type/src/test/java/io/ebean/core/type/ScalarTypeUtilsUuidBytesTest.java @@ -0,0 +1,33 @@ +package io.ebean.core.type; + +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ScalarTypeUtilsUuidBytesTest { + + @Test + void testConversion() { + UUID id = UUID.randomUUID(); + + byte[] bytes = ScalarTypeUtils.uuidToBytes(id, false); + assertEquals(16, bytes.length); + + UUID id2 = ScalarTypeUtils.uuidFromBytes(bytes, false); + assertEquals(id, id2); + } + + @Test + void testConversionOptimized() { + UUID id = UUID.randomUUID(); + + byte[] bytes = ScalarTypeUtils.uuidToBytes(id, true); + assertEquals(16, bytes.length); + + UUID id2 = ScalarTypeUtils.uuidFromBytes(bytes, true); + assertEquals(id, id2); + } + +} diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index e25218321..ac73b3c69 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -3,7 +3,7 @@ ebean-parent io.ebean - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT ebean-core @@ -19,6 +19,11 @@ + + io.ebean + ebean-api + 13.10.1-SNAPSHOT + io.ebean @@ -38,22 +43,16 @@ ${ebean-migration-auto.version} - - io.ebean - ebean-api - 13.7.1-SNAPSHOT - - io.ebean ebean-core-type - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT io.ebean ebean-externalmapping-api - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT @@ -106,7 +105,7 @@ joda-time joda-time - 2.9.7 + 2.11.1 true @@ -136,7 +135,7 @@ org.postgresql postgresql - 42.4.1 + 42.5.0 true @@ -144,21 +143,21 @@ io.ebean ebean-platform-h2 - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT test io.ebean ebean-platform-postgres - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT test io.ebean ebean-platform-sqlserver - 13.7.1-SNAPSHOT + 13.10.1-SNAPSHOT test diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java index 1c6d43719..7fffd8c3b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -228,10 +228,9 @@ public final class BindParams implements Serializable { /** * Set a named In parameter that is multi-valued. */ - public Param setArrayParameter(String name, Collection value) { + public void setArrayParameter(String name, Collection value) { Param p = getParam(name); p.setInValue(new MultiValueWrapper(value)); - return p; } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CQueryPlanKey.java b/ebean-core/src/main/java/io/ebeaninternal/api/CQueryPlanKey.java index 2d3425573..f23aa4edb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CQueryPlanKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CQueryPlanKey.java @@ -9,7 +9,7 @@ public interface CQueryPlanKey { * Used by read audit such that we can log read audit entries without the full sql * (which would make the read audit logs verbose). */ - String getPartialKey(); + String partialKey(); /** * Return a query plan key taking into account persist cascading. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CoreLog.java b/ebean-core/src/main/java/io/ebeaninternal/api/CoreLog.java index cfbf56283..85b491d15 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CoreLog.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CoreLog.java @@ -1,13 +1,12 @@ package io.ebeaninternal.api; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.avaje.applog.AppLog; /** * Common loggers used in ebean-core. */ public final class CoreLog { - public static final Logger log = LoggerFactory.getLogger("io.ebean.core"); - public static final Logger internal = LoggerFactory.getLogger("io.ebean.internal"); + public static final System.Logger log = AppLog.getLogger("io.ebean.core"); + public static final System.Logger internal = AppLog.getLogger("io.ebean.internal"); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java b/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java index dcbc3c32b..41cd37de9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java @@ -7,17 +7,18 @@ import io.ebeaninternal.server.core.BindPadding; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Request for loading Associated Many Beans. */ public final class LoadManyRequest extends LoadRequest { - private static final Logger log = CoreLog.log; + private static final System.Logger log = CoreLog.log; private final List> batch; private final LoadManyBuffer loadContext; @@ -113,10 +114,10 @@ public final class LoadManyRequest extends LoadRequest { // in the +query or +lazy load due to no rows (predicates) for (BeanCollection bc : batch) { if (bc.checkEmptyLazyLoad()) { - if (log.isDebugEnabled()) { + if (log.isLoggable(DEBUG)) { EntityBean ownerBean = bc.getOwnerBean(); Object parentId = desc.getId(ownerBean); - log.debug("BeanCollection after lazy load was empty. type:" + ownerBean.getClass().getName() + " id:" + parentId + " owner:" + ownerBean); + log.log(DEBUG, "BeanCollection after lazy load was empty. type:{0} id:{1} owner:{2}", ownerBean.getClass().getName(), parentId, ownerBean); } } else if (loadCache && many.isUseCache()) { desc.cacheManyPropPut(many, bc, desc.getId(bc.getOwnerBean())); diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java b/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java index 2278d5d11..463f1705e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java @@ -50,7 +50,6 @@ public final class ManyWhereJoins implements Serializable { * Add a many where join. */ public void add(ElPropertyDeploy elProp) { - String join = elProp.elPrefix(); BeanProperty p = elProp.beanProperty(); if (p instanceof BeanPropertyAssocMany) { @@ -111,7 +110,6 @@ public final class ManyWhereJoins implements Serializable { * Return the set of property names for the many where joins. */ public TreeSet getPropertyNames() { - TreeSet propertyNames = new TreeSet<>(); for (PropertyJoin join : joins.values()) { propertyNames.add(join.getProperty()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java index a8b4d348d..e83bed445 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java @@ -142,7 +142,9 @@ public final class NaturalKeyQueryData { */ private boolean matchProperties() { if (naturalKey.isSingleProperty()) { - naturalKey.matchSingleProperty((inProperty != null) ? inProperty : eqList.get(0).property); + if (naturalKey.matchSingleProperty((inProperty != null) ? inProperty : eqList.get(0).property)) { + return true; + } } // multiple properties case diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java index 33ee06b54..f8b1dd65a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java @@ -1,6 +1,6 @@ package io.ebeaninternal.api; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; final class NoopQueryBindCapture implements SpiQueryBindCapture { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java b/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java index f3ca6555f..b35ad5ed2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java @@ -45,15 +45,14 @@ public final class ScopeTrans { * Flag set when nested commit has occurred. */ private boolean nestedCommit; + private boolean nestedUseSavepoint; public ScopeTrans(boolean rollbackOnChecked, boolean created, SpiTransaction transaction, TxScope txScope) { - this.rollbackOnChecked = rollbackOnChecked; this.created = created; this.transaction = transaction; this.noRollbackFor = txScope.getNoRollbackFor(); this.rollbackFor = txScope.getRollbackFor(); - if (transaction != null) { if (!created && txScope.isBatchSet() || txScope.isBatchOnCascadeSet() || txScope.isBatchSizeSet()) { restoreBatch = transaction.isBatchMode(); @@ -87,13 +86,21 @@ public final class ScopeTrans { @Override public String toString() { - return "ScopeTrans[" + transaction + "]"; + return "ScopeTrans " + transaction; + } + + void setNestedUseSavepoint() { + nestedUseSavepoint = true; + } + + boolean isNestedUseSavepoint() { + return nestedUseSavepoint; } /** * Return the current/active transaction. */ - protected SpiTransaction getTransaction() { + SpiTransaction getTransaction() { return transaction; } @@ -101,7 +108,6 @@ public final class ScopeTrans { * Complete the transaction from enhanced transactional. Try to commit. */ void complete(Object returnOrThrowable, int opCode) { - if (opCode == OPCODE_ATHROW) { // exited with a Throwable caughtThrowable((Throwable) returnOrThrowable); @@ -124,7 +130,7 @@ public final class ScopeTrans { } } - protected void commitTransaction() { + void commitTransaction() { if (created) { transaction.commit(); } else { @@ -168,14 +174,13 @@ public final class ScopeTrans { * Returns the exception and this should be thrown by the calling code. */ public T caughtThrowable(T e) { - if (isRollbackThrowable(e)) { rollback(e); } return e; } - protected void rollback(Throwable e) { + void rollback(Throwable e) { if (transaction != null && transaction.isActive()) { // transaction is null for NOT_SUPPORTED and sometimes SUPPORTS // and Inactive (already rolled back) if nested REQUIRED @@ -188,21 +193,17 @@ public final class ScopeTrans { * Return true if this throwable should cause a rollback to occur. */ private boolean isRollbackThrowable(Throwable e) { - if (e instanceof Error) { return true; } - if (noRollbackFor != null) { for (Class aNoRollbackFor : noRollbackFor) { if (aNoRollbackFor.equals(e.getClass())) { - // explicit no rollback for this one return false; } } } - if (rollbackFor != null) { for (Class aRollbackFor : rollbackFor) { if (aRollbackFor.equals(e.getClass())) { @@ -211,7 +212,6 @@ public final class ScopeTrans { } } } - // checked exceptions... // EJB defaults this to false which is not intuitive IMO // Ebean makes this configurable (default to true) diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java index 383746f13..c078fa55c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -7,7 +7,7 @@ import javax.persistence.PersistenceException; /** * Manage scoped (typically thread local) transactions. - * + *

* These can be nested and internally they are pushed and popped from a stack. */ public final class ScopedTransaction extends SpiTransactionProxy { @@ -30,16 +30,29 @@ public final class ScopedTransaction extends SpiTransactionProxy { @Override public String toString() { - return "ScopedTransaction[" + current + "]"; + return "ScopedTransaction " + current; + } + + @Override + public void setNestedUseSavepoint() { + current.setNestedUseSavepoint(); + } + + @Override + public boolean isNestedUseSavepoint() { + return current.isNestedUseSavepoint(); } /** * Push the scope transaction. */ public void push(ScopeTrans scopeTrans) { - if (current != null) { stack.push(current); + if (current.isNestedUseSavepoint()) { + // child scope 'inherits' nestedUseSavepoint + scopeTrans.setNestedUseSavepoint(); + } } current = scopeTrans; transaction = scopeTrans.getTransaction(); @@ -111,6 +124,11 @@ public final class ScopedTransaction extends SpiTransactionProxy { } } + @Override + public void rollbackAndContinue() { + transaction.rollbackAndContinue(); + } + @Override public void rollback() throws PersistenceException { try { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java index 8fe986259..030042d96 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java @@ -13,8 +13,8 @@ import java.io.IOException; */ public interface SpiExpression extends Expression { - static final String SQL_TRUE = "1=1"; - static final String SQL_FALSE = "1=0"; + String SQL_TRUE = "1=1"; + String SQL_FALSE = "1=0"; /** * Simplify nested expressions if possible. @@ -110,4 +110,11 @@ public interface SpiExpression extends Expression { * Apply property prefix when filterMany expressions included into main query. */ void prefixProperty(String path); + + /** + * Return a copy of the expression (as part of creating a query copy). + */ + default SpiExpression copy() { + return this; + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java index c8a008351..76e7cad99 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -314,7 +314,7 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod * Return true if select all properties was used to ensure the property * invoking a lazy load was included in the query. */ - boolean selectAllForLazyLoadProperty(); + void selectAllForLazyLoadProperty(); /** * Set the select properties. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryBindCapture.java index db5cbd9b6..3f3a5b768 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryBindCapture.java @@ -1,6 +1,6 @@ package io.ebeaninternal.api; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; /** * Capture query bind values and with those actual database query plans. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java index 0b4c3ea0a..137cf60ff 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java @@ -10,27 +10,27 @@ public interface SpiQueryPlan { /** * The related entity bean type */ - Class getBeanType(); + Class beanType(); /** * The plan name. */ - String getName(); + String name(); /** * The hash of the sql. */ - String getHash(); + String hash(); /** * The SQL for the query plan. */ - String getSql(); + String sql(); /** * The related profile location. */ - ProfileLocation getProfileLocation(); + ProfileLocation profileLocation(); /** * Initiate bind capture with the give threshold. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java index c2c6194cd..2c06dbb81 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java @@ -139,7 +139,7 @@ public final class TransactionEvent implements Serializable { /** * Return the CacheChangeSet that we add cache notification messages to. - * + *

* We want to add to this change set as we process requests allowing the * PersistRequestBean to be garbage collected for large transactions. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/TxnProfileEventCodes.java b/ebean-core/src/main/java/io/ebeaninternal/api/TxnProfileEventCodes.java index 8c492d77b..f2339cbc9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/TxnProfileEventCodes.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/TxnProfileEventCodes.java @@ -2,7 +2,7 @@ package io.ebeaninternal.api; /** * Event codes used in transaction profiling. - * + *

* These appear in verbose transaction profile logs. */ public interface TxnProfileEventCodes { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonReader.java b/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonReader.java index 8082e049a..1aaaf12fe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonReader.java @@ -12,7 +12,7 @@ import java.util.Map; public interface SpiJsonReader { - PersistenceContext getPersistenceContext(); + PersistenceContext persistenceContext(); SpiJsonReader forJson(JsonParser moreJson); @@ -20,9 +20,9 @@ public interface SpiJsonReader { Object persistenceContextPutIfAbsent(Object id, EntityBean bean, BeanDescriptor beanDesc); - ObjectMapper getObjectMapper(); + ObjectMapper mapper(); - JsonParser getParser(); + JsonParser parser(); JsonToken nextToken() throws IOException; @@ -34,5 +34,5 @@ public interface SpiJsonReader { Object readValueUsingObjectMapper(Class propertyType) throws IOException; - boolean isIntercept(); + boolean intercept(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonWriter.java b/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonWriter.java index 4d80bc4f7..f6069b82c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonWriter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/json/SpiJsonWriter.java @@ -20,7 +20,7 @@ public interface SpiJsonWriter extends JsonWriter { /** * Return true if the value is a parent bean. */ - boolean isParentBean(Object value); + boolean parentBean(Object value); /** * Start an assoc one path. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBind.java similarity index 92% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBind.java index ab17244e4..8ca702c29 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBind.java @@ -1,25 +1,18 @@ -package io.ebeaninternal.server.type; +package io.ebeaninternal.server.bind; import io.ebean.core.type.DataBinder; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.server.core.timezone.DataTimeZone; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.io.StringReader; +import java.io.*; import java.math.BigDecimal; -import java.sql.Array; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Time; -import java.sql.Timestamp; +import java.sql.*; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import static java.lang.System.Logger.Level.WARNING; + public class DataBind implements DataBinder { private final DataTimeZone dataTimeZone; @@ -109,7 +102,7 @@ public class DataBind implements DataBinder { try { inputStream.close(); } catch (IOException e) { - CoreLog.log.warn("Error closing InputStream that was bound to PreparedStatement", e); + CoreLog.log.log(WARNING, "Error closing InputStream that was bound to PreparedStatement", e); } } inputStreams = null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBindCapture.java similarity index 84% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBindCapture.java index 659d0ef06..78924bafe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/DataBindCapture.java @@ -1,8 +1,8 @@ -package io.ebeaninternal.server.type; +package io.ebeaninternal.server.bind; import io.ebeaninternal.server.core.timezone.DataTimeZone; -import io.ebeaninternal.server.type.bindcapture.BindCapture; -import io.ebeaninternal.server.type.bindcapture.BindCaptureStatement; +import io.ebeaninternal.server.bind.capture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCaptureStatement; /** * Special DataBind used to capture bind values for obtaining explain plans. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCapture.java similarity index 93% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCapture.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCapture.java index 3e75d68a3..c51fb9e97 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCapture.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type.bindcapture; +package io.ebeaninternal.server.bind.capture; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureEntry.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureEntry.java similarity index 81% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureEntry.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureEntry.java index 3bb7d3f95..b1f4ef6ae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureEntry.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureEntry.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type.bindcapture; +package io.ebeaninternal.server.bind.capture; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatement.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatement.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatement.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatement.java index 916c1c355..04ad70753 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatement.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type.bindcapture; +package io.ebeaninternal.server.bind.capture; import java.io.InputStream; import java.io.Reader; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatementBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatementBase.java similarity index 99% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatementBase.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatementBase.java index ba4e01524..6e547dcaf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureStatementBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureStatementBase.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type.bindcapture; +package io.ebeaninternal.server.bind.capture; import java.io.InputStream; import java.io.Reader; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureTypes.java b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureTypes.java similarity index 99% rename from ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureTypes.java rename to ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureTypes.java index b2e36f828..c8cf8496b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/bindcapture/BindCaptureTypes.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/bind/capture/BindCaptureTypes.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.type.bindcapture; +package io.ebeaninternal.server.bind.capture; import java.io.ByteArrayInputStream; import java.io.StringReader; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheHolder.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheHolder.java index ad3faa749..aff1929b6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheHolder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheHolder.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.cache; +import io.avaje.applog.AppLog; import io.ebean.annotation.Cache; import io.ebean.annotation.CacheBeanTuning; import io.ebean.annotation.CacheQueryTuning; @@ -7,20 +8,21 @@ import io.ebean.cache.*; import io.ebean.config.CurrentTenantProvider; import io.ebean.meta.MetricVisitor; import io.ebean.util.AnnotationUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.TRACE; + /** * Manages the construction of caches. */ final class DefaultCacheHolder { - private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.ALL"); + private static final System.Logger log = AppLog.getLogger("io.ebean.cache.ALL"); private final ReentrantLock lock = new ReentrantLock(); private final ConcurrentHashMap allCaches = new ConcurrentHashMap<>(); @@ -89,7 +91,7 @@ final class DefaultCacheHolder { } void clearAll() { - log.debug("clearAll"); + log.log(DEBUG, "clearAll"); for (ServerCache serverCache : allCaches.values()) { serverCache.clear(); } @@ -97,7 +99,7 @@ final class DefaultCacheHolder { public void clear(String name) { - log.debug("clear {}", name); + log.log(DEBUG, "clear {0}", name); clearIfExists(key(name, ServerCacheType.QUERY)); clearIfExists(key(name, ServerCacheType.BEAN)); clearIfExists(key(name, ServerCacheType.NATURAL_KEY)); @@ -112,7 +114,7 @@ final class DefaultCacheHolder { private void clearIfExists(String fullKey) { ServerCache cache = allCaches.get(fullKey); if (cache != null) { - log.trace("clear cache {}", fullKey); + log.log(TRACE, "clear cache {0}", fullKey); cache.clear(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java index f3b49fd2e..e68c9a308 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java @@ -1,13 +1,12 @@ package io.ebeaninternal.server.cache; +import io.avaje.applog.AppLog; import io.ebean.BackgroundExecutor; import io.ebean.cache.ServerCache; import io.ebean.cache.ServerCacheStatistics; import io.ebean.meta.MetricVisitor; import io.ebean.metric.CountMetric; import io.ebean.metric.MetricFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.Serializable; import java.lang.ref.SoftReference; @@ -16,6 +15,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.TRACE; +import static java.lang.System.Logger.Level.WARNING; + /** * The default cache implementation. *

@@ -25,7 +27,7 @@ import java.util.concurrent.locks.ReentrantLock; */ public class DefaultServerCache implements ServerCache { - protected static final Logger logger = LoggerFactory.getLogger(DefaultServerCache.class); + protected static final System.Logger logger = AppLog.getLogger(DefaultServerCache.class); /** * Compare by last access time (for LRU eviction). @@ -287,13 +289,13 @@ public class DefaultServerCache implements ServerCache { evictCount.add(trimmedByGC); evictCount.add(trimmedByTTL); evictCount.add(trimmedByLRU); - if (logger.isTraceEnabled()) { + if (logger.isLoggable(TRACE)) { long exeMicros = TimeUnit.MICROSECONDS.convert(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); - logger.trace("Executed trim of cache {} in [{}]millis idle[{}] timeToLive[{}] accessTime[{}] gc[{}]", + logger.log(TRACE, "Executed trim of cache {0} in [{1}]millis idle[{2}] timeToLive[{3}] accessTime[{4}] gc[{5}]", name, exeMicros, trimmedByIdle, trimmedByTTL, trimmedByLRU, trimmedByGC); } } catch (Throwable e) { - logger.warn("Error during trim of DefaultServerCache [" + name + "]. Cache might be bigger than desired.", e); + logger.log(WARNING, "Error during trim of DefaultServerCache [" + name + "]. Cache might be bigger than desired.", e); } } finally { lock.unlock(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheManager.java index 00f551da8..0b7264ff9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheManager.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.cache; +import io.avaje.applog.AppLog; import io.ebean.cache.ServerCache; import io.ebean.cache.ServerCacheRegion; import io.ebean.cache.ServerCacheType; @@ -7,17 +8,18 @@ import io.ebean.meta.MetricVisitor; import io.ebeaninternal.api.SpiCacheRegion; import io.ebeaninternal.server.cluster.ClusterManager; import io.ebeaninternal.server.deploy.DCacheRegion; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.*; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.INFO; + /** * Manages the bean and query caches. */ public final class DefaultServerCacheManager implements SpiCacheManager { - private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.REGION"); + private static final System.Logger log = AppLog.getLogger("io.ebean.cache.REGION"); private final Map regionMap = new HashMap<>(); private final ClusterManager clusterManager; @@ -65,23 +67,23 @@ public final class DefaultServerCacheManager implements SpiCacheManager { enabled.add(region.name()); if (!region.isEnabled()) { region.setEnabled(true); - log.debug("Cache region[{}] enabled", region.name()); + log.log(DEBUG, "Cache region[{0}] enabled", region.name()); } } else { disabled.add(region.name()); if (region.isEnabled()) { region.setEnabled(false); - log.debug("Cache region[{}] disabled", region.name()); + log.log(DEBUG, "Cache region[{0}] disabled", region.name()); } } } - log.info("Cache regions enabled:{} disabled:{}", enabled, disabled); + log.log(INFO, "Cache regions enabled:{0} disabled:{1}", enabled, disabled); } } @Override public void setAllRegionsEnabled(boolean enabled) { - log.debug("All cache regions enabled[{}]", enabled); + log.log(DEBUG, "All cache regions enabled[{0}]", enabled); for (SpiCacheRegion region : regionMap.values()) { region.setEnabled(enabled); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/RemoteCacheEvent.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/RemoteCacheEvent.java index 21f04704d..25a478bc2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/RemoteCacheEvent.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/RemoteCacheEvent.java @@ -52,7 +52,7 @@ public final class RemoteCacheEvent implements BinaryWritable { @Override public String toString() { - return "CacheEvent[ clearAll:" + clearAll + " caches:" + clearCaches + "]"; + return "CacheEvent clearAll:" + clearAll + " caches:" + clearCaches; } public static RemoteCacheEvent readBinaryMessage(BinaryReadContext dataInput) throws IOException { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogListener.java index 597d87df0..7ababb99f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogListener.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.changelog; +import io.avaje.applog.AppLog; import io.ebean.event.changelog.BeanChange; import io.ebean.event.changelog.ChangeLogListener; import io.ebean.event.changelog.ChangeSet; @@ -7,12 +8,13 @@ import io.ebean.event.changelog.ChangeType; import io.ebean.plugin.Plugin; import io.ebean.plugin.SpiServer; import io.ebeaninternal.api.CoreLog; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.StringWriter; import java.util.Properties; +import static java.lang.System.Logger.Level.ERROR; +import static java.lang.System.Logger.Level.INFO; + /** * Simply logs the change sets in JSON form to logger named io.ebean.ChangeLog. */ @@ -21,7 +23,7 @@ public final class DefaultChangeLogListener implements ChangeLogListener, Plugin /** * The named logger we send the change set payload to. Can be externally configured as desired. */ - private static final Logger changeLog = LoggerFactory.getLogger("io.ebean.ChangeLog"); + private static final System.Logger changeLog = AppLog.getLogger("io.ebean.ChangeLog"); /** * Used to build the JSON. @@ -65,9 +67,9 @@ public final class DefaultChangeLogListener implements ChangeLogListener, Plugin try { StringWriter writer = new StringWriter(getBufferSize(beanChange)); jsonBuilder.writeBeanJson(writer, beanChange, changeSet); - changeLog.info(writer.toString()); + changeLog.log(INFO, writer.toString()); } catch (Exception e) { - CoreLog.log.error("Exception logging beanChange " + beanChange, e); + CoreLog.log.log(ERROR, "Exception logging beanChange " + beanChange, e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cluster/BinaryTransactionEventReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/cluster/BinaryTransactionEventReader.java index aebf45ea4..4c3138a45 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cluster/BinaryTransactionEventReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cluster/BinaryTransactionEventReader.java @@ -32,7 +32,7 @@ public class BinaryTransactionEventReader { String serverName = dataInput.readUTF(); SpiEbeanServer server = (SpiEbeanServer) serverLookup.getServer(serverName); if (server == null) { - throw new IllegalStateException("EbeanServer not found for name [" + serverName + "]"); + throw new IllegalStateException("Database not found for name " + serverName); } RemoteTransactionEvent event = new RemoteTransactionEvent(server); event.readBinary(dataInput); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cluster/ClusterManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/cluster/ClusterManager.java index b273c031a..e370534d9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cluster/ClusterManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cluster/ClusterManager.java @@ -1,22 +1,23 @@ package io.ebeaninternal.server.cluster; +import io.avaje.applog.AppLog; import io.ebean.Database; import io.ebean.config.ContainerConfig; import io.ebeaninternal.server.transaction.RemoteTransactionEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Iterator; import java.util.ServiceLoader; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.DEBUG; + /** * Manages the cluster service. */ public class ClusterManager implements ServerLookup { - private static final Logger clusterLogger = LoggerFactory.getLogger("io.ebean.Cluster"); + private static final System.Logger clusterLogger = AppLog.getLogger("io.ebean.Cluster"); private final ReentrantLock lock = new ReentrantLock(); @@ -112,8 +113,8 @@ public class ClusterManager implements ServerLookup { */ public void broadcast(RemoteTransactionEvent event) { if (broadcast != null) { - if (clusterLogger.isDebugEnabled()) { - clusterLogger.debug("sending: {}", event); + if (clusterLogger.isLoggable(DEBUG)) { + clusterLogger.log(DEBUG, "sending: {0}", event); } broadcast.broadcast(event); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java index 01812fe5f..2424dd2b3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java @@ -119,7 +119,7 @@ public abstract class AbstractSqlQueryRequest implements CancelableQuery { int firstRow = query.getFirstRow(); int maxRows = query.getMaxRows(); if (firstRow > 0 || maxRows > 0) { - return server.databasePlatform().getBasicSqlLimiter().limit(sql, firstRow, maxRows); + return server.databasePlatform().basicSqlLimiter().limit(sql, firstRow, maxRows); } return sql; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/BeanRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/BeanRequest.java index 45fe5ff14..b8224bc23 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/BeanRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/BeanRequest.java @@ -6,6 +6,8 @@ import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.core.timezone.DataTimeZone; +import static java.lang.System.Logger.Level.ERROR; + /** * Base class for find and persist requests. */ @@ -61,7 +63,7 @@ public abstract class BeanRequest { // Just log this and carry on. A previous exception has been // thrown and if this rollback throws exception it likely means // that the connection is broken (and the dataSource and db will cleanup) - CoreLog.log.error("Error trying to rollback a transaction (after a prior exception thrown)", e); + CoreLog.log.log(ERROR, "Error trying to rollback a transaction (after a prior exception thrown)", e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java index 407ebcaf8..8fa1093be 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -15,6 +15,9 @@ import java.util.ArrayList; import java.util.List; import java.util.ServiceLoader; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.INFO; + /** * Create a DatabasePlatform from the configuration. *

@@ -38,7 +41,7 @@ public class DatabasePlatformFactory { try { String offlinePlatform = DbOffline.getPlatform(); if (offlinePlatform != null) { - CoreLog.log.info("offline platform [{}]", offlinePlatform); + CoreLog.log.log(INFO, "offline platform [{0}]", offlinePlatform); return byDatabaseName(offlinePlatform); } if (config.getDatabasePlatformName() != null) { @@ -87,7 +90,7 @@ public class DatabasePlatformFactory { String dbProductName = metaData.getDatabaseProductName().toLowerCase(); final int majorVersion = metaData.getDatabaseMajorVersion(); final int minorVersion = metaData.getDatabaseMinorVersion(); - CoreLog.log.debug("platform for productName[{}] version[{}.{}]", dbProductName, majorVersion, minorVersion); + CoreLog.log.log(DEBUG, "platform for productName[{0}] version[{1}.{2}]", dbProductName, majorVersion, minorVersion); for (DatabasePlatformProvider provider : providers) { if (provider.matchByProductName(dbProductName)) { return provider.create(majorVersion, minorVersion, metaData, connection); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java index 5bdf93a34..38a0ebe4d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanLoader.java @@ -12,18 +12,19 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; import io.ebeaninternal.server.transaction.DefaultPersistenceContext; -import org.slf4j.Logger; import javax.persistence.EntityNotFoundException; import java.util.List; import java.util.Set; +import static java.lang.System.Logger.Level.DEBUG; + /** * Helper to handle lazy loading and refreshing of beans. */ final class DefaultBeanLoader { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final DefaultServer server; private final boolean onIterateUseExtraTxn; @@ -108,8 +109,8 @@ final class DefaultBeanLoader { server.findOne(query, null); if (beanCollection != null) { if (beanCollection.checkEmptyLazyLoad()) { - if (log.isDebugEnabled()) { - log.debug("BeanCollection after load was empty. Owner:" + beanCollection.getOwnerBean()); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "BeanCollection after load was empty. Owner:{0}", beanCollection.getOwnerBean()); } } else if (useManyIdCache) { parentDesc.cacheManyPropPut(many, beanCollection, parentId); @@ -228,7 +229,7 @@ final class DefaultBeanLoader { Object dbBean = query.findOne(); if (dbBean == null) { - throw new EntityNotFoundException("Bean not found during lazy load or refresh." + " id[" + id + "] type[" + desc.type() + "]"); + throw new EntityNotFoundException("Bean not found during lazy load or refresh. Id:" + id + " type:" + desc.type()); } desc.resetManyProperties(dbBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index 5b8499661..f15ab82ff 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -1,7 +1,6 @@ package io.ebeaninternal.server.core; import io.ebean.config.*; -import io.ebean.config.EntityClassRegister; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.event.ShutdownManager; import io.ebean.service.SpiContainer; @@ -13,7 +12,6 @@ import io.ebeaninternal.server.cluster.ClusterManager; import io.ebeaninternal.server.core.bootup.BootupClassPathSearch; import io.ebeaninternal.server.core.bootup.BootupClasses; import io.ebeaninternal.server.executor.DefaultBackgroundExecutor; -import org.slf4j.Logger; import javax.persistence.PersistenceException; import java.net.URL; @@ -23,12 +21,14 @@ import java.util.List; import java.util.ServiceLoader; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; + /** * Default Server side implementation of ServerFactory. */ public final class DefaultContainer implements SpiContainer { - private static final Logger log = CoreLog.log; + private static final System.Logger log = CoreLog.log; private final ReentrantLock lock = new ReentrantLock(); private final ClusterManager clusterManager; @@ -108,7 +108,7 @@ public final class DefaultContainer implements SpiContainer { startServer(online, server); } DbOffline.reset(); - log.info("Started database[{}] platform[{}] in {}ms", config.getName(), config.getDatabasePlatform().getPlatform(), System.currentTimeMillis() - start); + log.log(INFO, "Started database[{0}] platform[{1}] in {2}ms", config.getName(), config.getDatabasePlatform().platform(), System.currentTimeMillis() - start); return server; } finally { lock.unlock(); @@ -137,7 +137,7 @@ public final class DefaultContainer implements SpiContainer { private void checkMissingModulePathProvides() { URL servicesFile = ClassLoader.getSystemResource("META-INF/services/io.ebean.config.EntityClassRegister"); if (servicesFile != null) { - log.error("module-info.java is probably missing 'provides io.ebean.config.EntityClassRegister with EbeanEntityRegister' clause. EntityClassRegister exists but was not service loaded."); + log.log(ERROR, "module-info.java is probably missing 'provides io.ebean.config.EntityClassRegister with EbeanEntityRegister' clause. EntityClassRegister exists but was not service loaded."); } } @@ -201,7 +201,7 @@ public final class DefaultContainer implements SpiContainer { DatabasePlatform platform = config.getDatabasePlatform(); if (platform == null) { if (config.getTenantMode().isDynamicDataSource()) { - throw new IllegalStateException("DatabasePlatform must be explicitly set on DatabaseConfig for TenantMode "+config.getTenantMode()); + throw new IllegalStateException("DatabasePlatform must be explicitly set on DatabaseConfig for TenantMode " + config.getTenantMode()); } // automatically determine the platform platform = new DatabasePlatformFactory().create(config); @@ -215,7 +215,7 @@ public final class DefaultContainer implements SpiContainer { */ private void setDataSource(DatabaseConfig config) { if (isOfflineMode(config)) { - log.debug("... DbOffline using platform [{}]", DbOffline.getPlatform()); + log.log(DEBUG, "... DbOffline using platform [{0}]", DbOffline.getPlatform()); } else { InitDataSource.init(config); } @@ -251,7 +251,7 @@ public final class DefaultContainer implements SpiContainer { } try (Connection connection = config.getDataSource().getConnection()) { if (connection.getAutoCommit()) { - log.warn("DataSource [{}] has autoCommit defaulting to true!", config.getName()); + log.log(WARNING, "DataSource [{0}] has autoCommit defaulting to true!", config.getName()); } return true; } catch (SQLException ex) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultQueryPlanListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultQueryPlanListener.java index f748e7f2b..039324072 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultQueryPlanListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultQueryPlanListener.java @@ -1,23 +1,24 @@ package io.ebeaninternal.server.core; +import io.avaje.applog.AppLog; import io.ebean.config.QueryPlanCapture; import io.ebean.config.QueryPlanListener; import io.ebean.meta.MetaQueryPlan; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import static java.lang.System.Logger.Level.INFO; final class DefaultQueryPlanListener implements QueryPlanListener { static final QueryPlanListener INSTANT = new DefaultQueryPlanListener(); - private static final Logger log = LoggerFactory.getLogger("io.ebean.QUERYPLAN"); + private static final System.Logger log = AppLog.getLogger("io.ebean.QUERYPLAN"); @Override public void process(QueryPlanCapture capture) { // better to log this in JSON form? String dbName = capture.database().name(); for (MetaQueryPlan plan : capture.plans()) { - log.info("queryPlan db:{} label:{} queryTimeMicros:{} loc:{} sql:{} bind:{} plan:{}", + log.log(INFO, "queryPlan db:{0} label:{1} queryTimeMicros:{2} loc:{3} sql:{4} bind:{5} plan:{6}", dbName, plan.label(), plan.queryTimeMicros(), plan.profileLocation(), plan.sql(), plan.bind(), plan.plan()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index 8617c2616..2c604ed98 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -2,49 +2,11 @@ package io.ebeaninternal.server.core; import io.avaje.lang.NonNullApi; import io.avaje.lang.Nullable; -import io.ebean.AutoTune; -import io.ebean.BackgroundExecutor; -import io.ebean.BeanState; -import io.ebean.CallableSql; -import io.ebean.DocumentStore; -import io.ebean.DtoQuery; -import io.ebean.ExpressionFactory; -import io.ebean.ExpressionList; -import io.ebean.ExtendedServer; -import io.ebean.Filter; -import io.ebean.FutureIds; -import io.ebean.FutureList; -import io.ebean.FutureRowCount; -import io.ebean.MergeOptions; -import io.ebean.MergeOptionsBuilder; -import io.ebean.PagedList; -import io.ebean.PersistenceContextScope; -import io.ebean.ProfileLocation; -import io.ebean.Query; -import io.ebean.QueryIterator; -import io.ebean.RowConsumer; -import io.ebean.RowMapper; -import io.ebean.ScriptRunner; -import io.ebean.SqlQuery; -import io.ebean.SqlRow; -import io.ebean.SqlUpdate; -import io.ebean.Transaction; -import io.ebean.TransactionCallback; -import io.ebean.TxScope; -import io.ebean.Update; -import io.ebean.UpdateQuery; -import io.ebean.ValuePair; -import io.ebean.Version; +import io.ebean.*; import io.ebean.annotation.Platform; import io.ebean.annotation.TxIsolation; -import io.ebean.bean.BeanCollection; -import io.ebean.bean.BeanLoader; -import io.ebean.bean.CallOrigin; -import io.ebean.bean.EntityBean; -import io.ebean.bean.EntityBeanIntercept; -import io.ebean.bean.PersistenceContext; +import io.ebean.bean.*; import io.ebean.bean.PersistenceContext.WithOption; -import io.ebean.bean.SingleBeanLoader; import io.ebean.cache.ServerCacheManager; import io.ebean.common.CopyOnFirstWriteList; import io.ebean.config.*; @@ -53,17 +15,12 @@ import io.ebean.event.BeanPersistController; import io.ebean.event.ShutdownManager; import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditPrepare; -import io.ebean.meta.MetaInfoManager; -import io.ebean.meta.MetaQueryPlan; -import io.ebean.meta.MetricVisitor; -import io.ebean.meta.QueryPlanInit; -import io.ebean.meta.QueryPlanRequest; +import io.ebean.meta.*; import io.ebean.migration.auto.AutoMigrationRunner; import io.ebean.plugin.BeanType; import io.ebean.plugin.Plugin; import io.ebean.plugin.Property; import io.ebean.plugin.SpiServer; -import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import io.ebeaninternal.api.*; import io.ebeaninternal.api.SpiQuery.Type; @@ -78,30 +35,15 @@ import io.ebeaninternal.server.dto.DtoBeanDescriptor; import io.ebeaninternal.server.dto.DtoBeanManager; import io.ebeaninternal.server.el.ElFilter; import io.ebeaninternal.server.grammer.EqlParser; -import io.ebeaninternal.server.query.CQuery; -import io.ebeaninternal.server.query.CQueryEngine; -import io.ebeaninternal.server.query.CallableQueryCount; -import io.ebeaninternal.server.query.CallableQueryIds; -import io.ebeaninternal.server.query.CallableQueryList; -import io.ebeaninternal.server.query.DtoQueryEngine; -import io.ebeaninternal.server.query.LimitOffsetPagedList; -import io.ebeaninternal.server.query.QueryFutureIds; -import io.ebeaninternal.server.query.QueryFutureList; -import io.ebeaninternal.server.query.QueryFutureRowCount; -import io.ebeaninternal.server.querydefn.DefaultDtoQuery; -import io.ebeaninternal.server.querydefn.DefaultOrmQuery; -import io.ebeaninternal.server.querydefn.DefaultOrmUpdate; -import io.ebeaninternal.server.querydefn.DefaultRelationalQuery; -import io.ebeaninternal.server.querydefn.DefaultUpdateQuery; +import io.ebeaninternal.server.query.*; +import io.ebeaninternal.server.querydefn.*; import io.ebeaninternal.server.rawsql.SpiRawSql; -import io.ebeaninternal.server.text.csv.TCsvReader; import io.ebeaninternal.server.transaction.DefaultPersistenceContext; import io.ebeaninternal.server.transaction.RemoteTransactionEvent; import io.ebeaninternal.server.transaction.TransactionManager; import io.ebeaninternal.util.ParamTypeHelper; import io.ebeaninternal.util.ParamTypeHelper.TypeInfo; import io.ebeanservice.docstore.api.DocStoreIntegration; -import org.slf4j.Logger; import javax.persistence.NonUniqueResultException; import javax.persistence.OptimisticLockException; @@ -120,6 +62,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; +import static java.lang.System.Logger.Level.*; import static java.util.Spliterators.spliteratorUnknownSize; import static java.util.stream.StreamSupport.stream; @@ -129,7 +72,7 @@ import static java.util.stream.StreamSupport.stream; @NonNullApi public final class DefaultServer implements SpiServer, SpiEbeanServer { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final ReentrantLock lock = new ReentrantLock(); private final DatabaseConfig config; @@ -306,7 +249,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public Platform platform() { - return databasePlatform.getPlatform(); + return databasePlatform.platform(); } @Override @@ -373,7 +316,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { migrationRunner.setDefaultDbSchema(dbSchema); } migrationRunner.setName(config.getName()); - Platform platform = config.getDatabasePlatform().getPlatform(); + Platform platform = config.getDatabasePlatform().platform(); migrationRunner.setBasePlatform(platform.base().name().toLowerCase()); migrationRunner.setPlatform(platform.name().toLowerCase()); migrationRunner.loadProperties(config.getProperties()); @@ -386,7 +329,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { if (config.isQueryPlanCapture()) { long secs = config.getQueryPlanCapturePeriodSecs(); if (secs > 10) { - log.info("capture query plan enabled, every {}secs", secs); + log.log(INFO, "capture query plan enabled, every {0}secs", secs); backgroundExecutor.scheduleWithFixedDelay(this::collectQueryPlans, secs, secs, TimeUnit.SECONDS); } } @@ -434,7 +377,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { * Shutdown the services like threads and DataSource. */ private void shutdownInternal(boolean shutdownDataSource, boolean deregisterDriver) { - log.trace("shutting down instance {}", serverName); + log.log(TRACE, "shutting down instance {0}", serverName); if (shutdown) { // already shutdown return; @@ -463,7 +406,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { try { plugin.shutdown(); } catch (Exception e) { - log.error("Error when shutting down plugin", e); + log.log(ERROR, "Error when shutting down plugin", e); } } } @@ -615,7 +558,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { try (Connection connection = dataSource().getConnection()) { for (String table : tables) { executeSql(connection, databasePlatform.truncateStatement(table)); - if (databasePlatform.getPlatform().base() == Platform.DB2) { + if (databasePlatform.platform().base() == Platform.DB2) { // DB2 requires commit after each truncate statement connection.commit(); } @@ -862,10 +805,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return new ElFilter<>(desc(beanType)); } - @Override - public CsvReader createCsvReader(Class beanType) { - return new TCsvReader<>(this, desc(beanType)); - } @Override public UpdateQuery update(Class beanType) { @@ -1140,7 +1079,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { if (list.isEmpty()) { return null; } else if (list.size() > 1) { - throw new NonUniqueResultException("Unique expecting 0 or 1 results but got [" + list.size() + "]"); + throw new NonUniqueResultException("Unique expecting 0 or 1 results but got " + list.size()); } else { return list.get(0); } @@ -1330,7 +1269,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { copy.setFutureFetch(true); Transaction newTxn = createTransaction(); QueryFutureRowCount queryFuture = new QueryFutureRowCount<>(new CallableQueryCount<>(this, copy, newTxn)); - backgroundExecutor.execute(queryFuture.getFutureTask()); + backgroundExecutor.execute(queryFuture.futureTask()); return queryFuture; } @@ -1340,7 +1279,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { copy.setFutureFetch(true); Transaction newTxn = createTransaction(); QueryFutureIds queryFuture = new QueryFutureIds<>(new CallableQueryIds<>(this, copy, newTxn)); - backgroundExecutor.execute(queryFuture.getFutureTask()); + backgroundExecutor.execute(queryFuture.futureTask()); return queryFuture; } @@ -1357,7 +1296,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { // Create a new transaction solely to execute the findList() at some future time Transaction newTxn = createTransaction(); QueryFutureList queryFuture = new QueryFutureList<>(new CallableQueryList<>(this, spiQuery, newTxn)); - backgroundExecutor.execute(queryFuture.getFutureTask()); + backgroundExecutor.execute(queryFuture.futureTask()); return queryFuture; } @@ -2038,7 +1977,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return desc(bean.getClass()).getId(eb); } - private BeanDescriptor desc(Class beanClass) { + private BeanDescriptor desc(Class beanClass) { BeanDescriptor desc = descriptorManager.descriptor(beanClass); if (desc == null) { throw new PersistenceException(beanClass.getName() + " is NOT an Entity Bean registered with this server?"); @@ -2130,7 +2069,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { try { serverCacheManager.clearLocal(Class.forName(cache)); } catch (Exception e) { - log.error("Error clearing local cache for type " + cache, e); + log.log(ERROR, "Error clearing local cache for type " + cache, e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSlowQueryListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSlowQueryListener.java index 64c813213..6dc42b211 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSlowQueryListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSlowQueryListener.java @@ -1,17 +1,18 @@ package io.ebeaninternal.server.core; +import io.avaje.applog.AppLog; import io.ebean.bean.ObjectGraphNode; import io.ebean.config.SlowQueryEvent; import io.ebean.config.SlowQueryListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import static java.lang.System.Logger.Level.WARNING; /** * Default slow query listener implementation that logs a warning message. */ final class DefaultSlowQueryListener implements SlowQueryListener { - private static final Logger log = LoggerFactory.getLogger("io.ebean.SlowQuery"); + private static final System.Logger log = AppLog.getLogger("io.ebean.SlowQuery"); @Override public void process(SlowQueryEvent event) { @@ -20,6 +21,6 @@ final class DefaultSlowQueryListener implements SlowQueryListener { if (node != null) { firstStack = node.getOriginQueryPoint().getTopElement(); } - log.warn("Slow query warning - millis:{} rows:{} caller[{}] sql[{}]", event.getTimeMillis(), event.getRowCount(), firstStack, event.getSql()); + log.log(WARNING, "Slow query warning - millis:{0} rows:{1} caller[{2}] sql[{3}]", event.getTimeMillis(), event.getRowCount(), firstStack, event.getSql()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java index 73ad97f2c..c13a7d6db 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java @@ -100,11 +100,7 @@ final class DumpMetrics { } private void logCount(MetaCountMetric metric) { - - StringBuilder sb = new StringBuilder(); - sb.append(padNameTimed(metric.name())).append(" "); - sb.append(" count:").append(pad(metric.count())); - out(sb.toString()); + out(padNameTimed(metric.name()) + " count:" + pad(metric.count())); } private void out(String sb) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java index c7e17119f..3eb6dfe3a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java @@ -105,7 +105,7 @@ final class InitDataSource { } boolean isPostgresAllQuotedIdentifiers() { - return config.isAllQuotedIdentifiers() && Platform.POSTGRES == config.getDatabasePlatform().getPlatform().base(); + return config.isAllQuotedIdentifiers() && Platform.POSTGRES == config.getDatabasePlatform().platform().base(); } private DataSource create(DataSourceConfig dsConfig, boolean readOnly) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternString.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternString.java index 8a06fc4d4..dadfdb368 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternString.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternString.java @@ -1,38 +1,14 @@ package io.ebeaninternal.server.core; -import java.util.HashMap; -import java.util.concurrent.locks.ReentrantLock; - /** * Used to reduce memory consumption of strings used in deployment processing. - *

- * Using this for now instead of String.intern() to avoid any unexpected - * increase in PermGen space. */ public final class InternString { - private static final HashMap map = new HashMap<>(); - - private static final ReentrantLock lock = new ReentrantLock(); - /** * Return the shared instance of this string. */ public static String intern(String s) { - if (s == null) { - return null; - } - lock.lock(); - try { - String v = map.get(s); - if (v != null) { - return v; - } else { - map.put(s, s); - return s; - } - } finally { - lock.unlock(); - } + return s == null ? null : s.intern(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfigXmlMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfigXmlMap.java index 826cc3471..c55467ce4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfigXmlMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfigXmlMap.java @@ -10,6 +10,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static java.lang.System.Logger.Level.ERROR; + /** * Reads the Xml deployment information. */ @@ -55,7 +57,7 @@ final class InternalConfigXmlMap { try { dtoClass = Class.forName(dto.getClazz(), false, classLoader); } catch (Exception e) { - CoreLog.internal.error("Could not load dto bean class " + dto.getClazz() + " for ebean xml entry"); + CoreLog.internal.log(ERROR, "Could not load dto bean class " + dto.getClazz() + " for ebean xml entry"); return; } DtoNamedQueries namedQueries = dtoNamedQueries.computeIfAbsent(dtoClass, aClass -> new DtoNamedQueries()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index e6944a9e9..bce133978 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -46,7 +46,7 @@ import io.ebeaninternal.server.persist.platform.PostgresMultiValueBind; import io.ebeaninternal.server.query.*; import io.ebeaninternal.server.readaudit.DefaultReadAuditLogger; import io.ebeaninternal.server.readaudit.DefaultReadAuditPrepare; -import io.ebeaninternal.server.text.json.DJsonContext; +import io.ebeaninternal.server.json.DJsonContext; import io.ebeaninternal.server.transaction.*; import io.ebeaninternal.server.type.DefaultTypeManager; import io.ebeaninternal.server.type.TypeManager; @@ -56,17 +56,18 @@ import io.ebeanservice.docstore.api.DocStoreFactory; import io.ebeanservice.docstore.api.DocStoreIntegration; import io.ebeanservice.docstore.api.DocStoreUpdateProcessor; import io.ebeanservice.docstore.none.NoneDocStoreFactory; -import org.slf4j.Logger; import java.util.*; +import static java.lang.System.Logger.Level.*; + /** * Used to extend the DatabaseConfig with additional objects used to configure and * construct an Database. */ public final class InternalConfiguration { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final TableModState tableModState; private final boolean online; @@ -115,7 +116,7 @@ public final class InternalConfiguration { this.databasePlatform = config.getDatabasePlatform(); this.expressionFactory = initExpressionFactory(config); this.typeManager = new DefaultTypeManager(config, bootupClasses); - this.multiValueBind = createMultiValueBind(databasePlatform.getPlatform()); + this.multiValueBind = createMultiValueBind(databasePlatform.platform()); this.deployInherit = new DeployInherit(bootupClasses); this.deployCreateProperties = new DeployCreateProperties(typeManager); this.deployUtil = new DeployUtil(typeManager, config); @@ -170,7 +171,7 @@ public final class InternalConfiguration { * Create and return the ExpressionFactory based on configuration and database platform. */ private ExpressionFactory initExpressionFactory(DatabaseConfig config) { - boolean nativeIlike = config.isExpressionNativeIlike() && databasePlatform.isSupportsNativeIlike(); + boolean nativeIlike = config.isExpressionNativeIlike() && databasePlatform.supportsNativeIlike(); return new DefaultExpressionFactory(config.isExpressionEqualsWithNullAsNoop(), nativeIlike); } @@ -246,7 +247,7 @@ public final class InternalConfiguration { */ ReadAuditLogger getReadAuditLogger() { ReadAuditLogger found = bootupClasses.getReadAuditLogger(); - return plugin(found != null ? found : jacksonCorePresent? new DefaultReadAuditLogger(): null); + return plugin(found != null ? found : jacksonCorePresent ? new DefaultReadAuditLogger() : null); } /** @@ -264,7 +265,7 @@ public final class InternalConfiguration { DbExpressionHandler jsonHandler = getDbExpressionHandler(databasePlatform); - DbHistorySupport historySupport = databasePlatform.getHistorySupport(); + DbHistorySupport historySupport = databasePlatform.historySupport(); if (historySupport == null) { return new Binder(typeManager, logManager, 0, false, jsonHandler, dataTimeZone, multiValueBind); } @@ -320,7 +321,7 @@ public final class InternalConfiguration { } private Platform getPlatform() { - return getDatabasePlatform().getPlatform(); + return getDatabasePlatform().platform(); } public DatabasePlatform getDatabasePlatform() { @@ -433,7 +434,7 @@ public final class InternalConfiguration { externalTransactionManager = new JtaTransactionManager(); } if (externalTransactionManager != null) { - log.info("Using Transaction Manager [" + externalTransactionManager.getClass() + "]"); + log.log(INFO, "Using Transaction Manager {0}", externalTransactionManager.getClass()); return new ExternalTransactionScopeManager(externalTransactionManager); } else { return new DefaultTransactionScopeManager(); @@ -523,7 +524,7 @@ public final class InternalConfiguration { if (iterator.hasNext()) { // use the cacheFactory (via classpath service loader) plugin = iterator.next(); - log.debug("using ServerCacheFactory {}", plugin.getClass()); + log.log(DEBUG, "using ServerCacheFactory {0}", plugin.getClass()); } else { // use the built in default l2 caching which is local cache based localL2Caching = true; @@ -576,7 +577,7 @@ public final class InternalConfiguration { return QueryPlanManager.NOOP; } long threshold = config.getQueryPlanThresholdMicros(); - return new CQueryPlanManager(transactionManager, threshold, queryPlanLogger(databasePlatform.getPlatform()), extraMetrics); + return new CQueryPlanManager(transactionManager, threshold, queryPlanLogger(databasePlatform.platform()), extraMetrics); } /** @@ -605,6 +606,7 @@ public final class InternalConfiguration { private static class NoopDdl implements SpiDdlGenerator { private final boolean ddlRun; + NoopDdl(boolean ddlRun) { this.ddlRun = ddlRun; } @@ -612,7 +614,7 @@ public final class InternalConfiguration { @Override public void execute(boolean online) { if (online && ddlRun) { - CoreLog.log.error("Configured to run DDL but ebean-ddl-generator is not in the classpath (or ebean-test in the test classpath?)"); + CoreLog.log.log(ERROR, "Configured to run DDL but ebean-ddl-generator is not in the classpath (or ebean-test in the test classpath?)"); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java index d3ca32b6d..d29beebe0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java @@ -73,4 +73,6 @@ public interface OrmQueryEngine { * Return true if multi-value bind is supported for this type (and current platform). */ boolean isMultiValueSupported(Class valueType); + + int forwardOnlyFetchSize(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index 423d6687b..29dd4ac1d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -24,6 +24,8 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; +import static java.lang.System.Logger.Level.ERROR; + /** * Wraps the objects involved in executing a Query. */ @@ -98,7 +100,7 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery */ @Override public String dbLikeClause(boolean rawLikeExpression) { - return server.databasePlatform().getLikeClause(rawLikeExpression); + return server.databasePlatform().likeClause(rawLikeExpression); } /** @@ -244,7 +246,7 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery // Just log this and carry on. A previous exception has been // thrown and if this rollback throws exception it likely means // that the connection is broken (and the dataSource and db will cleanup) - CoreLog.log.error("Error trying to rollback a transaction (after a prior exception thrown)", e); + CoreLog.log.log(ERROR, "Error trying to rollback a transaction (after a prior exception thrown)", e); } } } @@ -639,7 +641,7 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery for (T bean : actualDetails) { ids.add(beanDescriptor.idForJson(bean)); } - beanDescriptor.readAuditMany(queryPlanKey.getPartialKey(), "l2-query-cache", ids); + beanDescriptor.readAuditMany(queryPlanKey.partialKey(), "l2-query-cache", ids); } } if (Boolean.FALSE.equals(query.isReadOnly())) { @@ -759,6 +761,10 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery * Return true if no MaxRows or use LIMIT in SQL update. */ public boolean isInlineSqlUpdateLimit() { - return query.getMaxRows() < 1 || server.databasePlatform().isInlineSqlUpdateLimit(); + return query.getMaxRows() < 1 || server.databasePlatform().inlineSqlUpdateLimit(); + } + + public int forwardOnlyFetchSize() { + return queryEngine.forwardOnlyFetchSize(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index 2af16b25b..4016596f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -928,20 +928,20 @@ public final class PersistRequestBean extends PersistRequest implements BeanP } private void logSummaryMessage() { - String draft = (beanDescriptor.isDraftable() && !publish) ? " draft[true]" : ""; + String draft = (beanDescriptor.isDraftable() && !publish) ? "] draft[true]" : "]"; String name = beanDescriptor.name(); switch (type) { case INSERT: - transaction.logSummary("Inserted [" + name + "] [" + (idValue == null ? "" : idValue) + "]" + draft); + transaction.logSummary("Inserted [" + name + "] [" + (idValue == null ? "" : idValue) + draft); break; case UPDATE: - transaction.logSummary("Updated [" + name + "] [" + idValue + "]" + draft); + transaction.logSummary("Updated [" + name + "] [" + idValue + draft); break; case DELETE: - transaction.logSummary("Deleted [" + name + "] [" + idValue + "]" + draft); + transaction.logSummary("Deleted [" + name + "] [" + idValue + draft); break; case DELETE_SOFT: - transaction.logSummary("SoftDelete [" + name + "] [" + idValue + "]" + draft); + transaction.logSummary("SoftDelete [" + name + "] [" + idValue + draft); break; default: break; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java index 1edabf5bd..70eebd927 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestCallableSql.java @@ -86,8 +86,7 @@ public final class PersistRequestCallableSql extends PersistRequest { persistExecute.collectSqlCall(label, startNanos); } if (transaction.isLogSummary()) { - String m = "CallableSql label[" + callableSql.getLabel() + "]" + " rows[" + rowCount + "]" + " bind[" + bindLog + "]"; - transaction.logSummary(m); + transaction.logSummary("CallableSql label[" + callableSql.getLabel() + "]" + " rows[" + rowCount + "]" + " bind[" + bindLog + "]"); } // register table modifications with the transaction event diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java index 08de8e27d..eb865a0bd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestOrmUpdate.java @@ -83,8 +83,7 @@ public final class PersistRequestOrmUpdate extends PersistRequest { OrmUpdateType ormUpdateType = ormUpdate.getOrmUpdateType(); String tableName = ormUpdate.getBaseTable(); if (transaction.isLogSummary()) { - String m = ormUpdateType + " table[" + tableName + "] rows[" + rowCount + "] bind[" + bindLog + "]"; - transaction.logSummary(m); + transaction.logSummary(ormUpdateType + " table[" + tableName + "] rows[" + rowCount + "] bind[" + bindLog + "]"); } if (ormUpdate.isNotifyCache()) { // add the modification info to the TransactionEvent diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java index 63f31434a..e2f898e3c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java @@ -49,9 +49,9 @@ public final class PersistRequestUpdateSql extends PersistRequest { /** * Add this statement to JDBC batch for later execution. */ - public int addBatch() { + public void addBatch() { this.addBatch = true; - return executeStatement(true); + executeStatement(true); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java index c3f98854b..039158200 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java @@ -138,7 +138,7 @@ public interface SpiOrmQueryRequest extends BeanQueryRequest, DocQueryRequ /** * Maybe hit the bean cache returning true if everything was obtained from the * cache (that there were no misses). - * + *

* Do this for findList() on many natural keys or many Ids. */ boolean getFromBeanCache(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java index e95c0d461..ed114375b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java @@ -5,7 +5,7 @@ import java.sql.ResultSet; /** * Hold the JDBC PreparedStatement and ResultSet. - * + *

* These both must be closed properly when done. */ public final class SpiResultSet { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClassPathSearch.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClassPathSearch.java index 1c378cbf9..8e2dd4d7f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClassPathSearch.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClassPathSearch.java @@ -4,17 +4,18 @@ import io.avaje.classpath.scanner.ClassPathScanner; import io.ebean.config.DatabaseConfig; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.server.core.ClassPathScanners; -import org.slf4j.Logger; import java.util.List; import java.util.Set; +import static java.lang.System.Logger.Level.DEBUG; + /** * Searches for interesting classes such as Entities, Embedded and ScalarTypes. */ public class BootupClassPathSearch { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final List packages; private final List scanners; @@ -42,7 +43,6 @@ public class BootupClassPathSearch { * Search the classPath for the classes we are interested in. */ private BootupClasses getBootupClasses() { - try { BootupClasses bc = new BootupClasses(); @@ -59,7 +59,7 @@ public class BootupClassPathSearch { } long searchTime = System.currentTimeMillis() - st; - log.debug("Classpath search entities[{}] searchTime[{}] in packages[{}]", bc.getEntities().size(), searchTime, packages); + log.log(DEBUG, "Classpath search entities[{0}] searchTime[{1}] in packages[{2}]", bc.getEntities().size(), searchTime, packages); return bc; } catch (Exception ex) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClasses.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClasses.java index 3fc4bbb95..464731024 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClasses.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/BootupClasses.java @@ -13,7 +13,6 @@ import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditPrepare; import io.ebean.util.AnnotationUtil; import io.ebeaninternal.api.CoreLog; -import org.slf4j.Logger; import javax.persistence.AttributeConverter; import javax.persistence.Embeddable; @@ -25,13 +24,16 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.ERROR; + /** * Interesting classes for a EbeanServer such as Embeddable, Entity, * ScalarTypes, Finders, Listeners and Controllers. */ public class BootupClasses implements Predicate> { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final List> embeddableList = new ArrayList<>(); private final List> entityList = new ArrayList<>(); @@ -205,13 +207,13 @@ public class BootupClasses implements Predicate> { try { return cls.getConstructor().newInstance(); } catch (NoSuchMethodException e) { - log.debug("Ignore/expected - no default constructor: " +e.getMessage()); + log.log(DEBUG, "Ignore/expected - no default constructor: {0}", e.getMessage()); return null; } catch (Exception e) { if (logOnException) { // not expected but we log and carry on - log.error("Error creating " + cls, e); + log.log(ERROR, "Error creating " + cls, e); return null; } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/ManifestReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/ManifestReader.java index d9a651293..e794740e5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/ManifestReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/bootup/ManifestReader.java @@ -3,7 +3,6 @@ package io.ebeaninternal.server.core.bootup; import io.ebean.util.StringHelper; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.util.UrlHelper; -import org.slf4j.Logger; import java.io.IOException; import java.io.InputStream; @@ -15,12 +14,14 @@ import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Manifest; +import static java.lang.System.Logger.Level.WARNING; + /** * Reads all the META-INF/ebean.mf resources with the package locations of entity beans. */ class ManifestReader { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final Set packageSet = new HashSet<>(); private final ClassLoader classLoader; @@ -54,8 +55,7 @@ class ManifestReader { /** * Read all the specific manifest files and return the set of packages containing type query beans. */ - private Set read(ClassLoader classLoader, String resourcePath) { - + private void read(ClassLoader classLoader, String resourcePath) { try { Enumeration resources = classLoader.getResources(resourcePath); while (resources.hasMoreElements()) { @@ -64,16 +64,14 @@ class ManifestReader { } } } catch (IOException e) { - log.warn("Error reading " + resourcePath + " manifest resources", e); + log.log(WARNING, "Error reading " + resourcePath + " manifest resources", e); } - return packageSet; } /** * Read the entity packages from the manifest. */ private void read(Manifest manifest) throws IOException { - Attributes attributes = manifest.getMainAttributes(); String agentOnlyUse = attributes.getValue("agent-use-only"); if (agentOnlyUse == null || !"true".equalsIgnoreCase(agentOnlyUse.trim())) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java index c2ed2a472..7f2366006 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java @@ -61,7 +61,7 @@ abstract class AssocOneHelp { if (id == null) { return null; } - PersistenceContext pc = ctx.getPersistenceContext(); + PersistenceContext pc = ctx.persistenceContext(); Object existing = target.contextGet(pc, id); if (existing != null) { return existing; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefExported.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefExported.java index 8b2fbe7bd..94ffe2686 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefExported.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefExported.java @@ -22,7 +22,7 @@ final class AssocOneHelpRefExported extends AssocOneHelp { @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { // set appropriate tableAlias for the exported id columns - String relativePrefix = ctx.getRelativePrefix(property.name()); + String relativePrefix = ctx.relativePrefix(property.name()); ctx.pushTableAlias(relativePrefix); property.targetIdBinder.appendSelect(ctx, subQuery); ctx.popTableAlias(); @@ -30,7 +30,7 @@ final class AssocOneHelpRefExported extends AssocOneHelp { @Override void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { - String relativePrefix = ctx.getRelativePrefix(property.name()); + String relativePrefix = ctx.relativePrefix(property.name()); if (softDelete && !ctx.isIncludeSoftDelete()) { property.tableJoin.addJoin(joinType, relativePrefix, ctx, softDeletePredicate); } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java index 72fb828c7..df8bff16f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java @@ -22,7 +22,7 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { @Override void loadIgnore(DbReadContext ctx) { property.targetIdBinder.loadIgnore(ctx); - ctx.getDataReader().incrementPos(1); + ctx.dataReader().incrementPos(1); } /** @@ -47,7 +47,7 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { return null; } // check transaction context to see if it already exists - PersistenceContext pc = ctx.getPersistenceContext(); + PersistenceContext pc = ctx.persistenceContext(); Object existing = desc.contextGet(pc, id); if (existing != null) { return existing; @@ -63,7 +63,7 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { // add join to support the discriminator column - String relativePrefix = ctx.getRelativePrefix(property.name); + String relativePrefix = ctx.relativePrefix(property.name); ctx.addExtraJoin(new Extra(relativePrefix, joinType)); } @@ -92,8 +92,8 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { void appendSelect(DbSqlContext ctx, boolean subQuery) { if (!subQuery) { // add discriminator column - String relativePrefix = ctx.getRelativePrefix(property.name()); - String tableAlias = ctx.getTableAlias(relativePrefix); + String relativePrefix = ctx.relativePrefix(property.name()); + String tableAlias = ctx.tableAlias(relativePrefix); ctx.appendColumn(tableAlias, property.targetInheritInfo.getDiscriminatorColumn()); } property.importedId.sqlAppend(ctx); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionUtil.java index e1a0d352c..aa8c72b5a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionUtil.java @@ -46,7 +46,7 @@ public final class BeanCollectionUtil { } else if (o instanceof Collection) { return ((Collection) o); } - throw new PersistenceException("expecting a Map or Collection but got [" + o.getClass().getName() + "]"); + throw new PersistenceException("expecting a Map or Collection but got " + o.getClass().getName()); } /** @@ -73,6 +73,6 @@ public final class BeanCollectionUtil { } else if (o instanceof Collection) { return ((Collection) o); } - throw new PersistenceException("expecting a Map or Collection but got [" + o.getClass().getName() + "]"); + throw new PersistenceException("expecting a Map or Collection but got " + o.getClass().getName()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 08804a53d..eddf39e5d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -45,7 +45,7 @@ import io.ebeaninternal.server.querydefn.DefaultOrmQuery; import io.ebeaninternal.server.querydefn.OrmQueryDetail; import io.ebeaninternal.server.querydefn.OrmQueryProperties; import io.ebeaninternal.server.rawsql.SpiRawSql; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import io.ebeaninternal.util.SortByClause; import io.ebeaninternal.util.SortByClauseParser; import io.ebeanservice.docstore.api.DocStoreBeanAdapter; @@ -54,7 +54,6 @@ import io.ebeanservice.docstore.api.DocStoreUpdates; import io.ebeanservice.docstore.api.mapping.DocMappingBuilder; import io.ebeanservice.docstore.api.mapping.DocPropertyMapping; import io.ebeanservice.docstore.api.mapping.DocumentMapping; -import org.slf4j.Logger; import javax.persistence.PersistenceException; import java.io.IOException; @@ -68,13 +67,15 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import static io.ebeaninternal.server.persist.DmlUtil.isNullOrZero; +import static java.lang.System.Logger.Level.ERROR; +import static java.lang.System.Logger.Level.INFO; /** * Describes Beans including their deployment information. */ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; public enum EntityType { ORM, EMBEDDED, VIEW, SQL, DOC @@ -322,7 +323,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { this.jsonHelp = initJsonHelp(); this.draftHelp = new BeanDescriptorDraftHelp<>(this); this.docStoreAdapter = owner.createDocStoreBeanAdapter(this, deploy); - this.docStoreQueueId = docStoreAdapter.getQueueId(); + this.docStoreQueueId = docStoreAdapter.queueId(); // Check if there are no cascade save associated beans ( subject to change // in initialiseOther()). Note that if we are in an inheritance hierarchy // then we also need to check every BeanDescriptors in the InheritInfo as @@ -494,9 +495,6 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { * as they are used to get the imported and exported properties. */ void initialiseId(BeanDescriptorInitContext initContext) { - if (log.isTraceEnabled()) { - log.trace("BeanDescriptor initialise " + fullName); - } if (draftable) { initContext.addDraft(baseTable, draftTable); } @@ -795,7 +793,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { changeJson.flush(); return beanChange(ChangeType.UPDATE, request.beanId(), changeJson.newJson(), changeJson.oldJson()); } catch (RuntimeException e) { - log.error("Failed to write ChangeLog entry for update", e); + log.log(ERROR, "Failed to write ChangeLog entry for update", e); return null; } } @@ -811,7 +809,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { jsonWriter.flush(); return beanChange(ChangeType.INSERT, request.beanId(), writer.toString(), null); } catch (IOException e) { - log.error("Failed to write ChangeLog entry for insert", e); + log.log(ERROR, "Failed to write ChangeLog entry for insert", e); return null; } } @@ -968,7 +966,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { */ @Override public boolean isDocStoreMapped() { - return docStoreAdapter.isMapped(); + return docStoreAdapter.mapped(); } /** @@ -1074,7 +1072,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { * given the transactions requested mode. */ public DocStoreMode docStoreMode(PersistRequest.Type persistType, DocStoreMode txnMode) { - return docStoreAdapter.getMode(persistType, txnMode); + return docStoreAdapter.mode(persistType, txnMode); } public void docStoreInsert(Object idValue, PersistRequestBean persistRequest, DocStoreUpdateContext bulkUpdate) throws IOException { @@ -1468,7 +1466,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { void queryPlanInit(QueryPlanInit request, List list) { for (CQueryPlan queryPlan : queryPlanCache.values()) { - if (request.includeHash(queryPlan.getHash())) { + if (request.includeHash(queryPlan.hash())) { queryPlan.queryPlanInit(request.thresholdMicros()); list.add(queryPlan.createMeta(null, null)); } @@ -1500,7 +1498,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { * Trim query plans not used since the passed in epoch time. */ void trimQueryPlans(long unusedSince) { - queryPlanCache.values().removeIf(queryPlan -> queryPlan.getLastQueryTime() < unusedSince); + queryPlanCache.values().removeIf(queryPlan -> queryPlan.lastQueryTime() < unusedSince); } /** @@ -1893,7 +1891,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { } BeanPropertyAssoc assocProp = (BeanPropertyAssoc) other._findBeanProperty(split[0]); if (assocProp == null) { - throw new IllegalStateException("Unknown property path [" + split[0] + "] from[" + path + "]"); + throw new IllegalStateException("Unknown property path " + split[0] + " from " + path); } BeanDescriptor targetDesc = assocProp.targetDescriptor(); path = split[1]; @@ -2291,11 +2289,11 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private ElComparator createPropertyComparator(SortByClause.Property sortProp) { ElPropertyValue elGetValue = elGetValue(sortProp.getName()); if (elGetValue == null) { - log.error("Sort property [" + sortProp + "] not found in " + beanType + ". Cannot sort."); + log.log(ERROR, "Sort property [" + sortProp + "] not found in " + beanType + ". Cannot sort."); return new ElComparatorNoop<>(); } if (elGetValue.isAssocMany()) { - log.error("Sort property [" + sortProp + "] in " + beanType + " is a many-property. Cannot sort."); + log.log(ERROR, "Sort property [" + sortProp + "] in " + beanType + " is a many-property. Cannot sort."); return new ElComparatorNoop<>(); } Boolean nullsHigh = sortProp.getNullsHigh(); @@ -2771,7 +2769,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { public void markAsDeleted(EntityBean bean) { if (softDeleteProperty == null) { Object id = getId(bean); - log.info("(Lazy) loading unsuccessful for type:{} id:{} - expecting when bean has been deleted", name(), id); + log.log(INFO, "(Lazy) loading unsuccessful for type:{0} id:{1} - expecting when bean has been deleted", name(), id); bean._ebean_getIntercept().setLazyLoadFailure(id); } else { softDeleteValue(bean); @@ -3159,18 +3157,17 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { /** * Return true if any mutable properties are dirty. */ - public boolean checkAnyMutableProperties(EntityBeanIntercept ebi) { + public void checkAnyMutableProperties(EntityBeanIntercept ebi) { for (BeanProperty beanProperty : propertiesMutable) { int propertyIndex = beanProperty.propertyIndex(); if (ebi.isLoadedProperty(propertyIndex)) { Object value = beanProperty.getValue(ebi.getOwner()); if (beanProperty.checkMutable(value, ebi.isDirtyProperty(propertyIndex), ebi)) { ebi.markPropertyAsChanged(propertyIndex); - return true; + return; } } } - return false; } public ConcurrencyMode concurrencyMode(EntityBeanIntercept ebi) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 725a850e2..eba2da8ee 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.deploy; +import io.avaje.applog.AppLog; import io.ebean.bean.BeanCollection; import io.ebean.bean.EntityBean; import io.ebean.bean.EntityBeanIntercept; @@ -13,12 +14,12 @@ import io.ebeaninternal.server.core.CacheOptions; import io.ebeaninternal.server.core.PersistRequest; import io.ebeaninternal.server.core.PersistRequestBean; import io.ebeaninternal.server.transaction.DefaultPersistenceContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.*; +import static java.lang.System.Logger.Level.*; + /** * Helper for BeanDescriptor that manages the bean, query and collection caches. * @@ -26,12 +27,12 @@ import java.util.*; */ final class BeanDescriptorCacheHelp { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; - private static final Logger queryLog = LoggerFactory.getLogger("io.ebean.cache.QUERY"); - private static final Logger beanLog = LoggerFactory.getLogger("io.ebean.cache.BEAN"); - private static final Logger manyLog = LoggerFactory.getLogger("io.ebean.cache.COLL"); - private static final Logger natLog = LoggerFactory.getLogger("io.ebean.cache.NATKEY"); + private static final System.Logger queryLog = AppLog.getLogger("io.ebean.cache.QUERY"); + private static final System.Logger beanLog = AppLog.getLogger("io.ebean.cache.BEAN"); + private static final System.Logger manyLog = AppLog.getLogger("io.ebean.cache.COLL"); + private static final System.Logger natLog = AppLog.getLogger("io.ebean.cache.NATKEY"); private final BeanDescriptor desc; private final SpiCacheManager cacheManager; @@ -104,10 +105,10 @@ final class BeanDescriptorCacheHelp { void deriveNotifyFlags() { cacheNotifyOnAll = (invalidateQueryCache || beanCache != null || queryCache != null); cacheNotifyOnDelete = !cacheNotifyOnAll && isNotifyOnDeletes(); - if (log.isDebugEnabled()) { + if (log.isLoggable(DEBUG)) { if (cacheNotifyOnAll || cacheNotifyOnDelete) { String notifyMode = cacheNotifyOnAll ? "All" : "Delete"; - log.debug("l2 caching on {} - beanCaching:{} queryCaching:{} notifyMode:{} ", + log.log(DEBUG, "l2 caching on {0} - beanCaching:{1} queryCaching:{2} notifyMode:{3} ", desc.fullName(), isBeanCaching(), isQueryCaching(), notifyMode); } } @@ -178,8 +179,8 @@ final class BeanDescriptorCacheHelp { */ void queryCacheClear() { if (queryCache != null) { - if (queryLog.isDebugEnabled()) { - queryLog.debug(" CLEAR {}", cacheName); + if (queryLog.isLoggable(DEBUG)) { + queryLog.log(DEBUG, " CLEAR {0}", cacheName); } queryCache.clear(); } @@ -202,11 +203,11 @@ final class BeanDescriptorCacheHelp { throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)"); } Object queryResult = queryCache.get(id); - if (queryLog.isDebugEnabled()) { + if (queryLog.isLoggable(DEBUG)) { if (queryResult == null) { - queryLog.debug(" GET {}({}) - cache miss", cacheName, id); + queryLog.log(DEBUG, " GET {0}({1}) - cache miss", cacheName, id); } else { - queryLog.debug(" GET {}({}) - hit", cacheName, id); + queryLog.log(DEBUG, " GET {0}({1}) - hit", cacheName, id); } } return queryResult; @@ -219,8 +220,8 @@ final class BeanDescriptorCacheHelp { if (queryCache == null) { throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)"); } - if (queryLog.isDebugEnabled()) { - queryLog.debug(" PUT {}({})", cacheName, id); + if (queryLog.isLoggable(DEBUG)) { + queryLog.log(DEBUG, " PUT {0}({1})", cacheName, id); } queryCache.put(id, entry); } @@ -228,16 +229,16 @@ final class BeanDescriptorCacheHelp { void manyPropRemove(String propertyName, Object parentId) { ServerCache collectionIdsCache = cacheManager.getCollectionIdsCache(beanType, propertyName); - if (manyLog.isTraceEnabled()) { - manyLog.trace(" REMOVE {}({}).{}", cacheName, parentId, propertyName); + if (manyLog.isLoggable(TRACE)) { + manyLog.log(TRACE, " REMOVE {0}({1}).{2}", cacheName, parentId, propertyName); } collectionIdsCache.remove(parentId); } void manyPropClear(String propertyName) { ServerCache collectionIdsCache = cacheManager.getCollectionIdsCache(beanType, propertyName); - if (manyLog.isDebugEnabled()) { - manyLog.debug(" CLEAR {}(*).{} ", cacheName, propertyName); + if (manyLog.isLoggable(DEBUG)) { + manyLog.log(DEBUG, " CLEAR {0}(*).{1} ", cacheName, propertyName); } collectionIdsCache.clear(); } @@ -249,11 +250,11 @@ final class BeanDescriptorCacheHelp { ServerCache collectionIdsCache = cacheManager.getCollectionIdsCache(beanType, propertyName); CachedManyIds entry = (CachedManyIds) collectionIdsCache.get(parentId); if (entry == null) { - if (manyLog.isTraceEnabled()) { - manyLog.trace(" GET {}({}).{} - cache miss", cacheName, parentId, propertyName); + if (manyLog.isLoggable(TRACE)) { + manyLog.log(TRACE, " GET {0}({1}).{2} - cache miss", cacheName, parentId, propertyName); } - } else if (manyLog.isDebugEnabled()) { - manyLog.debug(" GET {}({}).{} - hit", cacheName, parentId, propertyName); + } else if (manyLog.isLoggable(DEBUG)) { + manyLog.log(DEBUG, " GET {0}({1}).{2} - hit", cacheName, parentId, propertyName); } return entry; } @@ -303,12 +304,12 @@ final class BeanDescriptorCacheHelp { changes.put(many.name(), asJson); CachedBeanData newData = data.update(changes, data.getVersion()); - if (beanLog.isDebugEnabled()) { - beanLog.debug(" UPDATE {}({}) changes:{}", cacheName, parentId, changes); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " UPDATE {0}({1}) changes:{2}", cacheName, parentId, changes); } beanCache.put(parentId, newData); } catch (IOException e) { - log.error("Error updating L2 cache", e); + log.log(ERROR, "Error updating L2 cache", e); } } } else { @@ -321,8 +322,8 @@ final class BeanDescriptorCacheHelp { void cachePutManyIds(Object parentId, String manyName, CachedManyIds entry) { ServerCache collectionIdsCache = cacheManager.getCollectionIdsCache(beanType, manyName); - if (manyLog.isDebugEnabled()) { - manyLog.debug(" PUT {}({}).{} - ids:{}", cacheName, parentId, manyName, entry); + if (manyLog.isLoggable(DEBUG)) { + manyLog.log(DEBUG, " PUT {0}({1}).{2} - ids:{3}", cacheName, parentId, manyName, entry); } collectionIdsCache.put(parentId, entry); } @@ -353,8 +354,8 @@ final class BeanDescriptorCacheHelp { return new BeanCacheResult<>(); } Map beanDataMap = beanCache.getAll(keys); - if (beanLog.isTraceEnabled()) { - beanLog.trace(" MGET {}({}) - hits:{}", cacheName, ids, beanDataMap.keySet()); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " MGET {0}({1}) - hits:{2}", cacheName, ids, beanDataMap.keySet()); } BeanCacheResult result = new BeanCacheResult<>(); for (Map.Entry entry : beanDataMap.entrySet()) { @@ -375,8 +376,8 @@ final class BeanDescriptorCacheHelp { // naturalKey -> Id map Map naturalKeyMap = naturalKeyCache.getAll(keys); - if (natLog.isTraceEnabled()) { - natLog.trace(" MLOOKUP {}({}) - hits:{}", cacheName, keys, naturalKeyMap); + if (natLog.isLoggable(TRACE)) { + natLog.log(TRACE, " MLOOKUP {0}({1}) - hits:{2}", cacheName, keys, naturalKeyMap); } BeanCacheResult result = new BeanCacheResult<>(); @@ -392,8 +393,8 @@ final class BeanDescriptorCacheHelp { Set ids = new HashSet<>(naturalKeyMap.values()); Map beanDataMap = beanCache.getAll(ids); - if (beanLog.isTraceEnabled()) { - beanLog.trace(" MGET {}({}) - hits:{}", cacheName, ids, beanDataMap.keySet()); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " MGET {0}({1}) - hits:{2}", cacheName, ids, beanDataMap.keySet()); } // process the hits into beans etc for (Map.Entry entry : beanDataMap.entrySet()) { @@ -437,8 +438,8 @@ final class BeanDescriptorCacheHelp { */ void beanCacheClear() { if (beanCache != null) { - if (beanLog.isDebugEnabled()) { - beanLog.debug(" CLEAR {}", cacheName); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " CLEAR {0}", cacheName); } beanCache.clear(); } @@ -507,14 +508,14 @@ final class BeanDescriptorCacheHelp { } } } - if (beanLog.isDebugEnabled()) { - beanLog.debug(" MPUT {}({})", cacheName, map.keySet()); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " MPUT {0}({1})", cacheName, map.keySet()); } getBeanCache().putAll(map); if (natKeys != null && !natKeys.isEmpty()) { - if (natLog.isDebugEnabled()) { - natLog.debug(" MPUT {}({}, {})", cacheName, naturalKey, natKeys.keySet()); + if (natLog.isLoggable(DEBUG)) { + natLog.log(DEBUG, " MPUT {0}({1}, {2})", cacheName, naturalKey, natKeys.keySet()); } naturalKeyCache.putAll(natKeys); } @@ -526,15 +527,15 @@ final class BeanDescriptorCacheHelp { void beanCachePutDirect(EntityBean bean) { CachedBeanData beanData = beanExtractData(desc, bean); String key = desc.cacheKeyForBean(bean); - if (beanLog.isDebugEnabled()) { - beanLog.debug(" PUT {}({}) data:{}", cacheName, key, beanData); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " PUT {0}({1}) data:{2}", cacheName, key, beanData); } getBeanCache().put(key, beanData); if (naturalKey != null) { String naturalKey = calculateNaturalKey(beanData); if (naturalKey != null) { - if (natLog.isDebugEnabled()) { - natLog.debug(" PUT {}({}, {})", cacheName, naturalKey, key); + if (natLog.isLoggable(DEBUG)) { + natLog.log(DEBUG, " PUT {0}({1}, {2})", cacheName, naturalKey, key); } naturalKeyCache.put(naturalKey, key); } @@ -575,13 +576,13 @@ final class BeanDescriptorCacheHelp { private T beanCacheGetInternal(String key, Boolean readOnly, PersistenceContext context) { CachedBeanData data = (CachedBeanData) getBeanCache().get(key); if (data == null) { - if (beanLog.isTraceEnabled()) { - beanLog.trace(" GET {}({}) - cache miss", cacheName, key); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " GET {0}({1}) - cache miss", cacheName, key); } return null; } - if (beanLog.isTraceEnabled()) { - beanLog.trace(" GET {}({}) - hit", cacheName, key); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " GET {0}({1}) - hit", cacheName, key); } return convertToBean(key, readOnly, context, data); } @@ -591,8 +592,8 @@ final class BeanDescriptorCacheHelp { if (cacheSharableBeans && !Boolean.FALSE.equals(readOnly)) { Object bean = data.getSharableBean(); if (bean != null) { - if (beanLog.isTraceEnabled()) { - beanLog.trace(" GET {}({}) - hit shared bean", cacheName, id); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " GET {0}({1}) - hit shared bean", cacheName, id); } if (desc.isReadAuditing()) { desc.readAuditBean("l2", "", bean); @@ -680,8 +681,8 @@ final class BeanDescriptorCacheHelp { */ void beanCacheApplyInvalidate(Collection keys) { if (beanCache != null) { - if (beanLog.isDebugEnabled()) { - beanLog.debug(" MREMOVE {}({})", cacheName, keys); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " MREMOVE {0}({1})", cacheName, keys); } beanCache.removeAll(new HashSet<>(keys)); } @@ -700,32 +701,30 @@ final class BeanDescriptorCacheHelp { } Map hits = getBeanCache().getAll(ebis.keySet()); - if (beanLog.isTraceEnabled()) { - beanLog.trace(" MLOAD {}({}) - got hits ({})", cacheName, ebis.keySet(), hits.size()); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " MLOAD {0}({1}) - got hits ({2})", cacheName, ebis.keySet(), hits.size()); } Set loaded = new HashSet<>(); - Iterator> iterator = hits.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry hit = iterator.next(); + for (Map.Entry hit : hits.entrySet()) { Object key = hit.getKey(); EntityBeanIntercept ebi = ebis.remove(key); CachedBeanData cacheData = (CachedBeanData) hit.getValue(); if (lazyLoadProperty > -1 && !cacheData.isLoaded(propertyName)) { - if (beanLog.isTraceEnabled()) { - beanLog.trace(" load {}({}) - cache miss on property({})", cacheName, key, propertyName); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " load {0}({1}) - cache miss on property({2})", cacheName, key, propertyName); } } else { CachedBeanDataToBean.load(desc, ebi.getOwner(), cacheData, context); loaded.add(ebi); - if (beanLog.isDebugEnabled()) { - beanLog.debug(" load {}({}) - hit", cacheName, key); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " load {0}({1}) - hit", cacheName, key); } } } - if (!ebis.isEmpty() && beanLog.isTraceEnabled()) { - beanLog.trace(" load {}({}) - cache miss", cacheName, ebis.keySet()); + if (!ebis.isEmpty() && beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " load {0}({1}) - cache miss", cacheName, ebis.keySet()); } return loaded; } @@ -736,21 +735,21 @@ final class BeanDescriptorCacheHelp { boolean beanCacheLoad(EntityBean bean, EntityBeanIntercept ebi, String key, PersistenceContext context) { CachedBeanData cacheData = (CachedBeanData) getBeanCache().get(key); if (cacheData == null) { - if (beanLog.isTraceEnabled()) { - beanLog.trace(" LOAD {}({}) - cache miss", cacheName, key); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " LOAD {0}({1}) - cache miss", cacheName, key); } return false; } int lazyLoadProperty = ebi.getLazyLoadPropertyIndex(); if (lazyLoadProperty > -1 && !cacheData.isLoaded(ebi.getLazyLoadProperty())) { - if (beanLog.isTraceEnabled()) { - beanLog.trace(" LOAD {}({}) - cache miss on property({})", cacheName, key, ebi.getLazyLoadProperty()); + if (beanLog.isLoggable(TRACE)) { + beanLog.log(TRACE, " LOAD {0}({1}) - cache miss on property({2})", cacheName, key, ebi.getLazyLoadProperty()); } return false; } CachedBeanDataToBean.load(desc, bean, cacheData, context); - if (beanLog.isDebugEnabled()) { - beanLog.debug(" LOAD {}({}) - hit", cacheName, key); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " LOAD {0}({1}) - hit", cacheName, key); } return true; } @@ -874,8 +873,8 @@ final class BeanDescriptorCacheHelp { if (existingData != null) { long currentVersion = existingData.getVersion(); if (version > 0 && version < currentVersion) { - if (beanLog.isDebugEnabled()) { - beanLog.debug(" REMOVE {}({}) - version conflict old:{} new:{}", cacheName, key, currentVersion, version); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " REMOVE {0}({1}) - version conflict old:{2} new:{3}", cacheName, key, currentVersion, version); } cache.remove(key); } else { @@ -883,16 +882,16 @@ final class BeanDescriptorCacheHelp { version = currentVersion; } CachedBeanData newData = existingData.update(changes, version); - if (beanLog.isDebugEnabled()) { - beanLog.debug(" UPDATE {}({}) changes:{}", cacheName, key, changes); + if (beanLog.isLoggable(DEBUG)) { + beanLog.log(DEBUG, " UPDATE {0}({1}) changes:{2}", cacheName, key, changes); } cache.put(key, newData); } if (updateNaturalKey) { Object oldKey = calculateNaturalKey(existingData); if (oldKey != null) { - if (natLog.isDebugEnabled()) { - natLog.debug(".. update {} REMOVE({}) - old key for ({})", cacheName, oldKey, key); + if (natLog.isLoggable(DEBUG)) { + natLog.log(DEBUG, ".. update {0} REMOVE({1}) - old key for ({2})", cacheName, oldKey, key); } naturalKeyCache.remove(oldKey); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java index 664e40da9..ecb283e5c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java @@ -23,7 +23,7 @@ class BeanDescriptorElementEmbeddedMap extends BeanDescriptorElementEmbedded< BeanDescriptorElementEmbeddedMap(BeanDescriptorMap owner, DeployBeanDescriptor deploy, ElementHelp elementHelp) { super(owner, deploy, elementHelp); this.scalarTypeKey = firstBaseScalarType(); - this.stringKey = String.class.equals(scalarTypeKey.getType()); + this.stringKey = String.class.equals(scalarTypeKey.type()); } @Override @@ -49,7 +49,7 @@ class BeanDescriptorElementEmbeddedMap extends BeanDescriptorElementEmbedded< @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); + JsonParser parser = readJson.parser(); ElementCollector add = elementHelp.createCollector(); do { String fieldName = parser.nextFieldName(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java index 13833eb77..0242c993f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java @@ -40,7 +40,7 @@ class BeanDescriptorElementScalar extends BeanDescriptorElement { @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); + JsonParser parser = readJson.parser(); ElementCollector add = elementHelp.createCollector(); do { JsonToken token = parser.nextToken(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java index d9f6b4b25..d5b8d91a9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java @@ -28,7 +28,7 @@ class BeanDescriptorElementScalarMap extends BeanDescriptorElement { } this.scalarTypeKey = props[0].scalarType(); this.scalarTypeVal = props[1].scalarType(); - this.stringKey = String.class.equals(scalarTypeKey.getType()); + this.stringKey = String.class.equals(scalarTypeKey.type()); } @Override @@ -49,7 +49,7 @@ class BeanDescriptorElementScalarMap extends BeanDescriptorElement { @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); + JsonParser parser = readJson.parser(); ElementCollector add = elementHelp.createCollector(); do { String fieldName = parser.nextFieldName(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java index f20db7315..0e323114b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java @@ -66,7 +66,7 @@ final class BeanDescriptorJsonHelp { @SuppressWarnings("unchecked") T jsonRead(SpiJsonReader jsonRead, String path, boolean withInheritance, T target) throws IOException { - JsonParser parser = jsonRead.getParser(); + JsonParser parser = jsonRead.parser(); //noinspection StatementWithEmptyBody if (parser.getCurrentToken() == JsonToken.START_OBJECT) { // start object token read by Jackson already @@ -85,7 +85,7 @@ final class BeanDescriptorJsonHelp { return jsonReadObject(jsonRead, path, target); } - ObjectNode node = jsonRead.getObjectMapper().readTree(parser); + ObjectNode node = jsonRead.mapper().readTree(parser); if (node.isNull()) { return null; } @@ -127,7 +127,7 @@ final class BeanDescriptorJsonHelp { // unmapped properties, send to JsonReadBeanVisitor later Map unmappedProperties = null; do { - JsonParser parser = readJson.getParser(); + JsonParser parser = readJson.parser(); JsonToken event = parser.nextToken(); if (JsonToken.FIELD_NAME == event) { String key = parser.getCurrentName(); 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 82f29361c..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 @@ -41,7 +41,6 @@ import io.ebeaninternal.xmapping.api.XmapNamedQuery; import io.ebeaninternal.xmapping.api.XmapRawSql; import io.ebeanservice.docstore.api.DocStoreBeanAdapter; import io.ebeanservice.docstore.api.DocStoreFactory; -import org.slf4j.Logger; import javax.persistence.MappedSuperclass; import javax.persistence.PersistenceException; @@ -53,12 +52,14 @@ import java.lang.reflect.Modifier; import java.util.*; import java.util.concurrent.TimeUnit; +import static java.lang.System.Logger.Level.*; + /** * Creates BeanDescriptors. */ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeManager { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private static final BeanDescComparator beanDescComparator = new BeanDescComparator(); public static final String JAVA_LANG_RECORD = "java.lang.Record"; @@ -133,7 +134,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy this.encryptKeyManager = this.config.getEncryptKeyManager(); this.databasePlatform = this.config.getDatabasePlatform(); this.multiValueBind = config.getMultiValueBind(); - this.idBinderFactory = new IdBinderFactory(databasePlatform.isIdInExpandedForm(), multiValueBind); + this.idBinderFactory = new IdBinderFactory(databasePlatform.idInExpandedForm(), multiValueBind); this.queryPlanTTLSeconds = this.config.getQueryPlanTTLSeconds(); this.asOfViewSuffix = asOfViewSuffix(databasePlatform, this.config); String versionsBetweenSuffix = versionsBetweenSuffix(databasePlatform, this.config); @@ -141,10 +142,10 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy this.bootupClasses = config.getBootupClasses(); this.createProperties = config.getDeployCreateProperties(); this.namingConvention = this.config.getNamingConvention(); - this.dbIdentity = config.getDatabasePlatform().getDbIdentity(); + 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); @@ -183,19 +184,19 @@ 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); } /** * Return the AsOfViewSuffix based on the DbHistorySupport. */ private String asOfViewSuffix(DatabasePlatform databasePlatform, DatabaseConfig serverConfig) { - DbHistorySupport historySupport = databasePlatform.getHistorySupport(); + DbHistorySupport historySupport = databasePlatform.historySupport(); // with historySupport returns a simple view suffix or the sql2011 as of timestamp suffix return (historySupport == null) ? serverConfig.getAsOfViewSuffix() : historySupport.getAsOfViewSuffix(serverConfig.getAsOfViewSuffix()); } @@ -204,7 +205,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy * Return the versions between timestamp suffix based on the DbHistorySupport. */ private String versionsBetweenSuffix(DatabasePlatform databasePlatform, DatabaseConfig serverConfig) { - DbHistorySupport historySupport = databasePlatform.getHistorySupport(); + DbHistorySupport historySupport = databasePlatform.historySupport(); // with historySupport returns a simple view suffix or the sql2011 versions between timestamp suffix return (historySupport == null) ? serverConfig.getAsOfViewSuffix() : historySupport.getVersionsBetweenSuffix(serverConfig.getAsOfViewSuffix()); } @@ -309,7 +310,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy } catch (BeanNotEnhancedException e) { throw e; } catch (RuntimeException e) { - log.error("Error in deployment", e); + log.log(ERROR, "Error in deployment", e); throw e; } } @@ -332,13 +333,13 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy try { entityClass = Class.forName(entityClassName, false, classLoader); } catch (Exception e) { - log.error("Could not load entity bean class " + entityClassName + " for ebean.xml entry"); + log.log(ERROR, "Could not load entity bean class " + entityClassName + " for ebean.xml entry"); return; } DeployBeanInfo info = deployInfoMap.get(entityClass); if (info == null) { - log.error("No entity bean for ebean.xml entry " + entityClassName); + log.log(ERROR, "No entity bean for ebean.xml entry " + entityClassName); } else { for (XmapRawSql sql : entityDeploy.getRawSql()) { @@ -601,11 +602,11 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy int pc = postConstructManager.getRegisterCount(); int lc = persistListenerManager.getRegisterCount(); int fc = beanFinderManager.getRegisterCount(); - log.debug("BeanPersistControllers[{}] BeanFinders[{}] BeanPersistListeners[{}] BeanQueryAdapters[{}] BeanPostLoaders[{}] BeanPostConstructors[{}]", cc, fc, lc, qa, pl, pc); + log.log(DEBUG, "BeanPersistControllers[{0}] BeanFinders[{1}] BeanPersistListeners[{2}] BeanQueryAdapters[{3}] BeanPostLoaders[{4}] BeanPostConstructors[{5}]", cc, fc, lc, qa, pl, pc); } private void logStatus() { - log.debug("Entities[{}]", entityBeanCount); + log.log(DEBUG, "Entities[{0}]", entityBeanCount); } /** @@ -865,13 +866,8 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy for (String possibleMappedBy : matchSet) { String possibleLower = possibleMappedBy.toLowerCase(); if (possibleLower.contains(searchName)) { - // we have a match.. + // we have a match prop.setMappedBy(possibleMappedBy); - - String m = "Implicitly found mappedBy for " + targetDesc + "." + prop; - m += " by searching for [" + searchName + "] against " + matchSet; - log.debug(m); - return true; } } @@ -888,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()); @@ -987,14 +983,14 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy private DeployBeanPropertyAssocOne mappedOneToOne(DeployBeanPropertyAssocOne prop, String mappedBy, DeployBeanDescriptor targetDesc) { DeployBeanProperty mappedProp = targetDesc.getBeanProperty(mappedBy); if (mappedProp == null) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property [" + targetDesc + "." + mappedBy + "]"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property " + targetDesc + "." + mappedBy); } if (!(mappedProp instanceof DeployBeanPropertyAssocOne)) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property [" + targetDesc + "." + mappedBy + "]is not a OneToOne?"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property " + targetDesc + "." + mappedBy + " is not a OneToOne?"); } DeployBeanPropertyAssocOne mappedAssocOne = (DeployBeanPropertyAssocOne) mappedProp; if (!mappedAssocOne.isOneToOne()) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property [" + targetDesc + "." + mappedBy + "]is not a OneToOne?"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property " + targetDesc + "." + mappedBy + " is not a OneToOne?"); } return mappedAssocOne; } @@ -1077,10 +1073,10 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy private DeployBeanPropertyAssocOne mappedManyToOne(DeployBeanPropertyAssocMany prop, DeployBeanDescriptor targetDesc, String mappedBy) { DeployBeanProperty mappedProp = targetDesc.getBeanProperty(mappedBy); if (mappedProp == null) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property [" + mappedBy + "] " + "in [" + targetDesc + "]"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property " + mappedBy + " in " + targetDesc); } if (!(mappedProp instanceof DeployBeanPropertyAssocOne)) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property [" + mappedBy + "]is not a ManyToOne?" + "in [" + targetDesc + "]"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property " + mappedBy + " is not a ManyToOne? in " + targetDesc); } return (DeployBeanPropertyAssocOne) mappedProp; } @@ -1128,15 +1124,15 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy private DeployBeanPropertyAssocMany mappedManyToMany(DeployBeanPropertyAssocMany prop, String mappedBy, DeployBeanDescriptor targetDesc) { DeployBeanProperty mappedProp = targetDesc.getBeanProperty(mappedBy); if (mappedProp == null) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property [" + mappedBy + "] " + "in [" + targetDesc + "]"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + " Can not find mappedBy property " + mappedBy + " in " + targetDesc); } if (!(mappedProp instanceof DeployBeanPropertyAssocMany)) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property [" + targetDesc + "." + mappedBy + "] is not a ManyToMany?"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property " + targetDesc + "." + mappedBy + " is not a ManyToMany?"); } DeployBeanPropertyAssocMany mappedAssocMany = (DeployBeanPropertyAssocMany) mappedProp; if (!mappedAssocMany.isManyToMany()) { - throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property [" + targetDesc + "." + mappedBy + "] is not a ManyToMany?"); + throw new PersistenceException("Error on " + prop.getFullBeanName() + ". mappedBy property " + targetDesc + "." + mappedBy + " is not a ManyToMany?"); } return mappedAssocMany; } @@ -1207,12 +1203,12 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy final DeployIdentityMode identityMode = desc.getIdentityMode(); if (identityMode.isSequence() && !dbIdentity.isSupportsSequence()) { // explicit sequence but not supported by the DatabasePlatform - log.info("Explicit sequence on " + desc.getFullName() + " but not supported by DB Platform - ignored"); + log.log(INFO, "Explicit sequence on {0} but not supported by DB Platform - ignored", desc.getFullName()); identityMode.setIdType(IdType.AUTO); } if (identityMode.isIdentity() && !dbIdentity.isSupportsIdentity()) { // explicit identity but not supported by the DatabasePlatform - log.info("Explicit Identity on " + desc.getFullName() + " but not supported by DB Platform - ignored"); + log.log(INFO, "Explicit Identity on {0} but not supported by DB Platform - ignored", desc.getFullName()); identityMode.setIdType(IdType.AUTO); } @@ -1250,7 +1246,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy String primaryKeyColumn = desc.getSinglePrimaryKeyColumn(); seqName = namingConvention.getSequenceName(desc.getBaseTable(), primaryKeyColumn); } - int stepSize = desc.setIdentitySequenceBatchMode(databasePlatform.isSequenceBatchMode()); + int stepSize = desc.setIdentitySequenceBatchMode(databasePlatform.sequenceBatchMode()); desc.setIdGenerator(createSequenceIdGenerator(seqName, stepSize)); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFinderManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFinderManager.java index ecb99e8b1..5bcf1883f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFinderManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFinderManager.java @@ -4,16 +4,17 @@ import io.ebean.event.BeanFindController; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.server.core.bootup.BootupClasses; import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; -import org.slf4j.Logger; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Default implementation for BeanFinderFactory. */ final class BeanFinderManager { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final List list; @@ -31,7 +32,7 @@ final class BeanFinderManager { void addFindControllers(DeployBeanDescriptor deployDesc) { for (BeanFindController c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { - log.debug("BeanFindController on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); + log.log(DEBUG, "BeanFindController on[{0}] {1}", deployDesc.getFullName(), c.getClass().getName()); deployDesc.setBeanFinder(c); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java index bd479b08d..01cd82de6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java @@ -180,11 +180,6 @@ public final class BeanFkeyProperty implements ElPropertyValue { return prefix; } - @Override - public boolean isDateTimeCapable() { - return false; - } - @Override public int jdbcType() { return 0; @@ -195,11 +190,6 @@ public final class BeanFkeyProperty implements ElPropertyValue { return null; } - @Override - public Object parseDateTime(long systemTimeMillis) { - throw new RuntimeException("ElPropertyDeploy only - not implemented"); - } - @Override public StringParser stringParser() { throw new RuntimeException("ElPropertyDeploy only - not implemented"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java index 243db22ac..8c1b208df 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java @@ -22,6 +22,7 @@ import io.ebeaninternal.api.json.SpiJsonReader; import io.ebeaninternal.api.json.SpiJsonWriter; import io.ebeaninternal.server.core.EncryptAlias; import io.ebeaninternal.server.core.InternString; +import io.ebeaninternal.server.bind.DataBind; import io.ebeaninternal.server.deploy.generatedproperty.GeneratedProperty; import io.ebeaninternal.server.deploy.generatedproperty.GeneratedWhenCreated; import io.ebeaninternal.server.deploy.generatedproperty.GeneratedWhenModified; @@ -51,6 +52,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static java.lang.System.Logger.Level.ERROR; + /** * Description of a property of a bean. Includes its deployment information such * as database column mapping information. @@ -414,7 +417,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { * Return true if the underlying type is mutable. */ public boolean isMutableScalarType() { - return scalarType != null && scalarType.isMutable(); + return scalarType != null && scalarType.mutable(); } /** @@ -455,7 +458,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { if (formula && sqlFormulaJoin != null) { ctx.appendFormulaJoin(sqlFormulaJoin, joinType, manyWhere); } else if (secondaryTableJoin != null) { - String relativePrefix = ctx.getRelativePrefix(secondaryTableJoinPrefix); + String relativePrefix = ctx.relativePrefix(secondaryTableJoinPrefix); secondaryTableJoin.addJoin(joinType, relativePrefix, ctx); } } @@ -481,7 +484,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { ctx.appendFormulaSelect(sqlFormulaSelect); } else if (!isTransient && !ignoreDraftOnlyProperty(ctx.isDraftQuery())) { if (secondaryTableJoin != null) { - ctx.pushTableAlias(ctx.getRelativePrefix(secondaryTableJoinPrefix)); + ctx.pushTableAlias(ctx.relativePrefix(secondaryTableJoinPrefix)); } if (dbEncrypted) { ctx.appendRawColumn(decryptSqlWithColumnAlias(ctx.peekTableAlias())); @@ -506,7 +509,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { @Override public void loadIgnore(DbReadContext ctx) { - scalarType.loadIgnore(ctx.getDataReader()); + ctx.dataReader().incrementPos(1); } @Override @@ -541,11 +544,11 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { } public Object read(DbReadContext ctx) throws SQLException { - return scalarType.read(ctx.getDataReader()); + return scalarType.read(ctx.dataReader()); } public Object readSet(DbReadContext ctx, EntityBean bean) throws SQLException { - return readSet(ctx.getDataReader(), bean); + return readSet(ctx.dataReader(), bean); } @SuppressWarnings("unchecked") @@ -701,7 +704,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { } private Object cacheDataConvert(Object value) { - if (value == null || scalarType.isBinaryType()) { + if (value == null || scalarType.binary()) { return value; } else { // convert to string as an optimisation for java object serialisation @@ -924,6 +927,10 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { return alreadyDirty || value != null && scalarType.isDirty(value); } + public boolean isArrayType() { + return scalarType instanceof ScalarTypeArray; + } + /** * Return the scalarType. */ @@ -938,19 +945,9 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { return scalarType; } - @Override - public boolean isDateTimeCapable() { - return scalarType != null && scalarType.isDateTimeCapable(); - } - @Override public int jdbcType() { - return scalarType == null ? 0 : scalarType.getJdbcType(); - } - - @Override - public Object parseDateTime(long systemTimeMillis) { - return scalarType.convertFromMillis(systemTimeMillis); + return scalarType == null ? 0 : scalarType.jdbcType(); } /** @@ -1414,7 +1411,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { JsonToken event = ctx.nextToken(); if (JsonToken.VALUE_NULL == event) { if (jsonDeserialize) { - if (ctx.isIntercept()) { + if (ctx.intercept()) { setValueIntercept(bean, null); } else { setValue(bean, null); @@ -1424,7 +1421,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { // expect to read non-null json value Object objValue; if (scalarType != null) { - objValue = scalarType.jsonRead(ctx.getParser()); + objValue = scalarType.jsonRead(ctx.parser()); } else { try { objValue = ctx.readValueUsingObjectMapper(propertyType); @@ -1433,11 +1430,11 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { objValue = null; String msg = "Error trying to use Jackson ObjectMapper to read transient property " + fullName() + " - consider marking this property with @JsonIgnore"; - CoreLog.log.error(msg, e); + CoreLog.log.log(ERROR, msg, e); } } if (jsonDeserialize) { - if (ctx.isIntercept()) { + if (ctx.intercept()) { setValueIntercept(bean, objValue); } else { setValue(bean, objValue); @@ -1470,7 +1467,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { */ public void docStoreMapping(DocMappingBuilder mapping, String prefix) { if (mapping.includesProperty(prefix, name)) { - DocPropertyType type = scalarType.getDocType(); + DocPropertyType type = scalarType.docType(); DocPropertyOptions options = docOptions.copy(); if (isKeywordType(type, options)) { type = DocPropertyType.KEYWORD; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java index 147f623a1..1cc67ee15 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java @@ -30,6 +30,8 @@ import javax.persistence.PersistenceException; import java.util.ArrayList; import java.util.List; +import static java.lang.System.Logger.Level.ERROR; + /** * Abstract base for properties mapped to an associated bean, list, set or map. */ @@ -353,7 +355,7 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree mapping.push(nested); targetDescriptor.docStoreMapping(mapping, fullName); mapping.pop(); - if (!nested.getChildren().isEmpty()) { + if (!nested.children().isEmpty()) { mapping.add(nested); } } @@ -364,7 +366,7 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree */ public boolean isUpdateable() { TableJoinColumn[] columns = tableJoin.columns(); - if (columns.length <= 0) { + if (columns.length == 0) { return true; } for (TableJoinColumn column : columns) { @@ -381,7 +383,7 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree */ public boolean isInsertable() { TableJoinColumn[] columns = tableJoin.columns(); - if (columns.length <= 0) { + if (columns.length == 0) { return true; } for (TableJoinColumn column : columns) { @@ -432,7 +434,7 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree if (!idProp.isEmbedded()) { // simple single scalar id if (cols.length != 1) { - CoreLog.log.error("No Imported Id column for [" + idProp + "] in table [" + join.getTable() + "]"); + CoreLog.log.log(ERROR, "No Imported Id column for {0} in table {1}", idProp, join.getTable()); return null; } else { BeanProperty[] idProps = {idProp}; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 81a5f4632..feec8f8ce 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.io.StringWriter; import java.util.*; +import static java.lang.System.Logger.Level.ERROR; + /** * Property mapped to a List Set or Map. */ @@ -326,7 +328,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST */ @Override public void lazyLoadMany(EntityBean current) { - EntityBean parentBean = childMasterProperty.getValueAsEntityBean(current); + EntityBean parentBean = childMasterProperty.valueAsEntityBean(current); if (parentBean != null) { addBeanToCollectionWithCreate(parentBean, current, true); } @@ -667,7 +669,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } } catch (PersistenceException e) { // not found as individual scalar properties - CoreLog.log.error("Could not find a exported property?", e); + CoreLog.log.log(ERROR, "Could not find a exported property?", e); } } else { if (idProp != null) { @@ -716,7 +718,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } } } - throw new RuntimeException("Can not find Master [" + beanType + "] in Child[" + targetDesc + "]"); + throw new RuntimeException("Can not find Master " + beanType + " in Child " + targetDesc); } /** @@ -732,7 +734,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } String from = descriptor.fullName(); String to = targetDesc.fullName(); - throw new PersistenceException(from + ": Could not find mapKey property [" + mapKey + "] on [" + to + "]"); + throw new PersistenceException(from + ": Could not find mapKey property " + mapKey + " on " + to); } public IntersectionRow buildManyDeleteChildren(EntityBean parentBean, List excludeDetailIds) { @@ -962,7 +964,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST setValue(bean, collection); } } catch (Exception e) { - CoreLog.log.error("Error setting value from L2 cache", e); + CoreLog.log.log(ERROR, "Error setting value from L2 cache", e); } } @@ -975,7 +977,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } return jsonWriteCollection(collection); } catch (Exception e) { - CoreLog.log.error("Error building value element collection json for L2 cache", e); + CoreLog.log.log(ERROR, "Error building value element collection json for L2 cache", e); return null; } } @@ -996,7 +998,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST */ private Object jsonReadCollection(String json) throws IOException { SpiJsonReader ctx = descriptor.createJsonReader(json); - JsonParser parser = ctx.getParser(); + JsonParser parser = ctx.parser(); JsonToken event = parser.nextToken(); if (JsonToken.VALUE_NULL == event) { return null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java index ba06352b7..f09bc4dc6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java @@ -38,7 +38,7 @@ class BeanPropertyAssocManyJsonHelp { if (!this.many.jsonDeserialize) { return; } - JsonParser parser = readJson.getParser(); + JsonParser parser = readJson.parser(); JsonToken event = parser.nextToken(); if (JsonToken.VALUE_NULL == event) { return; @@ -50,7 +50,7 @@ class BeanPropertyAssocManyJsonHelp { if (JsonToken.START_ARRAY != event && JsonToken.START_OBJECT != event) { throw new JsonParseException(parser, "Unexpected token " + event + " - expecting start array or object"); } - if (readJson.isIntercept()) { + if (readJson.intercept()) { many.setValueIntercept(parentBean, many.jsonReadCollection(readJson, parentBean)); } else { many.setValue(parentBean, many.jsonReadCollection(readJson, parentBean)); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java index 32a84d584..ae82bd7c6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java @@ -20,7 +20,7 @@ class BeanPropertyAssocManyJsonTransient { * Use Jackson ObjectMapper to read the transient 'many' property. */ void jsonReadUsingObjectMapper(BeanPropertyAssocMany many, SpiJsonReader readJson, EntityBean parentBean) throws IOException { - ObjectMapper mapper = readJson.getObjectMapper(); + ObjectMapper mapper = readJson.mapper(); ManyType manyType = many.manyType(); Object value; @@ -29,11 +29,11 @@ class BeanPropertyAssocManyJsonTransient { TypeFactory typeFactory = mapper.getTypeFactory(); JavaType target = typeFactory.constructType(many.targetType()); MapType jacksonType = typeFactory.constructMapType(LinkedHashMap.class, TypeFactory.unknownType(), target); - value = mapper.readValue(readJson.getParser(), jacksonType); + value = mapper.readValue(readJson.parser(), jacksonType); } else { // read list or set using Jackson object mapper CollectionType jacksonType = mapper.getTypeFactory().constructCollectionType(manyType.getCollectionType(), many.targetType()); - value = mapper.readValue(readJson.getParser(), jacksonType); + value = mapper.readValue(readJson.parser(), jacksonType); } many.setValue(parentBean, value); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index a024c1ddb..b97c0a75a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -155,7 +155,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr * Return the property value as an entity bean. */ @Override - public EntityBean getValueAsEntityBean(EntityBean owner) { + public EntityBean valueAsEntityBean(EntityBean owner) { return (EntityBean) getValue(owner); } @@ -768,7 +768,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr if (value == null) { writeJson.writeNullField(name); } else { - if (!writeJson.isParentBean(value)) { + if (!writeJson.parentBean(value)) { // Hmmm, not writing complex non-entity bean if (value instanceof EntityBean) { writeJson.beginAssocOne(name, bean); @@ -780,12 +780,13 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } } + @SuppressWarnings("unchecked") @Override public void jsonRead(SpiJsonReader readJson, EntityBean bean) throws IOException { if (jsonDeserialize && targetDescriptor != null) { T target = (T) value(bean); T assocBean = targetDescriptor.jsonRead(readJson, name, target); - if (readJson.isIntercept()) { + if (readJson.intercept()) { setValueIntercept(bean, assocBean); } else { setValue(bean, assocBean); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOrderColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOrderColumn.java index a6ac913b9..7820e722d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOrderColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOrderColumn.java @@ -5,7 +5,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; /** * Bean property for synthetic sort order value / order column. - * + *

* The value of which is held on the entity bean intercept. */ public final class BeanPropertyOrderColumn extends BeanProperty { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanQueryAdapterManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanQueryAdapterManager.java index 45bced3a2..6eb8d20e3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanQueryAdapterManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanQueryAdapterManager.java @@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Default implementation for creating BeanControllers. */ @@ -28,7 +30,7 @@ final class BeanQueryAdapterManager { void addQueryAdapter(DeployBeanDescriptor deployDesc) { for (BeanQueryAdapter c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { - CoreLog.internal.debug("BeanQueryAdapter on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); + CoreLog.internal.log(DEBUG, "BeanQueryAdapter on[{0}] {1}", deployDesc.getFullName(), c.getClass().getName()); deployDesc.addQueryAdapter(c); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanTable.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanTable.java index 0a503314d..5f76d4779 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanTable.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanTable.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.deploy; -import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.server.core.InternString; import io.ebeaninternal.server.deploy.meta.DeployBeanTable; import io.ebeaninternal.server.deploy.meta.DeployTableJoin; @@ -105,7 +104,6 @@ public final class BeanTable { if (complexKey) { // just to copy the column name rather than prefix with the foreignKeyPrefix. // I think that with complex keys this is the more common approach. - CoreLog.internal.debug("On table[{}] foreign key column [{}]", baseTable, lc); fk = lc; } if (sqlFormulaSelect != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbMigrationInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbMigrationInfo.java index d41f781f5..c9e90efb3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbMigrationInfo.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbMigrationInfo.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.deploy; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -30,7 +29,7 @@ public final class DbMigrationInfo { if (scripts.length == 0) { return Collections.emptyList(); } else { - return Collections.unmodifiableList(Arrays.asList(scripts)); + return List.of(scripts); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbReadContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbReadContext.java index e79e7e0df..7ac256b4b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbReadContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbReadContext.java @@ -27,7 +27,7 @@ public interface DbReadContext { /** * Return the DataReader. */ - DataReader getDataReader(); + DataReader dataReader(); /** * Return true if the query is using supplied SQL rather than generated SQL. @@ -52,7 +52,7 @@ public interface DbReadContext { /** * Return the persistence context. */ - PersistenceContext getPersistenceContext(); + PersistenceContext persistenceContext(); /** * Register a reference for lazy loading. @@ -69,7 +69,6 @@ public interface DbReadContext { */ void register(BeanPropertyAssocMany many, BeanCollection bc); - /** * Set back the bean that has just been loaded with its id. */ @@ -78,7 +77,7 @@ public interface DbReadContext { /** * Return the query mode. */ - SpiQuery.Mode getQueryMode(); + SpiQuery.Mode queryMode(); /** * Return true if the underlying query is a 'asDraft' query. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java index ff6839723..9557ee7a1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java @@ -31,7 +31,7 @@ public interface DbSqlContext { /** * Return a list of encrypted properties which require additional binding. */ - BeanProperty[] getEncryptedProps(); + BeanProperty[] encryptedProps(); /** * Append a string directly to the SQL buffer. @@ -83,7 +83,7 @@ public interface DbSqlContext { /** * Return the current context of the sql context. */ - String getContent(); + String content(); /** * Push a join node onto the stack. @@ -99,14 +99,14 @@ public interface DbSqlContext { * Return a table alias without many where clause joins. Typically this is for * the select clause (fetch joins). */ - String getTableAlias(String prefix); + String tableAlias(String prefix); /** * Return a table alias that takes into account many where joins. */ - String getTableAliasManyWhere(String prefix); + String tableAliasManyWhere(String prefix); - String getRelativePrefix(String propName); + String relativePrefix(String propName); /** * Append the lower and upper bound columns into the select clause diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployDocPropertyOptions.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployDocPropertyOptions.java index e6e00b2e9..0ce3a87a5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployDocPropertyOptions.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployDocPropertyOptions.java @@ -33,7 +33,7 @@ public final class DeployDocPropertyOptions { */ public void setDocSortable(DocSortable doc) { createOptions(); - mapping.setSortable(true); + mapping.sortable(true); setStore(doc.store()); setBoost(doc.boost()); setNullValue(doc.nullValue()); @@ -44,7 +44,7 @@ public final class DeployDocPropertyOptions { */ public void setDocCode(DocCode doc) { createOptions(); - mapping.setCode(true); + mapping.code(true); setStore(doc.store()); setBoost(doc.boost()); setNullValue(doc.nullValue()); @@ -52,19 +52,19 @@ public final class DeployDocPropertyOptions { private void setNullValue(String value) { if (!value.isEmpty()) { - mapping.setNullValue(value); + mapping.nullValue(value); } } private void setBoost(float boost) { if (Float.compare(boost, 1.0F) != 0) { - mapping.setBoost(boost); + mapping.boost(boost); } } private void setStore(boolean store) { if (store) { - mapping.setStore(true); + mapping.store(true); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineAggPath.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineAggPath.java index 0349ac196..b82c72bae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineAggPath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineAggPath.java @@ -41,7 +41,7 @@ final class DetermineAggPath { } } - throw new IllegalArgumentException("Could not find path in aggregation formula [" + aggregation + "]"); + throw new IllegalArgumentException("Could not find path in aggregation formula " + aggregation); } private static boolean isNamePart(char ch) { @@ -94,7 +94,7 @@ final class DetermineAggPath { pos = pos + 1; continue; } - throw new IllegalArgumentException("Can not find path to many in aggregation formula [" + aggregation + "]"); + throw new IllegalArgumentException("Can not find path to many in aggregation formula " + aggregation); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java index ec1c7035b..3634123e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java @@ -26,7 +26,7 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase { @Override public String toString() { - return "DynamicPropertyFormula[" + parsedFormula + "]"; + return "DynamicPropertyFormula " + parsedFormula; } @Override @@ -47,7 +47,7 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase { public void load(SqlBeanLoad sqlBeanLoad) { Object value; try { - value = scalarType.read(sqlBeanLoad.ctx().getDataReader()); + value = scalarType.read(sqlBeanLoad.ctx().dataReader()); } catch (Exception e) { sqlBeanLoad.ctx().handleLoadError(fullName, e); return; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyBase.java index 08fc33036..c8711ea62 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyBase.java @@ -65,7 +65,7 @@ abstract class DynamicPropertyBase implements STreeProperty { @Override public void loadIgnore(DbReadContext ctx) { - scalarType.loadIgnore(ctx.getDataReader()); + ctx.dataReader().incrementPos(1); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java index ac9aaabb5..82493154b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java @@ -32,7 +32,7 @@ final class FormulaPropertyPath { int openBracket = formula.indexOf('('); int closeBracket = formula.lastIndexOf(')'); if (openBracket == -1 || closeBracket == -1) { - throw new IllegalStateException("Unable to parse formula [" + formula + "]"); + throw new IllegalStateException("Unable to parse formula " + formula); } outerFunction = formula.substring(0, openBracket).trim(); internalExpression = trimDistinct(formula.substring(openBracket + 1, closeBracket)); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java index 3f0c5c8cb..e72d7463d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java @@ -197,7 +197,7 @@ public final class InheritInfo { * Return the associated InheritInfo for this DB row read. */ public InheritInfo readType(DbReadContext ctx) throws SQLException { - return readType(ctx.getDataReader().getString()); + return readType(ctx.dataReader().getString()); } /** @@ -354,7 +354,7 @@ public final class InheritInfo { @Override public String toString() { - return "InheritInfo[" + type.getName() + "] disc[" + discriminatorStringValue + "]"; + return "InheritInfo " + type.getName() + " disc:" + discriminatorStringValue; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistControllerManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistControllerManager.java index 0497d7ef9..196e4be20 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistControllerManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistControllerManager.java @@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Default implementation for creating BeanControllers. */ @@ -28,7 +30,7 @@ final class PersistControllerManager { void addPersistControllers(DeployBeanDescriptor deployDesc) { for (BeanPersistController c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { - CoreLog.log.debug("BeanPersistController on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); + CoreLog.log.log(DEBUG, "BeanPersistController on[{0}] {1}", deployDesc.getFullName(), c.getClass().getName()); deployDesc.addPersistController(c); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistListenerManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistListenerManager.java index ec0fd3edb..5c771b026 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistListenerManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistListenerManager.java @@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Manages the assignment/registration of BeanPersistListener with their * respective DeployBeanDescriptor's. @@ -29,7 +31,7 @@ final class PersistListenerManager { void addPersistListeners(DeployBeanDescriptor deployDesc) { for (BeanPersistListener listener : list) { if (listener.isRegisterFor(deployDesc.getBeanType())) { - CoreLog.log.debug("BeanPersistListener on[{}] {}", deployDesc.getFullName(), listener.getClass().getName()); + CoreLog.log.log(DEBUG, "BeanPersistListener on[{0}] {1}", deployDesc.getFullName(), listener.getClass().getName()); deployDesc.addPersistListener(listener); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostConstructManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostConstructManager.java index 33b3a5f76..525a87fb3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostConstructManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostConstructManager.java @@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Default implementation for creating BeanControllers. */ @@ -28,7 +30,7 @@ final class PostConstructManager { void addPostConstructListeners(DeployBeanDescriptor deployDesc) { for (BeanPostConstructListener c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { - CoreLog.log.debug("BeanPostLoad on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); + CoreLog.log.log(DEBUG, "BeanPostLoad on[{0}] {1}", deployDesc.getFullName(), c.getClass().getName()); deployDesc.addPostConstructListener(c); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostLoadManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostLoadManager.java index babc69c76..1638c1682 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostLoadManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PostLoadManager.java @@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Default implementation for creating BeanControllers. */ @@ -28,7 +30,7 @@ final class PostLoadManager { void addPostLoad(DeployBeanDescriptor deployDesc) { for (BeanPostLoad c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { - CoreLog.log.debug("BeanPostLoad on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); + CoreLog.log.log(DEBUG, "BeanPostLoad on[{0}] {1}", deployDesc.getFullName(), c.getClass().getName()); deployDesc.addPostLoad(c); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java index 8c1624d05..951f6b92b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java @@ -34,7 +34,7 @@ public final class TableJoin { private final int queryHash; private final PropertyForeignKey foreignKey; - + private final String extraWhere; public TableJoin(DeployTableJoin deploy) { @@ -135,21 +135,21 @@ public final class TableJoin { public void addJoin(SqlJoinType joinType, String prefix, DbSqlContext ctx, String predicate) { String[] names = SplitName.split(prefix); - String a1 = ctx.getTableAlias(names[0]); - String a2 = ctx.getTableAlias(prefix); + String a1 = ctx.tableAlias(names[0]); + String a2 = ctx.tableAlias(prefix); addJoin(joinType, a1, a2, ctx); ctx.append(" and ").append(a2).append(predicate); } public SqlJoinType addJoin(SqlJoinType joinType, String prefix, DbSqlContext ctx) { String[] names = SplitName.split(prefix); - String a1 = ctx.getTableAlias(names[0]); - String a2 = ctx.getTableAlias(prefix); + String a1 = ctx.tableAlias(names[0]); + String a2 = ctx.tableAlias(prefix); return addJoin(joinType, a1, a2, ctx); } public SqlJoinType addJoin(SqlJoinType joinType, String a1, String a2, DbSqlContext ctx) { - String joinLiteral = joinType.getLiteral(type); + String joinLiteral = joinType.literal(type); ctx.addJoin(joinLiteral, table, columns(), a1, a2, extraWhere); return joinType.autoToOuter(type); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java index 38f0085fb..d4ee1f595 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.deploy.generatedproperty; import io.ebean.bean.EntityBean; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import io.ebeaninternal.server.deploy.BeanProperty; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java index 01aec83e7..89a3677a2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.DbReadContext; import io.ebeaninternal.server.deploy.DbSqlContext; import io.ebeaninternal.server.query.STreeProperty; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.io.DataInput; import java.io.DataOutput; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java index e3b23e9fb..d2fda9bd2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; import io.ebeaninternal.server.deploy.DbReadContext; import io.ebeaninternal.server.deploy.DbSqlContext; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.io.DataInput; import java.io.DataOutput; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java index af3df49dc..b4bbbff1a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.core.DefaultSqlUpdate; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.DbReadContext; import io.ebeaninternal.server.deploy.DbSqlContext; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.io.DataInput; import java.io.DataOutput; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java index 0a24c78d2..729ad0adb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java @@ -10,7 +10,7 @@ import io.ebeaninternal.server.deploy.DbReadContext; import io.ebeaninternal.server.deploy.DbSqlContext; import io.ebeaninternal.server.persist.MultiValueWrapper; import io.ebeaninternal.server.persist.platform.MultiValueBind; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.io.DataInput; import java.io.DataOutput; @@ -145,9 +145,7 @@ public final class IdBinderSimple implements IdBinder { @Override public void addIdInBindValues(SpiExpressionRequest request, Collection values) { List copy = new ArrayList<>(values); - for (int i = 0; i < copy.size(); i++) { - copy.set(i, convertSetId(copy.get(i), null)); - } + copy.replaceAll(idValue -> convertSetId(idValue, null)); request.addBindValue(new MultiValueWrapper(copy)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index 49767439f..dfeacbd83 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -152,7 +152,6 @@ public class DeployBeanDescriptor { private DocStoreMode docStoreDelete; private DeployBeanProperty idProperty; private TableJoin primaryKeyJoin; - private Object jacksonAnnotatedClass; /** * Construct the BeanDescriptor. @@ -1130,14 +1129,4 @@ public class DeployBeanDescriptor { } } - /** - * Returns the jackson annotated class, if jackson is present. - */ - @SuppressWarnings("unchecked") - Object /*AnnotatedClass*/ getJacksonAnnotatedClass() { - if (jacksonAnnotatedClass == null) { - jacksonAnnotatedClass = new DeployBeanObtainJackson(config, beanType).obtain(); - } - return jacksonAnnotatedClass; - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java index 655f4c101..2507387ab 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java @@ -175,7 +175,7 @@ public class DeployBeanProperty { this.propertyType = propertyType; this.genericType = null; this.scalarType = wrapScalarType(propertyType, scalarType, typeConverter); - this.dbType = (scalarType == null) ? 0 : scalarType.getJdbcType(); + this.dbType = (scalarType == null) ? 0 : scalarType.jdbcType(); } public DeployBeanProperty(DeployBeanDescriptor desc, Class propertyType, Type genericType) { @@ -240,7 +240,7 @@ public class DeployBeanProperty { */ public int getDbLength() { if (dbLength == 0 && scalarType != null) { - return scalarType.getLength(); + return scalarType.length(); } return dbLength; @@ -1042,20 +1042,6 @@ public class DeployBeanProperty { this.elementProperty = true; } - /** - * Returns the jackson annotated field, if jackson is present. - */ - public Object /*AnnotatedField*/ getJacksonField() { - com.fasterxml.jackson.databind.introspect.AnnotatedClass jac = - (com.fasterxml.jackson.databind.introspect.AnnotatedClass) getDesc().getJacksonAnnotatedClass(); - for (com.fasterxml.jackson.databind.introspect.AnnotatedField candidate : jac.fields()) { - if (candidate.getName().equals(getName())) { - return candidate; - } - } - return null; - } - public void initMetaAnnotations(Set> metaAnnotationsFilter) { metaAnnotations = AnnotationUtil.metaFindAllFor(field, metaAnnotationsFilter); } @@ -1145,7 +1131,7 @@ public class DeployBeanProperty { } boolean isJsonMapper() { - return scalarType != null && scalarType.isJsonMapper(); + return scalarType != null && scalarType.jsonMapper(); } boolean isJsonType() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java index 4605a2d6b..e33dd310c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import static java.lang.System.Logger.Level.WARNING; + /** * Helper object to classify BeanProperties into appropriate lists. */ @@ -222,7 +224,7 @@ public final class DeployBeanPropertyLists { if (versionProperty == null) { versionProperty = prop; } else { - CoreLog.internal.warn("Multiple @Version properties - property " + prop.fullName() + " not treated as a version property"); + CoreLog.internal.log(WARNING, "Multiple @Version properties - property " + prop.fullName() + " not treated as a version property"); } } else if (prop.isDraftDirty()) { draftDirty = prop; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployIdentityMode.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployIdentityMode.java index 6a20d9145..6f70bff19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployIdentityMode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployIdentityMode.java @@ -12,10 +12,10 @@ public final class DeployIdentityMode { } private IdType type; - private IdentityGenerated generated; + private final IdentityGenerated generated; private int start; private int increment; - private int cache; + private final int cache; private String sequenceName; private boolean platformDefault; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoin.java index 8a56e8a82..0f3ed54c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoin.java @@ -137,7 +137,6 @@ public final class DeployTableJoin { /** * Returns the clause of an extra @Where annotation. - * @return */ public String getExtraWhere() { return extraWhere; 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..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().getScalarType(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().getScalarType(elementType); + ScalarType valueScalarType = util.typeManager().type(elementType); if (valueScalarType == null && elementType.isEnum()) { Class> enumClass = (Class>)elementType; - valueScalarType = util.getTypeManager().createEnumScalarType(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/AnnotationAssocOnes.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocOnes.java index 18b087305..598962fcf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocOnes.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocOnes.java @@ -16,6 +16,8 @@ import io.ebeaninternal.server.query.SqlJoinType; import javax.persistence.*; +import static java.lang.System.Logger.Level.INFO; + /** * Read the deployment annotations for Associated One beans. */ @@ -213,10 +215,10 @@ final class AnnotationAssocOnes extends AnnotationAssoc { prop.setPrimaryKeyJoin(true); if (!primaryKeyJoin.name().isEmpty()) { - CoreLog.internal.info("Automatically determining join columns for @PrimaryKeyJoinColumn - ignoring PrimaryKeyJoinColumn.name attribute [{}] on {}", primaryKeyJoin.name(), prop.getFullBeanName()); + CoreLog.internal.log(INFO, "Automatically determining join columns for @PrimaryKeyJoinColumn - ignoring PrimaryKeyJoinColumn.name attribute [{0}] on {1}", primaryKeyJoin.name(), prop.getFullBeanName()); } if (!primaryKeyJoin.referencedColumnName().isEmpty()) { - CoreLog.internal.info("Automatically determining join columns for @PrimaryKeyJoinColumn - Ignoring PrimaryKeyJoinColumn.referencedColumnName attribute [{}] on {}", primaryKeyJoin.referencedColumnName(), prop.getFullBeanName()); + CoreLog.internal.log(INFO, "Automatically determining join columns for @PrimaryKeyJoinColumn - Ignoring PrimaryKeyJoinColumn.referencedColumnName attribute [{0}] on {1}", primaryKeyJoin.referencedColumnName(), prop.getFullBeanName()); } BeanTable baseBeanTable = factory.beanTable(info.getDescriptor().getBeanType()); String localPrimaryKey = baseBeanTable.getIdColumn(); 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 b74035dc0..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.platform = databasePlatform.getPlatform(); - this.namingConvention = util.getNamingConvention(); + this.databasePlatform = util.dbPlatform(); + this.platform = databasePlatform.platform(); + this.namingConvention = util.namingConvention(); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java index 956fa66c7..662b73be8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java @@ -1,19 +1,7 @@ package io.ebeaninternal.server.deploy.parse; -import io.ebean.annotation.Cache; -import io.ebean.annotation.DbComment; -import io.ebean.annotation.DbPartition; -import io.ebean.annotation.DocStore; -import io.ebean.annotation.Draftable; -import io.ebean.annotation.DraftableElement; -import io.ebean.annotation.History; -import io.ebean.annotation.Identity; import io.ebean.annotation.Index; -import io.ebean.annotation.InvalidateQueryCache; -import io.ebean.annotation.ReadAudit; -import io.ebean.annotation.StorageEngine; -import io.ebean.annotation.Tablespace; -import io.ebean.annotation.View; +import io.ebean.annotation.*; import io.ebean.config.TableName; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.server.deploy.BeanDescriptor.EntityType; @@ -23,16 +11,10 @@ import io.ebeaninternal.server.deploy.PartitionMeta; import io.ebeaninternal.server.deploy.TablespaceMeta; import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; -import javax.persistence.AttributeOverride; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.Entity; -import javax.persistence.IdClass; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import static io.ebean.util.AnnotationUtil.typeGet; +import static java.lang.System.Logger.Level.ERROR; /** * Read the class level deployment annotations. @@ -65,7 +47,7 @@ final class AnnotationClass extends AnnotationParser { Column column = override.column(); DeployBeanProperty beanProperty = descriptor.getBeanProperty(propertyName); if (beanProperty == null) { - CoreLog.log.error("AttributeOverride property [" + propertyName + "] not found on " + descriptor.getFullName()); + CoreLog.log.log(ERROR, "AttributeOverride property [" + propertyName + "] not found on " + descriptor.getFullName()); } else { readColumn(column, beanProperty); } 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 f93fbf028..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) { @@ -386,7 +386,7 @@ final class AnnotationFields extends AnnotationParser { private void setEncryption(DeployBeanProperty prop, boolean dbEncString, int dbLen) { util.checkEncryptKeyManagerDefined(prop.getFullBeanName()); ScalarType st = prop.getScalarType(); - if (byte[].class.equals(st.getType())) { + if (byte[].class.equals(st.type())) { // Always using Java client encryption rather than DB for encryption // of binary data (partially as this is not supported on all db's etc) // This could be reviewed at a later stage. @@ -398,10 +398,10 @@ final class AnnotationFields extends AnnotationParser { return; } if (dbEncString) { - DbEncrypt dbEncrypt = util.getDbPlatform().getDbEncrypt(); + DbEncrypt dbEncrypt = util.dbPlatform().dbEncrypt(); if (dbEncrypt != null) { // check if we have a DB encryption function for this type - int jdbcType = prop.getScalarType().getJdbcType(); + int jdbcType = prop.getScalarType().jdbcType(); DbEncryptFunction dbEncryptFunction = dbEncrypt.getDbEncryptFunction(jdbcType); if (dbEncryptFunction != null) { // Use DB functions to encrypt and decrypt @@ -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.typeManager().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 426c92048..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 @@ -13,6 +13,8 @@ import javax.persistence.PersistenceException; import javax.persistence.Transient; import java.lang.reflect.*; +import static java.lang.System.Logger.Level.*; + /** * Create the properties for a bean. *

@@ -84,7 +86,7 @@ public final class DeployCreateProperties { if (replaced != null && !replaced.isTransient()) { String msg = "Huh??? property " + prop.getFullBeanName() + " being defined twice"; msg += " but replaced property was not transient? This is not expected?"; - CoreLog.log.warn(msg); + CoreLog.log.log(WARNING, msg); } } } @@ -106,12 +108,12 @@ 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); } } catch (NullPointerException e) { - CoreLog.internal.debug("expected non-scalar type {}", e.getMessage()); + CoreLog.internal.log(DEBUG, "expected non-scalar type {0}", e.getMessage()); } return new DeployBeanPropertyAssocMany(desc, targetType, manyType); } @@ -132,14 +134,14 @@ public final class DeployCreateProperties { // not supporting this field (generic type used) return null; } - CoreLog.internal.warn("Could not find parameter type (via reflection) on " + desc.getFullName() + " " + field.getName()); + CoreLog.internal.log(WARNING, "Could not find parameter type (via reflection) on " + desc.getFullName() + " " + field.getName()); } return createManyType(desc, targetType, manyType); } 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); } @@ -151,7 +153,7 @@ public final class DeployCreateProperties { return new DeployBeanPropertyAssocOne(desc, propertyType); } catch (Exception e) { - CoreLog.log.error("Error with " + desc + " field:" + field.getName(), e); + CoreLog.log.log(ERROR, "Error with " + desc + " field:" + field.getName(), e); return null; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java index 3df70b406..67e41e3ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java @@ -255,7 +255,7 @@ public final class DeployInheritInfo implements Comparable { public String toString() { String root = parent == null ? null : parent.getName(); String name = type == null ? null : type.getName(); - return "InheritInfo[" + name + "]" + " root[" + root + "]" + " disValue[" + discriminatorStringValue + "]"; + return "InheritInfo " + name + " root:" + root + " disc:" + discriminatorStringValue; } @Override 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 a8cbe5fdf..027ecfc4c 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; } @@ -102,9 +102,9 @@ 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.getJdbcType()); + prop.setDbType(scalarType.jdbcType()); } catch (IllegalStateException e) { throw new PersistenceException("Error mapping property " + prop.getFullBeanName() + " - " + e.getMessage()); } @@ -123,25 +123,25 @@ 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.getJdbcType()); + property.setDbType(scalarType.jdbcType()); property.setScalarType(scalarType); property.checkPrimitiveBoolean(); } } - private ScalarType getScalarType(DeployBeanProperty property) { + private ScalarType scalarType(DeployBeanProperty property) { // Note that Temporal types already have dbType // 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; } - throw new PersistenceException(property.getFullBeanName() + " has no ScalarType - type[" + propType.getName() + "]"); + throw new PersistenceException(property.getFullBeanName() + " has no ScalarType - type " + propType.getName()); } catch (IllegalArgumentException e) { if (property.isTransient()) { // expected for transient properties with unknown/non-mapped types @@ -155,8 +155,8 @@ 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(); - int dbType = scalarType.getJdbcType(); + ScalarType scalarType = typeManager.dbMapType(); + int dbType = scalarType.jdbcType(); prop.setDbType(dbType); prop.setScalarType(scalarType); if (dbType == Types.VARCHAR) { @@ -171,12 +171,17 @@ public final class DeployUtil { * Set the DbArray type (effectively Postgres only). */ void setDbArray(DeployBeanProperty prop, DbArray dbArray) { - Class type = prop.getPropertyType(); - ScalarType scalarType = typeManager.getArrayScalarType(type, prop.getGenericType(), prop.isNullable()); - if (scalarType == null) { - throw new RuntimeException("No ScalarType for @DbArray type for [" + prop.getFullBeanName() + "]"); + if (!dbArray.nullable()) { + // Non-nullable ScalarTypeArray's will auto bind null to empty array, we need to + // set nullable(false) before the ScalarTypeArray is determined and assigned + prop.setNullable(false); } - int dbType = scalarType.getJdbcType(); + Class type = prop.getPropertyType(); + ScalarType scalarType = typeManager.dbArrayType(type, prop.getGenericType(), prop.isNullable()); + if (scalarType == null) { + throw new RuntimeException("No ScalarType for @DbArray type for " + prop.getFullBeanName()); + } + int dbType = scalarType.jdbcType(); prop.setDbType(dbType); prop.setScalarType(scalarType); if (scalarType instanceof ScalarTypeArray) { @@ -193,7 +198,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()); } @@ -204,9 +209,9 @@ 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 + "]"); + throw new RuntimeException("No ScalarType for JSON property " + prop + " dbType:" + dbType); } prop.setScalarType(scalarType); if (dbType == Types.VARCHAR || dbLength > 0) { @@ -219,7 +224,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; @@ -240,7 +245,7 @@ public final class DeployUtil { void setLobType(DeployBeanProperty prop) { ScalarType scalarType = prop.getScalarType(); if (scalarType instanceof ScalarTypeWrapper) { - int lobType = scalarType.getJdbcType() == Types.VARCHAR ? dbCLOBType : dbBLOBType; + int lobType = scalarType.jdbcType() == Types.VARCHAR ? dbCLOBType : dbBLOBType; prop.setDbType(lobType); } else { // is String or byte[] ? used to determine if its a CLOB or BLOB @@ -248,10 +253,10 @@ 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 + "] [" + lobType + "]"); + throw new RuntimeException("No ScalarType for LOB type " + type + " dbType:" + lobType); } prop.setDbType(lobType); prop.setScalarType(scalarType); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotationConfig.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotationConfig.java index 81b5576e9..7e5a09782 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotationConfig.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotationConfig.java @@ -106,10 +106,7 @@ final class ReadAnnotationConfig { if (javaxValidation != null && javaxValidation.isValidationNotNull(property)) { return true; } - if (jakartaValidation != null && jakartaValidation.isValidationNotNull(property)) { - return true; - } - return false; + return jakartaValidation != null && jakartaValidation.isValidationNotNull(property); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java index cb7ec4797..fed2ff4c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; /** - * Holds property and constructor meta data for a given DTO bean type. - * + * Holds property and constructor meta-data for a given DTO bean type. + *

* Uses this to map a mapping request (columns) to a 'query plan' (constructor and setters). */ final class DtoMeta { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java index 43acbf342..67f4d9912 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java @@ -9,6 +9,8 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; +import static java.lang.System.Logger.Level.DEBUG; + /** * Build the DtoMeta for a bean. *

@@ -39,7 +41,7 @@ final class DtoMetaBuilder { final String name = propertyName(method.getName()); properties.add(new DtoMetaProperty(typeManager, dtoType, method, name)); } catch (Exception e) { - CoreLog.log.debug("exclude on " + dtoType + " method " + method, e); + CoreLog.log.log(DEBUG, "exclude on " + dtoType + " method " + method, e); } } } @@ -77,7 +79,7 @@ final class DtoMetaBuilder { constructorList.add(new DtoMetaConstructor(typeManager, constructor, dtoType)); } catch (Exception e) { // we don't want that constructor - CoreLog.log.debug("exclude on " + dtoType + " constructor " + constructor, e); + CoreLog.log.log(DEBUG, "exclude on " + dtoType + " constructor " + constructor, e); } } } 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/el/CharMatch.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/CharMatch.java index 13af0c02a..53622a8ab 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/CharMatch.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/CharMatch.java @@ -23,7 +23,7 @@ public final class CharMatch { return false; } - char ta[] = other.toCharArray(); + char[] ta = other.toCharArray(); int pos = -1; while (++pos < maxLength) { @@ -42,7 +42,7 @@ public final class CharMatch { return false; } - char ta[] = other.toCharArray(); + char[] ta = other.toCharArray(); int offset = ta.length - maxLength; int pos = maxLength; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElFilter.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElFilter.java index bd28af35c..105dff381 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElFilter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElFilter.java @@ -46,7 +46,7 @@ public final class ElFilter implements Filter { return this; } - protected boolean isMatch(T bean) { + boolean isMatch(T bean) { for (ElMatcher matcher : matches) { if (!matcher.isMatch(bean)) { return false; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java index d10acaedc..b04bacb24 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java @@ -227,20 +227,9 @@ public final class ElPropertyChain implements ElPropertyValue { return lastBeanProperty; } - - @Override - public boolean isDateTimeCapable() { - return scalarType != null && scalarType.isDateTimeCapable(); - } - @Override public int jdbcType() { - return scalarType == null ? 0 : scalarType.getJdbcType(); - } - - @Override - public Object parseDateTime(long systemTimeMillis) { - return scalarType.convertFromMillis(systemTimeMillis); + return scalarType == null ? 0 : scalarType.jdbcType(); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonExecutorService.java b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonExecutorService.java index af23a086d..ea7ce58e4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonExecutorService.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonExecutorService.java @@ -1,12 +1,12 @@ package io.ebeaninternal.server.executor; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.avaje.applog.AppLog; import java.util.concurrent.*; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; + /** * A "CachedThreadPool" based on Daemon threads. *

@@ -14,7 +14,7 @@ import java.util.concurrent.locks.ReentrantLock; */ final class DaemonExecutorService { - private static final Logger logger = LoggerFactory.getLogger(DaemonExecutorService.class); + private static final System.Logger logger = AppLog.getLogger(DaemonExecutorService.class); private final ReentrantLock lock = new ReentrantLock(false); private final String namePrefix; @@ -44,19 +44,19 @@ final class DaemonExecutorService { lock.lock(); try { if (service.isShutdown()) { - logger.debug("DaemonExecutorService[{}] already shut down", namePrefix); + logger.log(DEBUG, "DaemonExecutorService[{0}] already shut down", namePrefix); return; } try { - logger.debug("DaemonExecutorService[{}] shutting down...", namePrefix); + logger.log(DEBUG, "DaemonExecutorService[{0}] shutting down...", namePrefix); service.shutdown(); if (!service.awaitTermination(shutdownWaitSeconds, TimeUnit.SECONDS)) { - logger.info("DaemonExecutorService[{}] shut down timeout exceeded. Terminating running threads.", namePrefix); + logger.log(INFO, "DaemonExecutorService[{0}] shut down timeout exceeded. Terminating running threads.", namePrefix); service.shutdownNow(); } } catch (Exception e) { - logger.error("Error during shutdown of DaemonThreadPool[" + namePrefix + "]", e); + logger.log(ERROR, "Error during shutdown of DaemonThreadPool[" + namePrefix + "]", e); e.printStackTrace(); } } finally { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonScheduleThreadPool.java b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonScheduleThreadPool.java index 98265905f..1dd961c6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonScheduleThreadPool.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonScheduleThreadPool.java @@ -1,18 +1,19 @@ package io.ebeaninternal.server.executor; import io.ebeaninternal.api.CoreLog; -import org.slf4j.Logger; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; + /** * Daemon based ScheduleThreadPool. */ public final class DaemonScheduleThreadPool extends ScheduledThreadPoolExecutor { - private static final Logger log = CoreLog.log; + private static final System.Logger log = CoreLog.log; private final ReentrantLock lock = new ReentrantLock(); private final String namePrefix; @@ -38,19 +39,19 @@ public final class DaemonScheduleThreadPool extends ScheduledThreadPoolExecutor lock.lock(); try { if (super.isShutdown()) { - log.debug("Already shutdown threadPool {}", namePrefix); + log.log(DEBUG, "Already shutdown threadPool {0}", namePrefix); return; } try { - log.trace("shutting down threadPool {}", namePrefix); + log.log(TRACE, "shutting down threadPool {0}", namePrefix); super.shutdown(); if (!super.awaitTermination(shutdownWaitSeconds, TimeUnit.SECONDS)) { - log.info("Shutdown wait timeout exceeded. Terminating running threads for {}", namePrefix); + log.log(INFO, "Shutdown wait timeout exceeded. Terminating running threads for {0}", namePrefix); super.shutdownNow(); } - log.trace("shutdown complete for threadPool {}", namePrefix); + log.log(TRACE, "shutdown complete for threadPool {0}", namePrefix); } catch (Exception e) { - log.error("Error during shutdown of threadPool " + namePrefix, e); + log.log(ERROR, "Error during shutdown of threadPool " + namePrefix, e); e.printStackTrace(); } } finally { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DefaultBackgroundExecutor.java b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DefaultBackgroundExecutor.java index b4c13a8bd..47271bc38 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DefaultBackgroundExecutor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DefaultBackgroundExecutor.java @@ -1,13 +1,13 @@ package io.ebeaninternal.server.executor; +import io.avaje.applog.AppLog; import io.avaje.lang.NonNullApi; import io.ebean.config.BackgroundExecutorWrapper; import io.ebeaninternal.api.SpiBackgroundExecutor; import java.util.concurrent.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static java.lang.System.Logger.Level.*; /** * The default implementation of the BackgroundExecutor. @@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory; @NonNullApi public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { - private static final Logger log = LoggerFactory.getLogger("io.ebean.BackgroundExecutor"); + private static final System.Logger log = AppLog.getLogger("io.ebean.BackgroundExecutor"); private final ScheduledExecutorService schedulePool; private final DaemonExecutorService pool; @@ -28,7 +28,6 @@ public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { this.schedulePool = new DaemonScheduleThreadPool(schedulePoolSize, shutdownWaitSeconds, namePrefix + "-periodic-"); this.pool = new DaemonExecutorService(shutdownWaitSeconds, namePrefix); this.wrapper = wrapper; - log.debug("Created backgroundExecutor {} (schedulePoolSize={}, shutdownWaitSeconds={})", namePrefix, schedulePoolSize, shutdownWaitSeconds); } /** @@ -59,20 +58,20 @@ public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { * This is used in methods that accepts a Runnable and return * either void or ScheduledFuture, as there is * normally no Future.get() call. - * + *

* Note: When submitting a Callable, you must check * Future.get() for exceptions. */ private Runnable logExceptions(Runnable task) { long queued = System.nanoTime(); - log.trace("Queued {}", task); + log.log(TRACE, "Queued {0}", task); return () -> { try { - if (log.isTraceEnabled()) { + if (log.isLoggable(TRACE)) { long start = System.nanoTime(); - log.trace("Start {} (delay time {} us)", task, (start - queued) / 1000L); + log.log(TRACE, "Start {0} (delay time {1} us)", task, (start - queued) / 1000L); task.run(); - log.trace("Stop {} (exec time {} us)", task, (System.nanoTime() - start) / 1000L); + log.log(TRACE, "Stop {0} (exec time {1} us)", task, (System.nanoTime() - start) / 1000L); } else { task.run(); } @@ -80,7 +79,7 @@ public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { // log any exception here. Note they will not bubble up to the calling user // unless Future.get() is checked. (Which is almost never done on scheduled // background executions) - log.error("Error while executing the task {}", task, t); + log.log(ERROR, "Error while executing the task " + task, t); throw t; } }; @@ -107,31 +106,31 @@ public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { @Override public ScheduledFuture scheduleWithFixedDelay(Runnable task, long initialDelay, long delay, TimeUnit unit) { - return schedulePool.scheduleWithFixedDelay(wrap(logExceptions(task)), initialDelay, delay, unit); + return schedulePool.scheduleWithFixedDelay(logExceptions(task), initialDelay, delay, unit); } @Override public ScheduledFuture scheduleAtFixedRate(Runnable task, long initialDelay, long delay, TimeUnit unit) { - return schedulePool.scheduleAtFixedRate(wrap(logExceptions(task)), initialDelay, delay, unit); + return schedulePool.scheduleAtFixedRate(logExceptions(task), initialDelay, delay, unit); } @Override public ScheduledFuture schedule(Runnable task, long delay, TimeUnit unit) { - return schedulePool.schedule(wrap(logExceptions(task)), delay, unit); + return schedulePool.schedule(logExceptions(task), delay, unit); } @Override public ScheduledFuture schedule(Callable task, long delay, TimeUnit unit) { // Note: No "logExceptions" as we expect Future.get() by the invoker - return schedulePool.schedule(wrap(task), delay, unit); + return schedulePool.schedule(task, delay, unit); } @Override public void shutdown() { - log.trace("BackgroundExecutor shutting down"); + log.log(TRACE, "BackgroundExecutor shutting down"); schedulePool.shutdown(); pool.shutdown(); - log.debug("BackgroundExecutor stopped"); + log.log(DEBUG, "BackgroundExecutor stopped"); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index 26f225f3a..234fd28c2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -76,11 +76,7 @@ public class DefaultExpressionList implements SpiExpressionList { } public DefaultExpressionList(Query query, ExpressionList parentExprList) { - this(query, query.getExpressionFactory(), parentExprList); - } - - DefaultExpressionList(Query query, ExpressionFactory expr, ExpressionList parentExprList) { - this(query, expr, parentExprList, new ArrayList<>()); + this(query, query.getExpressionFactory(), parentExprList, new ArrayList<>()); } DefaultExpressionList(Query query, ExpressionFactory expr, ExpressionList parentExprList, List list) { @@ -243,13 +239,12 @@ public class DefaultExpressionList implements SpiExpressionList { /** * Return a copy of the expression list. - *

- * Each of the expressions are expected to be immutable and safe to reference. - *

*/ public DefaultExpressionList copy(Query query) { - DefaultExpressionList copy = new DefaultExpressionList<>(query, expr, null); - copy.list.addAll(list); + DefaultExpressionList copy = new DefaultExpressionList<>(query, expr, null, new ArrayList<>(list.size())); + for (SpiExpression expr : list) { + copy.list.add(expr.copy()); + } return copy; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java index 89273c230..d1b1f4040 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.DeployParser; import io.ebeaninternal.server.expression.platform.DbExpressionHandler; import io.ebeaninternal.server.persist.Binder; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.sql.SQLException; import java.util.ArrayList; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java index 06b9a43e1..4a8717e4c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java @@ -27,6 +27,11 @@ final class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreE this.subQuery = null; } + @Override + public SpiExpression copy() { + return subQuery == null ? this : new ExistsQueryExpression(subQuery.copy(), not); + } + @Override public void prefixProperty(String path) { // do nothing @@ -57,8 +62,8 @@ final class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreE @Override public void prepareExpression(BeanQueryRequest request) { CQuery subQuery = compileSubQuery(request); - this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); - this.sql = subQuery.getGeneratedSql().replace('\n', ' '); + this.bindParams = subQuery.predicates().whereExprBindValues(); + this.sql = subQuery.generatedSql().replace('\n', ' '); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java index 45d308eec..3b8c5005b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java @@ -27,7 +27,7 @@ public final class FilterExpressionList extends DefaultExpressionList { } public FilterExpressionList(FilterExprPath pathPrefix, ExpressionFactory expr, Query rootQuery) { - super(null, expr, null); + super(null, expr, null, new ArrayList<>()); this.pathPrefix = pathPrefix; this.rootQuery = rootQuery; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java index 8c0a12506..f922edbfe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java @@ -31,6 +31,11 @@ final class InQueryExpression extends AbstractExpression implements UnsupportedD this.bindParams = bindParams; } + @Override + public SpiExpression copy() { + return subQuery == null ? this : new InQueryExpression(propName, subQuery.copy(), not); + } + @Override public void simplify() { // do nothing @@ -43,10 +48,9 @@ final class InQueryExpression extends AbstractExpression implements UnsupportedD @Override public void prepareExpression(BeanQueryRequest request) { - CQuery subQuery = compileSubQuery(request); - this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); - this.sql = subQuery.getGeneratedSql().replace('\n', ' '); + this.bindParams = subQuery.predicates().whereExprBindValues(); + this.sql = subQuery.generatedSql().replace('\n', ' '); } @Override @@ -71,7 +75,6 @@ final class InQueryExpression extends AbstractExpression implements UnsupportedD @Override public void addSql(SpiExpressionRequest request) { - request.append(" (").append(propName).append(")"); if (not) { request.append(" not"); @@ -83,7 +86,6 @@ final class InQueryExpression extends AbstractExpression implements UnsupportedD @Override public void addBindValues(SpiExpressionRequest request) { - for (Object bindParam : bindParams) { request.addBindValue(bindParam); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java index da3eee778..189b669e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java @@ -10,7 +10,7 @@ public final class DbExpressionHandlerFactory { * Create and return the appropriate platform specific handing of expressions. */ public static DbExpressionHandler from(DatabasePlatform databasePlatform) { - Platform platform = databasePlatform.getPlatform().base(); + Platform platform = databasePlatform.platform().base(); switch (platform) { case H2: return new H2DbExpression(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/grammer/EqlWhereListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/grammer/EqlWhereListener.java index 683bf1421..c919a2e97 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/grammer/EqlWhereListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/grammer/EqlWhereListener.java @@ -342,7 +342,6 @@ abstract class EqlWhereListener extends EQLBaseListener { case ':': return EqlValueType.NAMED_PARAM; case 't': - return EqlValueType.BOOL; case 'f': return EqlValueType.BOOL; case '\'': @@ -351,7 +350,7 @@ abstract class EqlWhereListener extends EQLBaseListener { if (Character.isDigit(firstChar)) { return EqlValueType.NUMBER; } - throw new IllegalArgumentException("Unexpected first character in value [" + valueAsText + "]"); + throw new IllegalArgumentException("Unexpected first character in value " + valueAsText); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1IdGenerator.java b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1IdGenerator.java index 083e08df2..386f177c5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1IdGenerator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1IdGenerator.java @@ -6,14 +6,15 @@ import java.net.SocketException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import static java.lang.System.Logger.Level.*; + /** * IdGenerator for java util UUID. - * + *

* It extends the UuidV1RndIdGenerator so that it can generate rfc4122 compliant Type 1 UUIDs. - * + *

* This generator produces real Type 1 UUIDs (best for sqlserver) - You should use this generator only, * if you can guarantee, that mac addess is uniqe or specify 'ebean.uuidNodeId' in your config file. - * */ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { @@ -34,7 +35,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { * Returns an instance for given file. */ public static UuidV1IdGenerator getInstance(File file, String nodeId) { - return INSTANCES.computeIfAbsent(file, f ->new UuidV1IdGenerator(f, nodeId == null ? null : nodeId.toLowerCase())); + return INSTANCES.computeIfAbsent(file, f -> new UuidV1IdGenerator(f, nodeId == null ? null : nodeId.toLowerCase())); } /** @@ -60,7 +61,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { /** * Find hardware ID. - * + *

* We check all non-loopback networkinterfaces for valid hardwareAddresses * We prefer to take the first non virtual "up" device. If no device (with valid addr) is up, * we take the first down device. @@ -71,21 +72,18 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { while (e.hasMoreElements()) { NetworkInterface network = e.nextElement(); try { - log.trace("Probing interface {}", network); if (!network.isLoopback()) { byte[] addr = network.getHardwareAddress(); if (validAddr(addr)) { if (network.isUp() && !network.isVirtual()) { - log.debug("Using interface {}", network); return addr; } else if (fallbackAddr == null) { - log.debug("Using interface {} as fallback", network); fallbackAddr = addr; } } } } catch (SocketException ex) { - log.debug("Skipping {}", network, ex); + log.log(DEBUG, "Skipping " + network, ex); } } return fallbackAddr; @@ -98,7 +96,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { if (addr != null && addr.length >= 6) { // valid addr has 6 bytes // check if vendor is != 0x000000 or 0xFFFFFF return (addr[0] != 0x00 && addr[1] != 0x00 && addr[2] != 0x00) - ||(addr[0] != 0xFF && addr[1] != 0xFF && addr[2] != 0xFF); + || (addr[0] != 0xFF && addr[1] != 0xFF && addr[2] != 0xFF); } return false; } @@ -122,7 +120,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { // See, if there is an alternative MAC address set. nodeId = parseAlternativeNodeId(altNodeId); restoreState(); - log.info("Explicitly using ID {} to generate Type 1 UUIDs", getNodeIdentifier()); + log.log(INFO, "Explicitly using ID {0} to generate Type 1 UUIDs", getNodeIdentifier()); } UUID uuid = nextId(null); long ts = timeStamp.get(); @@ -130,9 +128,9 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { ts /= MILLIS_TO_UUID; saveState(); - log.debug("Saved state: clockSeq {}, timestamp {}, uuid {}, stateFile: {})", clockSeq.get(), new Date(ts), uuid, stateFile); + log.log(DEBUG, "Saved state: clockSeq {0}, timestamp {1}, uuid {2}, stateFile: {3})", clockSeq.get(), new Date(ts), uuid, stateFile); } catch (IOException e) { - log.error("There was a problem while detecting the nodeId. Falling back to random mode. Try using to specify 'ebean.uuidNodeId' property", e); + log.log(ERROR, "There was a problem while detecting the nodeId. Falling back to random mode. Try using to specify 'ebean.uuidNodeId' property", e); useRandomMode(); } } @@ -141,7 +139,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { * Tries to initialize the generator by retrieving the MAC address from * hardware. If there is no suitable network interface found, it will fall back * to "generate" mode. - * + * * @throws IOException if state file is not readable or tryGenerateMode also * fails. */ @@ -149,16 +147,16 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { try { nodeId = getHardwareId(); } catch (IOException e) { - log.error("Error while reading MAC address. Fall back to 'generate' mode", e); + log.log(ERROR, "Error while reading MAC address. Fall back to 'generate' mode", e); tryGenerateMode(); } if (nodeId != null) { restoreState(); - log.info("Using MAC {} to generate Type 1 UUIDs", getNodeIdentifier()); + log.log(INFO, "Using MAC {0} to generate Type 1 UUIDs", getNodeIdentifier()); return; } - log.warn("No suitable network interface found. Fall back to 'generate' mode"); + log.log(WARNING, "No suitable network interface found. Fall back to 'generate' mode"); tryGenerateMode(); } @@ -168,11 +166,11 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { */ private void tryGenerateMode() throws IOException { if (restoreState()) { - log.info("Using recently generated nodeId {} to generate Type 1 UUIDs", getNodeIdentifier()); + log.log(INFO, "Using recently generated nodeId {0} to generate Type 1 UUIDs", getNodeIdentifier()); } else { // RFC 4.5 use random portion for node nodeId = super.getNodeIdBytes(); - log.info("Using a newly generated nodeId {} to generate Type 1 UUIDs", getNodeIdentifier()); + log.log(INFO, "Using a newly generated nodeId {0} to generate Type 1 UUIDs", getNodeIdentifier()); } } @@ -183,7 +181,7 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { private void useRandomMode() { canSaveState = false; nodeId = super.getNodeIdBytes(); - log.info("Explicitly using a new random ID {} to generate Type 1 UUIDs", getNodeIdentifier()); + log.log(INFO, "Explicitly using a new random ID {0} to generate Type 1 UUIDs", getNodeIdentifier()); } /** @@ -206,7 +204,6 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { private boolean restoreState() throws IOException { Properties prop = new Properties(); if (!stateFile.exists()) { - log.debug("State file '{}' does not exist", stateFile); return false; } try (InputStream is = new FileInputStream(stateFile)) { @@ -215,28 +212,27 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { String propNodeId = prop.getProperty("nodeId"); if (propNodeId == null || propNodeId.isEmpty()) { - log.warn("State file '{}' is incomplete", stateFile); + log.log(WARNING, "State file '{0}' is incomplete", stateFile); return false; // we cannot restore } try { if (nodeId == null) { nodeId = parseAlternativeNodeId(propNodeId); } else if (!getNodeIdentifier().equals(propNodeId)) { - log.warn( - "The nodeId in the state file '{}' has changed from {} to {}. " - + "This can happen when MAC address changes or when two containers share the same state file", - stateFile, propNodeId, getNodeIdentifier()); + log.log(WARNING, + "The nodeId in the state file '{0}' has changed from {1} to {2}. " + + "This can happen when MAC address changes or when two containers share the same state file", + stateFile, propNodeId, getNodeIdentifier()); return false; } - Integer seq = Integer.valueOf(prop.getProperty("clockSeq")) & 0x3FFF; + Integer seq = Integer.parseInt(prop.getProperty("clockSeq")) & 0x3FFF; Long ts = Long.valueOf(prop.getProperty("timeStamp")); clockSeq.set(seq); timeStamp.set(ts); - log.debug("State successfully restored: {}", prop); return true; - + } catch (IllegalArgumentException nfe) { - log.error("State file '{}' is corrupt", stateFile, nfe); + log.log(ERROR, "State file corrupt: " + stateFile, nfe); } return false; } @@ -259,9 +255,8 @@ public class UuidV1IdGenerator extends UuidV1RndIdGenerator { } try (OutputStream os = new FileOutputStream(stateFile)) { prop.store(os, "ebean uuid state file"); - log.debug("Persisted state to '{}'", stateFile); } catch (IOException e) { - log.error("Could not persist uuid state to '{}'", stateFile, e); + log.log(ERROR, "Could not persist uuid state to: " + stateFile, e); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1RndIdGenerator.java b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1RndIdGenerator.java index a8fd0b52b..21e34a8b3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1RndIdGenerator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV1RndIdGenerator.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.idgen; +import io.avaje.applog.AppLog; import io.ebean.Transaction; import io.ebean.config.dbplatform.PlatformIdGenerator; @@ -9,25 +10,24 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static java.lang.System.Logger.Level.INFO; /** * IdGenerator for (pseudo) type 1 UUIDs. - * + *

* This implementation generates a type 1 UUID according to * https://tools.ietf.org/html/rfc4122.html#section-4.2 * but has no persistence storage. It generates a new random 47 bit node ID with every * UUID. - * + *

* Use this, if you want randomness in your UUIDs but want to take advantage of index * optimizations of the database. It may be good with AUTO_BINARY_OPTIMIZED and MySql. - * + *

* See: https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/ */ public class UuidV1RndIdGenerator implements PlatformIdGenerator { - protected static final Logger log = LoggerFactory.getLogger("io.ebean.IDGEN"); + protected static final System.Logger log = AppLog.getLogger("io.ebean.IDGEN"); // UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00. protected static final long UUID_EPOCH_OFFSET = 0x01B21DD213814000L; @@ -41,16 +41,16 @@ public class UuidV1RndIdGenerator implements PlatformIdGenerator { private final SecureRandom numberGenerator = new SecureRandom(); - protected AtomicLong timeStamp = new AtomicLong(currentUuidTime()); + protected final AtomicLong timeStamp = new AtomicLong(currentUuidTime()); - private AtomicLong nanoToMilliOffset = new AtomicLong(currentUuidTime()); + private final AtomicLong nanoToMilliOffset = new AtomicLong(currentUuidTime()); private final ReentrantLock lock = new ReentrantLock(); /** * Returns the uuid epoch. - * + *

* This is the number of 100ns intervals since 1582-10-15 00:00:00 */ private static long currentUuidTime() { @@ -106,7 +106,7 @@ public class UuidV1RndIdGenerator implements PlatformIdGenerator { delta = current - last; if (delta < -10000 * 20000) { - log.info("Clock skew of {} ms detected", delta / -10000); + log.log(INFO, "Clock skew of {} ms detected", delta / -10000); // The clock was adjusted back about 2 seconds, or we were generating a lot of ids too fast // if so, we try to set the current as last and also increment the clockSeq. lock.lock(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV4IdGenerator.java b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV4IdGenerator.java index c7d1d8093..1ed619761 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV4IdGenerator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/idgen/UuidV4IdGenerator.java @@ -7,7 +7,7 @@ import java.util.UUID; /** * IdGenerator for java util UUID. - * + *

* This generator generates a 60bit random UUID according to * https://tools.ietf.org/html/rfc4122.html#section-4.4 * Use this generator if you want truly random UUIDs diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonBeanReader.java similarity index 93% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonBeanReader.java index f16238bfa..f1b92a78b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonBeanReader.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import com.fasterxml.jackson.core.JsonParser; import io.ebean.PersistenceIOException; @@ -32,7 +32,7 @@ public final class DJsonBeanReader implements JsonBeanReader { @Override public PersistenceContext getPersistenceContext() { - return readJson.getPersistenceContext(); + return readJson.persistenceContext(); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonContext.java similarity index 99% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonContext.java index c48ead0ca..340f978e1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonContext.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; @@ -122,7 +122,6 @@ public final class DJsonContext implements SpiJsonContext { @Override public T toBean(Class cls, JsonParser parser, JsonReadOptions options) throws JsonIOException { - BeanDescriptor desc = getDescriptor(cls); try { return desc.jsonRead(new ReadJson(desc, parser, options, determineObjectMapper(options), false), null, null); @@ -156,9 +155,9 @@ public final class DJsonContext implements SpiJsonContext { toBean(target, parser, null); } + @SuppressWarnings("unchecked") @Override public void toBean(T target, JsonParser parser, JsonReadOptions options) throws JsonIOException { - BeanDescriptor desc = (BeanDescriptor) getDescriptor(target.getClass()); try { desc.jsonRead(new ReadJson(desc, parser, options, determineObjectMapper(options), target != null), null, target); @@ -169,14 +168,12 @@ public final class DJsonContext implements SpiJsonContext { @Override public DJsonBeanReader createBeanReader(Class cls, JsonParser parser, JsonReadOptions options) throws JsonIOException { - BeanDescriptor desc = getDescriptor(cls); return new DJsonBeanReader<>(desc, new ReadJson(desc, parser, options, determineObjectMapper(options), false)); } @Override public DJsonBeanReader createBeanReader(BeanType beanType, JsonParser parser, JsonReadOptions options) throws JsonIOException { - BeanDescriptor desc = (BeanDescriptor) beanType; SpiJsonReader readJson = new ReadJson(desc, parser, options, determineObjectMapper(options), false); return new DJsonBeanReader<>(desc, readJson); @@ -209,7 +206,6 @@ public final class DJsonContext implements SpiJsonContext { @Override public List toList(Class cls, JsonParser src, JsonReadOptions options) throws JsonIOException { - BeanDescriptor desc = getDescriptor(cls); SpiJsonReader readJson = new ReadJson(desc, src, options, determineObjectMapper(options), false); try { @@ -241,19 +237,16 @@ public final class DJsonContext implements SpiJsonContext { @Override public Object toObject(Type genericType, String json) throws JsonIOException { - return toObject(genericType, createParser(new StringReader(json))); } @Override public Object toObject(Type genericType, Reader json) throws JsonIOException { - return toObject(genericType, createParser(json)); } @Override public Object toObject(Type genericType, JsonParser jsonParser) throws JsonIOException { - TypeInfo info = ParamTypeHelper.getTypeInfo(genericType); ManyType manyType = info.getManyType(); switch (manyType) { @@ -362,7 +355,6 @@ public final class DJsonContext implements SpiJsonContext { @SuppressWarnings("unchecked") private void toJsonInternal(Object value, JsonGenerator gen, JsonWriteOptions options) throws IOException { - if (value == null) { gen.writeNull(); } else if (value instanceof Number) { @@ -392,7 +384,6 @@ public final class DJsonContext implements SpiJsonContext { @Override public SpiJsonReader createJsonRead(BeanType beanType, String json) { - BeanDescriptor desc = (BeanDescriptor) beanType; JsonParser parser = createParser(new StringReader(json)); return new ReadJson(desc, parser, null, defaultObjectMapper, false); @@ -415,7 +406,6 @@ public final class DJsonContext implements SpiJsonContext { } private void toJsonFromCollection(Collection collection, String key, JsonGenerator gen, JsonWriteOptions options) throws IOException { - if (key != null) { gen.writeFieldName(key); } @@ -429,7 +419,6 @@ public final class DJsonContext implements SpiJsonContext { } private void toJsonFromMap(Map map, JsonGenerator gen, JsonWriteOptions options) throws IOException { - Set> entrySet = map.entrySet(); Iterator> it = entrySet.iterator(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java similarity index 90% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java index d0ef82204..cd3420773 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/DJsonScalar.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import com.fasterxml.jackson.core.JsonGenerator; import io.ebean.core.type.ScalarType; @@ -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/text/json/PathStack.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/PathStack.java similarity index 91% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/PathStack.java index 6cb3b2b67..2d4c19a37 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/PathStack.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import io.ebeaninternal.server.util.ArrayStack; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/ReadJson.java similarity index 96% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/ReadJson.java index cdb48f76b..65db79c08 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/ReadJson.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -86,7 +86,7 @@ public final class ReadJson implements SpiJsonReader { * Return the persistence context being used if any. */ @Override - public PersistenceContext getPersistenceContext() { + public PersistenceContext persistenceContext() { return persistenceContext; } @@ -142,7 +142,7 @@ public final class ReadJson implements SpiJsonReader { * Return the objectMapper used for this request. */ @Override - public ObjectMapper getObjectMapper() { + public ObjectMapper mapper() { if (objectMapper == null) { throw new IllegalStateException( "Jackson ObjectMapper required but has not set. The ObjectMapper can be set on" @@ -155,7 +155,7 @@ public final class ReadJson implements SpiJsonReader { * Return the JsonParser. */ @Override - public JsonParser getParser() { + public JsonParser parser() { return parser; } @@ -209,14 +209,14 @@ public final class ReadJson implements SpiJsonReader { */ @Override public Object readValueUsingObjectMapper(Class propertyType) throws IOException { - return getObjectMapper().readValue(parser, propertyType); + return mapper().readValue(parser, propertyType); } /** * Do we have to set values via intercept or not. */ @Override - public boolean isIntercept() { + public boolean intercept() { return intercept; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/json/WriteJson.java similarity index 99% rename from ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java rename to ebean-core/src/main/java/io/ebeaninternal/server/json/WriteJson.java index 17c9e9372..39e03eb95 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/json/WriteJson.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.text.json; +package io.ebeaninternal.server.json; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; @@ -342,7 +342,7 @@ public final class WriteJson implements SpiJsonWriter { } @Override - public boolean isParentBean(Object bean) { + public boolean parentBean(Object bean) { return !parentBeans.isEmpty() && parentBeans.contains(bean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLoggerFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLoggerFactory.java index 90f6cbafa..d52e8cb3b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLoggerFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLoggerFactory.java @@ -1,8 +1,8 @@ package io.ebeaninternal.server.logger; +import io.avaje.applog.AppLog; import io.ebeaninternal.api.SpiLogger; import io.ebeaninternal.api.SpiLoggerFactory; -import org.slf4j.LoggerFactory; /** * Default SpiLoggerFactory implementation. @@ -14,6 +14,6 @@ public final class DLoggerFactory implements SpiLoggerFactory { */ @Override public SpiLogger create(String name) { - return new DSpiLogger(LoggerFactory.getLogger(name)); + return new DSpiLogger(AppLog.getLogger(name)); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java index 7c59031ae..922667037 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DSpiLogger.java @@ -1,33 +1,35 @@ package io.ebeaninternal.server.logger; import io.ebeaninternal.api.SpiLogger; -import org.slf4j.Logger; + +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.TRACE; final class DSpiLogger implements SpiLogger { - private final Logger logger; + private final System.Logger logger; - DSpiLogger(Logger logger) { + DSpiLogger(System.Logger logger) { this.logger = logger; } @Override public boolean isDebug() { - return logger.isDebugEnabled(); + return logger.isLoggable(DEBUG); } @Override public boolean isTrace() { - return logger.isTraceEnabled(); + return logger.isLoggable(TRACE); } @Override public void debug(String msg) { - logger.debug(msg); + logger.log(DEBUG, msg); } @Override public void trace(String msg) { - logger.trace(msg); + logger.log(TRACE, msg); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java index 7b3e74085..ddd1747a1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java @@ -12,6 +12,8 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import static java.lang.System.Logger.Level.WARNING; + /** * A batched statement that is held in BatchedPstmtHolder. It has a list of * BatchPostExecute which it will process after the statement is executed. @@ -135,7 +137,7 @@ public final class BatchedPstmt implements SpiProfileTransactionEvent { try { pstmt.close(); } catch (SQLException e) { - CoreLog.log.warn("BatchedPstmt Error closing statement", e); + CoreLog.log.log(WARNING, "BatchedPstmt Error closing statement", e); } finally { pstmt = null; } @@ -201,7 +203,7 @@ public final class BatchedPstmt implements SpiProfileTransactionEvent { try { inputStream.close(); } catch (IOException e) { - CoreLog.log.warn("BatchedPstmt Error closing inputStream ", e); + CoreLog.log.log(WARNING, "BatchedPstmt Error closing inputStream ", e); } } inputStreams = null; 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 ca81e4ac8..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 @@ -2,11 +2,13 @@ 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; import io.ebeaninternal.api.SpiLogManager; import io.ebeaninternal.server.core.timezone.DataTimeZone; +import io.ebeaninternal.server.bind.DataBind; import io.ebeaninternal.server.expression.platform.DbExpressionHandler; import io.ebeaninternal.server.persist.platform.MultiValueBind; import io.ebeaninternal.server.type.*; @@ -17,6 +19,8 @@ import java.sql.*; import java.util.Collection; import java.util.List; +import static java.lang.System.Logger.Level.WARNING; + /** * Binds bean values to a PreparedStatement. */ @@ -34,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; @@ -132,7 +136,7 @@ public final class Binder { } } catch (SQLException ex) { - CoreLog.log.warn("error binding parameter [{}][{}]", (dataBind.currentPos() - 1), value); + CoreLog.log.log(WARNING, "error binding parameter [{0}][{1}]", (dataBind.currentPos() - 1), value); throw ex; } } @@ -143,14 +147,14 @@ public final class Binder { public boolean isMultiValueSupported(Class cls) { try { ScalarType scalarType = getScalarType(cls); - return multiValueBind.isTypeSupported(scalarType.getJdbcType()); + return multiValueBind.isTypeSupported(scalarType.jdbcType()); } catch (PersistenceException e) { return false; } } 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); } @@ -160,30 +164,27 @@ public final class Binder { /** * Bind an Object with unknown data type. */ - public Object bindObject(DataBind dataBind, Object value) throws SQLException { + public void bindObject(DataBind dataBind, Object value) throws SQLException { if (value == null) { // null of unknown type bindObject(dataBind, null, Types.OTHER); - return null; } else if (value instanceof MultiValueWrapper) { MultiValueWrapper wrapper = (MultiValueWrapper) value; Collection values = wrapper.getValues(); ScalarType type = getScalarType(wrapper.getType()); - int dbType = type.getJdbcType(); + int dbType = type.jdbcType(); // let the multiValueBind decide what to do with the value multiValueBind.bindMultiValues(dataBind, values, type, one -> bindObject(dataBind, one, dbType)); - return values; } else { ScalarType type = getScalarType(value.getClass()); - if (!type.isJdbcNative()) { + if (!type.jdbcNative()) { // convert to a JDBC native type value = type.toJdbcType(value); } - bindObject(dataBind, value, type.getJdbcType()); - return value; + bindObject(dataBind, value, type.jdbcType()); } } @@ -337,9 +338,7 @@ public final class Binder { if (data != null) { dataClass = data.getClass().getName(); } - String m = "Error with property[" + b.currentPos() + "] dt[" + dataType + "]"; - m += "data[" + data + "][" + dataClass + "]"; - throw new PersistenceException(m, e); + throw new PersistenceException("Error with property:" + b.currentPos() + " dt:" + dataType + " data:" + data + " " + dataClass, e); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index 1f6b18df5..f78e11ea8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.persist; +import io.avaje.applog.AppLog; import io.ebean.*; import io.ebean.bean.BeanCollection; import io.ebean.bean.BeanCollection.ModifyListenMode; @@ -11,13 +12,13 @@ import io.ebeaninternal.api.*; import io.ebeaninternal.server.core.*; import io.ebeaninternal.server.core.PersistRequest.Type; import io.ebeaninternal.server.deploy.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.persistence.PersistenceException; import java.sql.SQLException; import java.util.*; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.TRACE; + /** * Persister implementation using DML. *

@@ -34,8 +35,8 @@ import java.util.*; */ public final class DefaultPersister implements Persister { - private static final Logger PUB = LoggerFactory.getLogger("io.ebean.PUB"); - private static final Logger log = CoreLog.internal; + private static final System.Logger PUB = AppLog.getLogger("io.ebean.PUB"); + private static final System.Logger log = CoreLog.internal; /** * Actually does the persisting work. @@ -49,7 +50,7 @@ public final class DefaultPersister implements Persister { this.server = server; this.beanDescriptorManager = descMgr; this.persistExecute = new DefaultPersistExecute(binder, server.config().getPersistBatchSize()); - this.maxInBinding = server.databasePlatform().getMaxInBinding(); + this.maxInBinding = server.databasePlatform().maxInBinding(); } @Override @@ -144,7 +145,7 @@ public final class DefaultPersister implements Persister { DraftHandler draftHandler = new DraftHandler<>(desc, transaction); List liveBeans = draftHandler.fetchSourceBeans(query, false); - PUB.debug("draftRestore [{}] count[{}]", desc.name(), liveBeans.size()); + PUB.log(DEBUG, "draftRestore [{0}] count[{1}]", desc.name(), liveBeans.size()); if (liveBeans.isEmpty()) { return Collections.emptyList(); } @@ -157,11 +158,11 @@ public final class DefaultPersister implements Persister { // reset @DraftDirty and @DraftReset properties draftHandler.resetDraft(draftBean); - PUB.trace("draftRestore bean [{}] id[{}]", desc.name(), draftHandler.getId()); + PUB.log(TRACE, "draftRestore bean [{0}] id[{1}]", desc.name(), draftHandler.getId()); update(createRequest(draftBean, transaction, null, mgr, Type.UPDATE, Flags.RECURSE)); } - PUB.debug("draftRestore - complete for [{}]", desc.name()); + PUB.log(DEBUG, "draftRestore - complete for [{0}]", desc.name()); return draftHandler.getDrafts(); } @@ -186,7 +187,7 @@ public final class DefaultPersister implements Persister { DraftHandler draftHandler = new DraftHandler<>(desc, transaction); List draftBeans = draftHandler.fetchSourceBeans(query, true); - PUB.debug("publish [{}] count[{}]", desc.name(), draftBeans.size()); + PUB.log(DEBUG, "publish [{0}] count[{1}]", desc.name(), draftBeans.size()); if (draftBeans.isEmpty()) { return Collections.emptyList(); } @@ -203,7 +204,7 @@ public final class DefaultPersister implements Persister { draftHandler.resetDraft(draftBean); Type persistType = draftHandler.isInsert() ? Type.INSERT : Type.UPDATE; - PUB.trace("publish bean [{}] id[{}] type[{}]", desc.name(), draftHandler.getId(), persistType); + PUB.log(TRACE, "publish bean [{0}] id[{1}] type[{2}]", desc.name(), draftHandler.getId(), persistType); PersistRequestBean request = createRequest(liveBean, transaction, null, mgr, persistType, Flags.PUBLISH_RECURSE); if (persistType == Type.INSERT) { @@ -215,7 +216,7 @@ public final class DefaultPersister implements Persister { } draftHandler.updateDrafts(transaction, mgr); - PUB.debug("publish - complete for [{}]", desc.name()); + PUB.log(DEBUG, "publish - complete for [{0}]", desc.name()); return livePublish; } @@ -271,7 +272,7 @@ public final class DefaultPersister implements Persister { void updateDrafts(Transaction transaction, BeanManager mgr) { if (!draftUpdates.isEmpty()) { // update the dirty status on the drafts that have been published - PUB.debug("publish - update dirty status on [{}] drafts", draftUpdates.size()); + PUB.log(DEBUG, "publish - update dirty status on [{0}] drafts", draftUpdates.size()); for (T draftUpdate : draftUpdates) { update(createRequest(draftUpdate, transaction, null, mgr, Type.UPDATE, Flags.ZERO)); } @@ -492,8 +493,8 @@ public final class DefaultPersister implements Persister { } if (request.isDirty()) { request.executeOrQueue(); - } else if (log.isDebugEnabled()) { - log.debug("Update skipped as bean is unchanged: {}", request.bean()); + } else if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "Update skipped as bean is unchanged: {0}", request.bean()); } if (request.isPersistCascade()) { // save all the beans in assocMany's after @@ -539,8 +540,8 @@ public final class DefaultPersister implements Persister { if (req.isRegisteredForDeleteBean()) { // skip deleting bean. Used where cascade is on // both sides of a relationship - if (log.isDebugEnabled()) { - log.debug("skipping delete on alreadyRegistered {}", req.bean()); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "skipping delete on alreadyRegistered {0}", req.bean()); } return 0; } @@ -867,7 +868,7 @@ public final class DefaultPersister implements Persister { for (BeanPropertyAssocOne prop : desc.propertiesOneExportedSave()) { // check for partial beans if (request.isLoadedProperty(prop)) { - EntityBean detailBean = prop.getValueAsEntityBean(parentBean); + EntityBean detailBean = prop.valueAsEntityBean(parentBean); if (detailBean != null) { if (!prop.isSaveRecurseSkippable(detailBean)) { t.depth(+1); @@ -1056,7 +1057,7 @@ public final class DefaultPersister implements Persister { request.setImportedOrphanForRemoval(prop); } if (request.isLoadedProperty(prop)) { - EntityBean detailBean = prop.getValueAsEntityBean(request.entityBean()); + EntityBean detailBean = prop.valueAsEntityBean(request.entityBean()); if (detailBean != null && !prop.isSaveRecurseSkippable(detailBean) && !prop.isReference(detailBean) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBase.java index be42d42c2..b01d685a3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBase.java @@ -10,6 +10,8 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; import java.io.IOException; +import static java.lang.System.Logger.Level.ERROR; + /** * Base for saving entity bean collections and element collections. */ @@ -71,7 +73,7 @@ abstract class SaveManyBase implements SaveMany { String asJson = many.jsonWriteCollection(value); request.addCollectionChange(many.name(), asJson); } catch (IOException e) { - CoreLog.log.error("Error build element collection entry for L2 cache", e); + CoreLog.log.log(ERROR, "Error build element collection entry for L2 cache", e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java index 7b7c2d970..5b6858e78 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java @@ -318,7 +318,7 @@ final class SaveManyBeans extends SaveManyBase { if (transaction.isLogSummary()) { transaction.logSummary(m); } - CoreLog.log.warn(m); + CoreLog.log.log(System.Logger.Level.WARNING, m); } else { if (!many.hasImportedId(otherBean)) { throw new PersistenceException("ManyToMany bean " + otherBean + " does not have an Id value."); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersister.java index 043f210aa..4a4abe17d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersister.java @@ -70,7 +70,7 @@ final class DmlBeanPersister implements BeanPersister { } } catch (SQLException e) { // log the error to the transaction log - String msg = "Error[" + StringHelper.removeNewLines(e.getMessage()) + "]"; + String msg = "Error: " + StringHelper.removeNewLines(e.getMessage()); if (request.transaction().isLogSummary()) { request.transaction().logSummary(msg); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java index 7b82e7faa..58ec931fc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlHandler.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.persist.BatchedPstmt; import io.ebeaninternal.server.persist.BatchedPstmtHolder; import io.ebeaninternal.server.persist.dmlbind.BindableRequest; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import io.ebeaninternal.server.util.Str; import javax.persistence.OptimisticLockException; @@ -15,6 +15,8 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +import static java.lang.System.Logger.Level.ERROR; + /** * Base class for Handler implementations. */ @@ -99,7 +101,7 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { persistRequest.postExecute(); } catch (OptimisticLockException e) { // add the SQL and bind values to error message - String m = e.getMessage() + " sql[" + sql + "] bind[" + bindLog + "]"; + final String m = e.getMessage() + " sql[" + sql + "] bind[" + bindLog + "]"; persistRequest.transaction().logSummary("OptimisticLockException:" + m); throw new OptimisticLockException(m, null, e.getEntity()); } @@ -123,7 +125,7 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { dataBind.close(); } } catch (SQLException ex) { - CoreLog.log.error(null, ex); + CoreLog.log.log(ERROR, "Error closing DataBind", ex); } } @@ -215,6 +217,8 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { } if (prop.isLob()) { bindLog.append("[LOB]"); + } else if (value == null && !prop.isNullable() && prop.isArrayType()) { + bindLog.append("[]"); // null bound as empty array } else { String sv = String.valueOf(value); if (sv.length() > 50) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java index e3a89d1fa..1e59a193c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertMeta.java @@ -38,7 +38,7 @@ final class InsertMeta { private final Platform platform; InsertMeta(DatabasePlatform dbPlatform, BeanDescriptor desc, Bindable shadowFKey, BindableId id, BindableList all) { - this.platform = dbPlatform.getPlatform(); + this.platform = dbPlatform.platform(); this.discriminator = getDiscriminator(desc); this.id = id; this.all = all; @@ -69,7 +69,7 @@ final class InsertMeta { this.supportsSelectLastInsertedId = false; } else { this.identityDbColumns = new String[]{id.getIdentityColumn()}; - this.supportsGetGeneratedKeys = dbPlatform.getDbIdentity().isSupportsGetGeneratedKeys(); + this.supportsGetGeneratedKeys = dbPlatform.dbIdentity().isSupportsGetGeneratedKeys(); this.supportsSelectLastInsertedId = desc.supportsSelectLastInsertedId(); } this.sqlNullId = genSql(true, tableName, false); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/MetaFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/MetaFactory.java index 9819aaf77..28d43f6db 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/MetaFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/MetaFactory.java @@ -40,7 +40,7 @@ final class MetaFactory { MetaFactory(DatabasePlatform dbPlatform) { this.dbPlatform = dbPlatform; // to bind encryption data before or after the encryption key - DbEncrypt dbEncrypt = dbPlatform.getDbEncrypt(); + DbEncrypt dbEncrypt = dbPlatform.dbEncrypt(); boolean bindEncryptDataFirst = dbEncrypt == null || dbEncrypt.isBindEncryptDataFirst(); this.baseFact = new FactoryBaseProperties(bindEncryptDataFirst); this.embeddedFact = new FactoryEmbedded(bindEncryptDataFirst); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/AbstractMultiValueBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/AbstractMultiValueBind.java index 2c2ed1645..18d41b757 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/AbstractMultiValueBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/AbstractMultiValueBind.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.persist.platform; import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebean.core.type.ScalarType; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.sql.SQLException; import java.util.Collection; @@ -44,7 +44,7 @@ abstract class AbstractMultiValueBind extends MultiValueBind { @Override public void bindMultiValues(DataBind dataBind, Collection values, ScalarType type, BindOne bindOne) throws SQLException { - String arrayType = getArrayType(type.getJdbcType()); + String arrayType = getArrayType(type.jdbcType()); if (arrayType == null) { super.bindMultiValues(dataBind, values, type, bindOne); } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java index 1a15b8438..db47defcf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.persist.platform; import io.ebean.core.type.ScalarType; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.sql.SQLException; import java.util.Collection; @@ -44,7 +44,7 @@ public class MultiValueBind { */ public void bindMultiValues(DataBind dataBind, Collection values, ScalarType type, BindOne bindOne) throws SQLException { for (Object value : values) { - if (!type.isJdbcNative()) { + if (!type.jdbcNative()) { value = type.toJdbcType(value); } bindOne.bind(value); @@ -60,9 +60,7 @@ public class MultiValueBind { sb.append(" not"); } sb.append(" in (?"); - for (int i = 1; i < size; i++) { - sb.append(",?"); - } + sb.append(",?".repeat(Math.max(0, size - 1))); sb.append(")"); return sb.toString(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java index f7d86f55e..fa2cbb767 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java @@ -10,7 +10,7 @@ public final class PostgresMultiValueBind extends AbstractMultiValueBind { @Override public String getInExpression(boolean not, ScalarType type, int size) { - int dbType = type.getJdbcType(); + int dbType = type.jdbcType(); if (dbType == ExtraDbTypes.UUID) { return (not) ? " != all(?::uuid[])" : " = any(?::uuid[])"; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java index d153c359a..6fc84bfb5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -25,6 +25,8 @@ import java.sql.SQLException; import java.util.*; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.ERROR; + /** * An object that represents a SqlSelect statement. *

@@ -188,13 +190,13 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi this.autoTuneProfiling = profilingListener != null; // set the generated sql back to the query // so its available to the user... - query.setGeneratedSql(queryPlan.getSql()); - SqlTreePlan sqlTree = queryPlan.getSqlTree(); - this.rootNode = sqlTree.getRootNode(); - this.manyProperty = sqlTree.getManyProperty(); - this.sql = queryPlan.getSql(); + query.setGeneratedSql(queryPlan.sql()); + SqlTreePlan sqlTree = queryPlan.sqlTree(); + this.rootNode = sqlTree.rootNode(); + this.manyProperty = sqlTree.manyProperty(); + this.sql = queryPlan.sql(); this.rawSql = queryPlan.isRawSql(); - this.logWhereSql = queryPlan.getLogWhereSql(); + this.logWhereSql = queryPlan.logWhereSql(); this.desc = request.descriptor(); this.predicates = predicates; if (lazyLoadManyProperty != null) { @@ -243,20 +245,20 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi } @Override - public DataReader getDataReader() { + public DataReader dataReader() { return dataReader; } @Override - public Mode getQueryMode() { + public Mode queryMode() { return queryMode; } - public CQueryPredicates getPredicates() { + public CQueryPredicates predicates() { return predicates; } - SpiOrmQueryRequest getQueryRequest() { + SpiOrmQueryRequest request() { return request; } @@ -314,7 +316,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi if (forwardOnlyHint) { // Use forward only hints for large resultSet processing (Issue 56, MySql specific) pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - pstmt.setFetchSize(Integer.MIN_VALUE); + pstmt.setFetchSize(request.forwardOnlyFetchSize()); } else { pstmt = conn.prepareStatement(sql); } @@ -344,7 +346,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi auditIterateLogMessage(); } } catch (Throwable e) { - CoreLog.log.error("Error logging read audit logs", e); + CoreLog.log.log(ERROR, "Error logging read audit logs", e); } try { if (dataReader != null) { @@ -352,7 +354,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi dataReader = null; } } catch (SQLException e) { - CoreLog.log.error("Error closing dataReader", e); + CoreLog.log.log(ERROR, "Error closing dataReader", e); } JdbcClose.close(pstmt); pstmt = null; @@ -362,7 +364,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi * Return the persistence context. */ @Override - public PersistenceContext getPersistenceContext() { + public PersistenceContext persistenceContext() { return request.persistenceContext(); } @@ -371,7 +373,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi if (lazyLoadParentId != null) { if (!lazyLoadParentId.equals(this.lazyLoadParentId)) { // get the appropriate parent bean from the persistence context - this.lazyLoadParentBean = (EntityBean) lazyLoadManyProperty.descriptor().contextGet(getPersistenceContext(), lazyLoadParentId); + this.lazyLoadParentBean = (EntityBean) lazyLoadManyProperty.descriptor().contextGet(persistenceContext(), lazyLoadParentId); this.lazyLoadParentId = lazyLoadParentId; } // add the loadedBean to the appropriate collection of lazyLoadParentBean @@ -451,7 +453,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi return true; } - long getQueryExecutionTimeMicros() { + long queryExecutionTimeMicros() { return executionTimeMicros; } @@ -546,15 +548,15 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi if (queryPlan.executionTime(executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } - getTransaction().profileEvent(this); + transaction().profileEvent(this); } catch (Exception e) { - CoreLog.log.error("Error updating execution statistics", e); + CoreLog.log.log(ERROR, "Error updating execution statistics", e); } } @Override public void profile() { - getTransaction() + transaction() .profileStream() .addQueryEvent(query.profileEventId(), profileOffset, desc.name(), loadedBeanCount, query.getProfileId()); } @@ -567,7 +569,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi } } - String getLoadedRowDetail() { + String loadedRowDetail() { if (manyProperty == null) { return String.valueOf(rowCount); } else { @@ -601,30 +603,29 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi /** * Return the where predicate for display in the transaction log. */ - String getLogWhereSql() { + String logWhereSql() { return logWhereSql; } - - public String getBindLog() { + public String bindLog() { return bindLog; } - public SpiTransaction getTransaction() { + public SpiTransaction transaction() { return request.transaction(); } /** * Return the short bean name. */ - String getBeanName() { + String beanName() { return desc.name(); } /** * Return the generated sql. */ - public String getGeneratedSql() { + public String generatedSql() { return sql; } @@ -676,7 +677,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi void auditFind(EntityBean bean) { if (bean != null) { // only audit when a bean was actually found - desc.readAuditBean(queryPlan.getAuditQueryKey(), bindLog, bean); + desc.readAuditBean(queryPlan.auditQueryKey(), bindLog, bean); } } @@ -689,11 +690,11 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi ReadEvent futureReadEvent = query.getFutureFetchAudit(); if (futureReadEvent == null) { // normal query execution - desc.readAuditMany(queryPlan.getAuditQueryKey(), bindLog, auditIds); + desc.readAuditMany(queryPlan.auditQueryKey(), bindLog, auditIds); } else { // this query was executed via findFutureList() and the prepare() // has already been called so set the details and log - futureReadEvent.setQueryKey(queryPlan.getAuditQueryKey()); + futureReadEvent.setQueryKey(queryPlan.auditQueryKey()); futureReadEvent.setBindLog(bindLog); futureReadEvent.setIds(auditIds); desc.readAuditFutureMany(futureReadEvent); @@ -712,7 +713,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi * Send the current buffer of findIterate collected ids to the audit log. */ private void auditIterateLogMessage() { - desc.readAuditMany(queryPlan.getAuditQueryKey(), bindLog, auditIds); + desc.readAuditMany(queryPlan.auditQueryKey(), bindLog, auditIds); // create a new list on demand with the next bean/id auditIds = null; } @@ -733,7 +734,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi /** * Return the underlying PreparedStatement. */ - PreparedStatement getPstmt() { + PreparedStatement pstmt() { return pstmt; } @@ -742,7 +743,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi query.handleLoadError(fullName, e); } - public Set getDependentTables() { - return queryPlan.getDependentTables(); + public Set dependentTables() { + return queryPlan.dependentTables(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java index 559dfa0da..4c72f053e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryBindCapture; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.util.concurrent.locks.ReentrantLock; @@ -62,14 +62,14 @@ final class CQueryBindCapture implements SpiQueryBindCapture { * Collect the query plan using already captured bind values. */ public boolean collectQueryPlan(CQueryPlanRequest request) { - if (bindCapture == null || request.getSince() < lastBindCapture) { + if (bindCapture == null || request.since() < lastBindCapture) { // no bind capture since the last capture return false; } final BindCapture last = this.bindCapture; - SpiDbQueryPlan queryPlan = manager.collectPlan(request.getConnection(), this.queryPlan, last); + SpiDbQueryPlan queryPlan = manager.collectPlan(request.connection(), this.queryPlan, last); if (queryPlan != null) { request.add(queryPlan.with(queryTimeMicros, captureCount)); // effectively turn off bind capture for this plan diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 3ced1ac0b..acb3e1708 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -36,6 +36,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import static java.util.Objects.requireNonNullElse; + /** * Generates the SQL SELECT statements taking into account the physical * deployment properties. @@ -60,11 +62,11 @@ final class CQueryBuilder { this.binder = binder; this.draftSupport = draftSupport; this.historySupport = historySupport; - this.columnAliasPrefix = dbPlatform.getColumnAliasPrefix(); - this.sqlLimiter = dbPlatform.getSqlLimiter(); + this.columnAliasPrefix = dbPlatform.columnAliasPrefix(); + this.sqlLimiter = dbPlatform.sqlLimiter(); this.rawSqlHandler = new CQueryBuilderRawSql(sqlLimiter, dbPlatform); - this.selectCountWithAlias = dbPlatform.isSelectCountWithAlias(); - this.selectCountWithColumnAlias = dbPlatform.isSelectCountWithColumnAlias(); + this.selectCountWithAlias = dbPlatform.selectCountWithAlias(); + this.selectCountWithColumnAlias = dbPlatform.selectCountWithColumnAlias(); } /** @@ -110,7 +112,7 @@ final class CQueryBuilder { sql = buildUpdateSql(request, rootTableAlias, predicates, sqlTree); } // cache the query plan - queryPlan = new CQueryPlan(request, sql, sqlTree.plan(), predicates.getLogWhereSql()); + queryPlan = new CQueryPlan(request, sql, sqlTree.plan(), predicates.logWhereSql()); request.putQueryPlan(queryPlan); return new CQueryUpdate(request, predicates, queryPlan); } @@ -118,10 +120,10 @@ final class CQueryBuilder { private String buildDeleteSql(OrmQueryRequest request, String rootTableAlias, CQueryPredicates predicates, SqlTree sqlTree) { String alias = alias(rootTableAlias); if (sqlTree.noJoins() && !request.query().hasMaxRowsOrFirstRow()) { - if (dbPlatform.isSupportsDeleteTableAlias()) { + if (dbPlatform.supportsDeleteTableAlias()) { // delete from table ... return aliasReplace(buildSqlDelete("delete", request, predicates, sqlTree).getSql(), alias); - } else if (isMySql(dbPlatform.getPlatform())) { + } else if (isMySql(dbPlatform.platform())) { return aliasReplace(buildSqlDelete("delete " + alias, request, predicates, sqlTree).getSql(), alias); } else { // simple - delete from table ... @@ -149,7 +151,7 @@ final class CQueryBuilder { if (rootTableAlias != null) { sb.append(" ").append(rootTableAlias); } - sb.append(" set ").append(predicates.getDbUpdateClause()); + sb.append(" set ").append(predicates.dbUpdateClause()); String updateClause = sb.toString(); if (sqlTree.noJoins() && request.isInlineSqlUpdateLimit()) { // simple - update table set ... where ... @@ -196,7 +198,7 @@ final class CQueryBuilder { SqlTree sqlTree = createSqlTree(request, predicates); SqlLimitResponse s = buildSql(null, request, predicates, sqlTree); - queryPlan = new CQueryPlan(request, s.getSql(), sqlTree.plan(), predicates.getLogWhereSql()); + queryPlan = new CQueryPlan(request, s.getSql(), sqlTree.plan(), predicates.logWhereSql()); request.putQueryPlan(queryPlan); return new CQueryFetchSingleAttribute(request, predicates, queryPlan, query.isCountDistinct()); } @@ -217,14 +219,14 @@ final class CQueryBuilder { /** * Return the history support if this query needs it (is a 'as of' type query). */ - CQueryHistorySupport getHistorySupport(SpiQuery query) { + CQueryHistorySupport historySupport(SpiQuery query) { return query.getTemporalMode().isHistory() ? historySupport : null; } /** * Return the draft support (or null) for a 'asDraft' query. */ - CQueryDraftSupport getDraftSupport(SpiQuery query) { + CQueryDraftSupport draftSupport(SpiQuery query) { return query.getTemporalMode() == SpiQuery.TemporalMode.DRAFT ? draftSupport : null; } @@ -287,7 +289,7 @@ final class CQueryBuilder { } } // cache the query plan - queryPlan = new CQueryPlan(request, sql, sqlTree.plan(), predicates.getLogWhereSql()); + queryPlan = new CQueryPlan(request, sql, sqlTree.plan(), predicates.logWhereSql()); request.putQueryPlan(queryPlan); return new CQueryRowCount(queryPlan, request, predicates); } @@ -340,14 +342,14 @@ final class CQueryBuilder { SqlLimitResponse res = buildSql(null, request, predicates, sqlTree); boolean rawSql = request.isRawSql(); if (rawSql) { - queryPlan = new CQueryPlanRawSql(request, res, sqlTree, predicates.getLogWhereSql()); + queryPlan = new CQueryPlanRawSql(request, res, sqlTree, predicates.logWhereSql()); } else { - queryPlan = new CQueryPlan(request, res, sqlTree.plan(), false, predicates.getLogWhereSql()); + queryPlan = new CQueryPlan(request, res, sqlTree.plan(), false, predicates.logWhereSql()); } BeanDescriptor desc = request.descriptor(); if (desc.isReadAuditing()) { // log the query plan based bean type (i.e. ignoring query disabling for logging the sql/plan) - desc.readAuditLogger().queryPlan(new ReadAuditQueryPlan(desc.fullName(), queryPlan.getAuditQueryKey(), queryPlan.getSql())); + desc.readAuditLogger().queryPlan(new ReadAuditQueryPlan(desc.fullName(), queryPlan.auditQueryKey(), queryPlan.sql())); } // cache the query plan because we can reuse it and also // gather query performance statistics based on it. @@ -380,7 +382,7 @@ final class CQueryBuilder { } private String nativeQueryPaging(SpiQuery query, String sql) { - return dbPlatform.getBasicSqlLimiter().limit(sql, query.getFirstRow(), query.getMaxRows()); + return dbPlatform.basicSqlLimiter().limit(sql, query.getFirstRow(), query.getMaxRows()); } /** @@ -399,7 +401,7 @@ final class CQueryBuilder { try { // For SqlServer we need either "selectMethod=cursor" in the connection string or fetch explicitly a cursorable // statement here by specifying ResultSet.CONCUR_UPDATABLE - PreparedStatement statement = connection.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, dbPlatform.isSupportsResultSetConcurrencyModeUpdatable() ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY); + PreparedStatement statement = connection.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, dbPlatform.supportsResultSetConcurrencyModeUpdatable() ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY); predicates.bind(statement, connection); ResultSet resultSet = statement.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); @@ -411,11 +413,7 @@ final class CQueryBuilder { String tableName = lower(metaData.getTableName(i)); String columnName = lower(metaData.getColumnName(i)); String path = desc.findBeanPath(schemaName, tableName, columnName); - if (path != null) { - propertyNames.add(path); - } else { - propertyNames.add(SpiRawSql.IGNORE_COLUMN); - } + propertyNames.add(requireNonNullElse(path, SpiRawSql.IGNORE_COLUMN)); } RawSql rawSql = RawSqlBuilder.resultSet(resultSet, propertyNames.toArray(new String[0])); query.setRawSql(rawSql); @@ -482,8 +480,8 @@ final class CQueryBuilder { } else if (beanProperty.isDiscriminator()) { propertyName = SplitName.parent(propertyName); } else if (beanProperty instanceof BeanPropertyAssocOne) { - String msg = "Column [" + column.getDbColumn() + "] mapped to complex Property[" + propertyName + "]"; - msg += ". It should be mapped to a simple property (probably the Id property). "; + String msg = "Column " + column.getDbColumn() + " mapped to complex property " + propertyName + + ". It should be mapped to a simple property (probably the Id property)."; throw new PersistenceException(msg); } if (propertyName != null) { @@ -552,7 +550,7 @@ final class CQueryBuilder { this.select = select; this.updateStatement = updateStatement; this.distinct = query.isDistinct() || select.isSqlDistinct(); - this.dbOrderBy = predicates.getDbOrderBy(); + this.dbOrderBy = predicates.dbOrderBy(); this.countSingleAttribute = query.isCountDistinct() && query.isSingleAttribute(); } @@ -560,7 +558,7 @@ final class CQueryBuilder { if (selectClause != null) { sb.append(selectClause); } else { - useSqlLimiter = (query.hasMaxRowsOrFirstRow() && (select.getManyProperty() == null || query.isSingleAttribute())); + useSqlLimiter = (query.hasMaxRowsOrFirstRow() && (select.manyProperty() == null || query.isSingleAttribute())); if (!useSqlLimiter) { appendSelectDistinct(); } @@ -578,9 +576,9 @@ final class CQueryBuilder { sb.append("t0.").append(idProp.dbColumn()).append(", "); } } - sb.append(select.getSelectSql()).append(" as attribute_"); + sb.append(select.selectSql()).append(" as attribute_"); } else { - sb.append(select.getSelectSql()); + sb.append(select.selectSql()); } if (request.isInlineCountDistinct()) { sb.append(")"); @@ -590,7 +588,7 @@ final class CQueryBuilder { final OrderBy orderBy = query.getOrderBy(); if (orderBy != null && orderBy.supportsSelect()) { String trimmed = DbOrderByTrim.trim(dbOrderBy); - if (query.isSingleAttribute() && select.getSelectSql().startsWith(trimmed)) { + if (query.isSingleAttribute() && select.selectSql().startsWith(trimmed)) { // NOP, already in SQL // TODO: what to do if we select("id").orderBy("prop,id")? // Can we live with a query like "select t0.id, t0.prop, t0.id from" @@ -610,7 +608,7 @@ final class CQueryBuilder { sb.append("count("); } sb.append("distinct "); - String distinctOn = select.getDistinctOn(); + String distinctOn = select.distinctOn(); if (distinctOn != null) { sb.append("on (").append(distinctOn).append(") "); } @@ -620,7 +618,7 @@ final class CQueryBuilder { private void appendFrom() { if (selectClause == null || !selectClause.startsWith("update")) { sb.append(" from "); - sb.append(select.getFromSql()); + sb.append(select.fromSql()); } } @@ -634,7 +632,7 @@ final class CQueryBuilder { } private void appendInheritanceWhere() { - String inheritanceWhere = select.getInheritanceWhereSql(); + String inheritanceWhere = select.inheritanceWhereSql(); if (!inheritanceWhere.isEmpty()) { sb.append(" where"); sb.append(inheritanceWhere); @@ -647,7 +645,7 @@ final class CQueryBuilder { query.incrementAsOfTableCount(); if (!historySupport.isStandardsBased()){ appendAndOrWhere(); - sb.append(historySupport.getAsOfPredicate(request.baseTableAlias())); + sb.append(historySupport.asOfPredicate(request.baseTableAlias())); } } } @@ -696,16 +694,16 @@ final class CQueryBuilder { appendInheritanceWhere(); appendHistoryAsOfPredicate(); appendFindId(); - appendToWhere(predicates.getDbWhere()); - appendToWhere(predicates.getDbFilterMany()); + appendToWhere(predicates.dbWhere()); + appendToWhere(predicates.dbFilterMany()); if (!query.isIncludeSoftDeletes()) { appendSoftDelete(); } - String groupBy = select.getGroupBy(); + String groupBy = select.groupBy(); if (groupBy != null) { sb.append(" group by ").append(groupBy); } - String dbHaving = predicates.getDbHaving(); + String dbHaving = predicates.dbHaving(); if (hasValue(dbHaving)) { sb.append(" having ").append(dbHaving); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java index c9373724b..290b706c2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java @@ -25,12 +25,10 @@ final class CQueryBuilderRawSql { * Build the full SQL Select statement for the request. */ SqlLimitResponse buildSql(OrmQueryRequest request, CQueryPredicates predicates, SpiRawSql.Sql rsql) { - if (rsql == null) { // this is a ResultSet based RawSql query - just use some placeholder for the SQL return new SqlLimitResponse(CQueryPlan.RESULT_SET_BASED_RAW_SQL); } - if (!rsql.isParsed()) { String sql = rsql.getUnparsedSql(); BindParams bindParams = request.query().getBindParams(); @@ -41,16 +39,13 @@ final class CQueryBuilderRawSql { return new SqlLimitResponse(sql); } - String orderBy = getOrderBy(predicates, rsql); - + String orderBy = orderBy(predicates, rsql); // build the actual sql String String sql = buildMainQuery(orderBy, request, predicates, rsql); - SpiQuery query = request.query(); if (query.hasMaxRowsOrFirstRow() && sqlLimiter != null) { // wrap with a limit offset or ROW_NUMBER() etc return sqlLimiter.limit(new OrmQueryLimitRequest(sql, orderBy, query, dbPlatform, rsql.isDistinct() || query.isDistinct())); - } else { // add back select keyword (it was removed to support sqlQueryLimiter) String prefix = "select " + (rsql.isDistinct() ? "distinct " : ""); @@ -86,7 +81,7 @@ final class CQueryBuilderRawSql { dynamicWhere = descriptor.idBinderIdSql(null); } - String dbWhere = predicates.getDbWhere(); + String dbWhere = predicates.dbWhere(); if (hasValue(dbWhere)) { if (dynamicWhere == null) { dynamicWhere = dbWhere; @@ -109,7 +104,7 @@ final class CQueryBuilderRawSql { sb.append(preHaving).append(" "); } - String dbHaving = predicates.getDbHaving(); + String dbHaving = predicates.dbHaving(); if (hasValue(dbHaving)) { if (sql.isAndHavingExpr()) { sb.append(" and "); @@ -128,8 +123,8 @@ final class CQueryBuilderRawSql { return s != null && !s.isEmpty(); } - private String getOrderBy(CQueryPredicates predicates, SpiRawSql.Sql sql) { - String orderBy = predicates.getDbOrderBy(); + private String orderBy(CQueryPredicates predicates, SpiRawSql.Sql sql) { + String orderBy = predicates.dbOrderBy(); if (orderBy != null) { return orderBy; } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java index 771ff8145..c02b25ba6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java @@ -22,7 +22,7 @@ final class CQueryDraftSupport { * This returns null for entities that are not draftable and in that case * the usual base table is used. */ - String getDraftTable(String table) { + String draftTable(String table) { return tableMap.get(table); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index 416da3c31..4a2686f16 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.query; import io.ebean.QueryIterator; import io.ebean.ValuePair; import io.ebean.Version; +import io.ebean.annotation.Platform; import io.ebean.bean.BeanCollection; import io.ebean.bean.EntityBean; import io.ebean.bean.ObjectGraphNode; @@ -10,16 +11,14 @@ import io.ebean.config.DatabaseConfig; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.util.JdbcClose; import io.ebean.util.StringHelper; -import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.core.DiffHelp; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.deploy.BeanDescriptor; -import io.ebeaninternal.server.util.Str; import io.ebeaninternal.server.persist.Binder; -import org.slf4j.Logger; +import io.ebeaninternal.server.util.Str; import javax.persistence.PersistenceException; import java.sql.ResultSet; @@ -31,31 +30,29 @@ import java.util.*; */ public final class CQueryEngine { - private static final Logger log = CoreLog.log; - private static final String T0 = "t0"; private final int defaultFetchSizeFindList; - private final int defaultFetchSizeFindEach; - private final boolean forwardOnlyHintOnFindIterate; - private final CQueryBuilder queryBuilder; - private final CQueryHistorySupport historySupport; - private final DatabasePlatform dbPlatform; public CQueryEngine(DatabaseConfig config, DatabasePlatform dbPlatform, Binder binder, Map asOfTableMapping, Map draftTableMap) { this.dbPlatform = dbPlatform; this.defaultFetchSizeFindEach = config.getJdbcFetchSizeFindEach(); this.defaultFetchSizeFindList = config.getJdbcFetchSizeFindList(); - this.forwardOnlyHintOnFindIterate = dbPlatform.isForwardOnlyHintOnFindIterate(); - this.historySupport = new CQueryHistorySupport(dbPlatform.getHistorySupport(), asOfTableMapping, config.getAsOfSysPeriod()); + this.forwardOnlyHintOnFindIterate = dbPlatform.forwardOnlyHintOnFindIterate(); + this.historySupport = new CQueryHistorySupport(dbPlatform.historySupport(), asOfTableMapping, config.getAsOfSysPeriod()); this.queryBuilder = new CQueryBuilder(dbPlatform, binder, historySupport, new CQueryDraftSupport(draftTableMap)); } + public int forwardOnlyFetchSize() { + Platform base = dbPlatform.platform().base(); + return Platform.MYSQL == base ? Integer.MIN_VALUE : 1; + } + public CQuery buildQuery(OrmQueryRequest request) { return queryBuilder.buildQuery(request); } @@ -76,11 +73,11 @@ public final class CQueryEngine { try { int rows = query.execute(); if (request.logSql()) { - request.logSql(Str.add(query.getGeneratedSql(), "; --bind(", query.getBindLog(), ") --micros(", query.micros() + ") --rows(", rows + ")")); + request.logSql(Str.add(query.generatedSql(), "; --bind(", query.bindLog(), ") --micros(", query.micros() + ") --rows(", rows + ")")); } return rows; } catch (SQLException e) { - throw translate(request, query.getBindLog(), query.getGeneratedSql(), e); + throw translate(request, query.bindLog(), query.generatedSql(), e); } } @@ -98,13 +95,13 @@ public final class CQueryEngine { try { rcQuery.findCollection(collection); if (request.logSql()) { - logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog(), rcQuery.micros()); + logGeneratedSql(request, rcQuery.generatedSql(), rcQuery.bindLog(), rcQuery.micros()); } if (request.logSummary()) { - request.transaction().logSummary(rcQuery.getSummary()); + request.transaction().logSummary(rcQuery.summary()); } if (request.isQueryCachePut()) { - request.addDependentTables(rcQuery.getDependentTables()); + request.addDependentTables(rcQuery.dependentTables()); if (collection instanceof List) { collection = (A) Collections.unmodifiableList((List) collection); request.putToQueryCache(collection); @@ -121,7 +118,7 @@ public final class CQueryEngine { } return collection; } catch (SQLException e) { - throw translate(request, rcQuery.getBindLog(), rcQuery.getGeneratedSql(), e); + throw translate(request, rcQuery.bindLog(), rcQuery.generatedSql(), e); } } @@ -132,14 +129,12 @@ public final class CQueryEngine { SpiTransaction t = request.transaction(); if (t.isLogSummary()) { // log the error to the transaction log - String msg = "ERROR executing query, bindLog[" + bindLog + "] error[" + StringHelper.removeNewLines(e.getMessage()) + "]"; - t.logSummary(msg); + t.logSummary("ERROR executing query, bindLog[" + bindLog + "] error:" + StringHelper.removeNewLines(e.getMessage())); } // ensure 'rollback' is logged if queryOnly transaction t.connection(); // build a decent error message for the exception - String m = "Query threw SQLException:" + e.getMessage() + " Bind values:[" + bindLog + "] Query was:" + sql; - return dbPlatform.translate(m, e); + return dbPlatform.translate("Query threw SQLException:" + e.getMessage() + " Bind values:[" + bindLog + "] Query was:" + sql, e); } /** @@ -164,21 +159,21 @@ public final class CQueryEngine { try { int count = rcQuery.findCount(); if (request.logSql()) { - logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog(), rcQuery.micros()); + logGeneratedSql(request, rcQuery.generatedSql(), rcQuery.bindLog(), rcQuery.micros()); } if (request.logSummary()) { - request.transaction().logSummary(rcQuery.getSummary()); + request.transaction().logSummary(rcQuery.summary()); } if (request.query().isFutureFetch()) { request.transaction().end(); } if (request.isQueryCachePut()) { - request.addDependentTables(rcQuery.getDependentTables()); + request.addDependentTables(rcQuery.dependentTables()); request.putToQueryCache(count); } return count; } catch (SQLException e) { - throw translate(request, rcQuery.getBindLog(), rcQuery.getGeneratedSql(), e); + throw translate(request, rcQuery.bindLog(), rcQuery.generatedSql(), e); } } @@ -195,7 +190,6 @@ public final class CQueryEngine { } if (!cquery.prepareBindExecuteQueryForwardOnly(forwardOnlyHintOnFindIterate)) { // query has been cancelled already - log.trace("Future fetch already cancelled"); return null; } if (request.logSql()) { @@ -271,9 +265,7 @@ public final class CQueryEngine { } catch (SQLException e) { throw cquery.createPersistenceException(e); } finally { - if (cquery != null) { - cquery.close(); - } + cquery.close(); } } @@ -299,11 +291,11 @@ public final class CQueryEngine { } private String getSysPeriodLower(SpiQuery query) { - return historySupport.getSysPeriodLower(query.getAlias(T0)); + return historySupport.sysPeriodLower(query.getAlias(T0)); } private String getSysPeriodUpper(SpiQuery query) { - return historySupport.getSysPeriodUpper(query.getAlias(T0)); + return historySupport.sysPeriodUpper(query.getAlias(T0)); } /** @@ -331,10 +323,10 @@ public final class CQueryEngine { if (request.logSql()) { logSql(cquery); } - return new SpiResultSet(cquery.getPstmt(), resultSet); + return new SpiResultSet(cquery.pstmt(), resultSet); } catch (SQLException e) { - JdbcClose.close(cquery.getPstmt()); + JdbcClose.close(cquery.pstmt()); throw cquery.createPersistenceException(e); } } @@ -351,7 +343,6 @@ public final class CQueryEngine { } if (!cquery.prepareBindExecuteQuery()) { // query has been cancelled already - log.trace("Future fetch already cancelled"); return null; } if (request.logSql()) { @@ -366,16 +357,14 @@ public final class CQueryEngine { } request.executeSecondaryQueries(false); if (request.isQueryCachePut()) { - request.addDependentTables(cquery.getDependentTables()); + request.addDependentTables(cquery.dependentTables()); } return beanCollection; } catch (SQLException e) { throw cquery.createPersistenceException(e); } finally { - if (cquery != null) { - cquery.close(); - } + cquery.close(); } } @@ -414,14 +403,14 @@ public final class CQueryEngine { * Log the generated SQL to the transaction log. */ private void logSql(CQuery query) { - query.getTransaction().logSql(Str.add(query.getGeneratedSql(), "; --bind(", query.getBindLog(), ") --micros(", query.micros() + ")")); + query.transaction().logSql(Str.add(query.generatedSql(), "; --bind(", query.bindLog(), ") --micros(", query.micros() + ")")); } /** * Log the FindById summary to the transaction log. */ private void logFindBeanSummary(CQuery q) { - SpiQuery query = q.getQueryRequest().query(); + SpiQuery query = q.request().query(); String loadMode = query.getLoadMode(); String loadDesc = query.getLoadDescription(); String lazyLoadProp = query.getLazyLoadProperty(); @@ -438,7 +427,7 @@ public final class CQueryEngine { if (loadMode != null) { msg.append("mode[").append(loadMode).append("] "); } - msg.append("type[").append(q.getBeanName()).append("] "); + msg.append("type[").append(q.beanName()).append("] "); if (query.isAutoTuned()) { msg.append("tuned[true] "); } @@ -454,17 +443,17 @@ public final class CQueryEngine { if (loadDesc != null) { msg.append("load[").append(loadDesc).append("] "); } - msg.append("exeMicros[").append(q.getQueryExecutionTimeMicros()); - msg.append("] rows[").append(q.getLoadedRowDetail()); - msg.append("] bind[").append(q.getBindLog()).append("]"); - q.getTransaction().logSummary(msg.toString()); + msg.append("exeMicros[").append(q.queryExecutionTimeMicros()); + msg.append("] rows[").append(q.loadedRowDetail()); + msg.append("] bind[").append(q.bindLog()).append("]"); + q.transaction().logSummary(msg.toString()); } /** * Log the FindMany to the transaction log. */ private void logFindManySummary(CQuery q) { - SpiQuery query = q.getQueryRequest().query(); + SpiQuery query = q.request().query(); String loadMode = query.getLoadMode(); String loadDesc = query.getLoadDescription(); String lazyLoadProp = query.getLazyLoadProperty(); @@ -482,7 +471,7 @@ public final class CQueryEngine { if (loadMode != null) { msg.append("mode[").append(loadMode).append("] "); } - msg.append("type[").append(q.getBeanName()).append("] "); + msg.append("type[").append(q.beanName()).append("] "); if (query.isAutoTuned()) { msg.append("tuned[true] "); } @@ -498,10 +487,10 @@ public final class CQueryEngine { if (loadDesc != null) { msg.append("load[").append(loadDesc).append("] "); } - msg.append("exeMicros[").append(q.getQueryExecutionTimeMicros()); - msg.append("] rows[").append(q.getLoadedRowDetail()); - msg.append("] predicates[").append(q.getLogWhereSql()); - msg.append("] bind[").append(q.getBindLog()).append("]"); - q.getTransaction().logSummary(msg.toString()); + msg.append("exeMicros[").append(q.queryExecutionTimeMicros()); + msg.append("] rows[").append(q.loadedRowDetail()); + msg.append("] predicates[").append(q.logWhereSql()); + msg.append("] bind[").append(q.bindLog()).append("]"); + q.transaction().logSummary(msg.toString()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java index 747793e85..78b20dc1c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java @@ -15,12 +15,12 @@ import io.ebeaninternal.server.type.RsetDataReader; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.ERROR; + /** * Base compiled query request for single attribute queries. */ @@ -49,23 +49,23 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca this.request = request; this.queryPlan = queryPlan; this.query = request.query(); - this.sql = queryPlan.getSql(); + this.sql = queryPlan.sql(); this.desc = request.descriptor(); this.predicates = predicates; this.containsCounts = containsCounts; - this.reader = queryPlan.getSingleAttributeScalarType(); + this.reader = queryPlan.singleAttributeScalarType(); query.setGeneratedSql(sql); } /** * Return a summary description of this query. */ - String getSummary() { + String summary() { StringBuilder sb = new StringBuilder(80); sb.append("FindAttr exeMicros[").append(executionTimeMicros) .append("] rows[").append(rowCount) .append("] type[").append(desc.name()) - .append("] predicates[").append(predicates.getLogWhereSql()) + .append("] predicates[").append(predicates.logWhereSql()) .append("] bind[").append(bindLog).append("]"); return sb.toString(); } @@ -77,6 +77,7 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca /** * Execute the query returning the row count. */ + @SuppressWarnings({"rawtypes", "unchecked"}) void findCollection(Collection result) throws SQLException { long startNano = System.nanoTime(); try { @@ -94,27 +95,27 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca if (queryPlan.executionTime(executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } - getTransaction().profileEvent(this); + transaction().profileEvent(this); } finally { close(); } } - private SpiTransaction getTransaction() { + private SpiTransaction transaction() { return request.transaction(); } /** * Return the bind log. */ - String getBindLog() { + String bindLog() { return bindLog; } /** * Return the generated sql. */ - String getGeneratedSql() { + String generatedSql() { return sql; } @@ -122,7 +123,7 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca lock.lock(); try { query.checkCancelled(); - SpiTransaction t = getTransaction(); + SpiTransaction t = transaction(); profileOffset = t.profileOffset(); Connection conn = t.getInternalConnection(); pstmt = conn.prepareStatement(sql); @@ -154,7 +155,7 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca dataReader = null; } } catch (SQLException e) { - CoreLog.log.error("Error closing DataReader", e); + CoreLog.log.log(ERROR, "Error closing DataReader", e); } JdbcClose.close(pstmt); pstmt = null; @@ -162,13 +163,13 @@ final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Ca @Override public void profile() { - getTransaction() + transaction() .profileStream() .addQueryEvent(query.profileEventId(), profileOffset, desc.name(), rowCount, query.getProfileId()); } - Set getDependentTables() { - return queryPlan.getDependentTables(); + Set dependentTables() { + return queryPlan.dependentTables(); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java index e082c97eb..aa05039a2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java @@ -40,30 +40,28 @@ final class CQueryHistorySupport { /** * Return the 'as of' history view for the given base table. */ - String getAsOfView(String table) { + String asOfView(String table) { return asOfTableMap.get(table); } /** * Return the lower bound column. */ - String getSysPeriodLower(String tableAlias) { + String sysPeriodLower(String tableAlias) { return dbHistorySupport.getSysPeriodLower(tableAlias, sysPeriod); } /** * Return the upper bound column. */ - String getSysPeriodUpper(String tableAlias) { + String sysPeriodUpper(String tableAlias) { return dbHistorySupport.getSysPeriodUpper(tableAlias, sysPeriod); } /** * Return the predicate appended to the end of the query. - *

- * Note used for Oracle total recall etc with the more standard approach. */ - String getAsOfPredicate(String tableAlias) { + String asOfPredicate(String tableAlias) { return dbHistorySupport.getAsOfPredicate(tableAlias, sysPeriod); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java index 1aa5fc7ef..8d9860a7b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java @@ -11,9 +11,7 @@ import java.sql.SQLException; final class CQueryIteratorSimple implements QueryIterator { private final CQuery cquery; - private final OrmQueryRequest request; - private boolean closed; CQueryIteratorSimple(CQuery cquery, OrmQueryRequest request) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java index 0f369fef8..cefdb59cf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java @@ -16,7 +16,6 @@ import java.util.List; final class CQueryOrderBy { private final BeanDescriptor desc; - private final OrderBy orderBy; /** @@ -32,9 +31,7 @@ final class CQueryOrderBy { } private String parseInternal() { - StringBuilder sb = new StringBuilder(); - List properties = orderBy.getProperties(); if (properties.isEmpty()) { // order by clause removed by filterMany() @@ -52,7 +49,6 @@ final class CQueryOrderBy { } private String parseProperty(Property p) { - String propName = p.getProperty(); ElPropertyValue el = desc.elGetValue(propName); if (el == null) { @@ -65,7 +61,6 @@ final class CQueryOrderBy { IdBinder idBinder = ap.targetDescriptor().idBinder(); return idBinder.getOrderBy(el.elName(), p.isAscending()); } - return p.toStringFormat(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index 5ce73fc62..ad52e4eca 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -11,8 +11,8 @@ import io.ebeaninternal.api.*; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.timezone.DataTimeZone; import io.ebeaninternal.server.query.CQueryPlanStats.Snapshot; -import io.ebeaninternal.server.type.DataBind; -import io.ebeaninternal.server.type.DataBindCapture; +import io.ebeaninternal.server.bind.DataBind; +import io.ebeaninternal.server.bind.DataBindCapture; import io.ebeaninternal.server.type.RsetDataReader; import io.ebeaninternal.server.util.Md5; import io.ebeaninternal.server.util.Str; @@ -23,6 +23,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Set; +import static java.lang.System.Logger.Level.ERROR; + /** * Represents a query for a given SQL statement. *

@@ -92,7 +94,7 @@ public class CQueryPlan implements SpiQueryPlan { this.sqlTree = sqlTree; this.rawSql = rawSql; this.logWhereSql = logWhereSql; - this.encryptedProps = sqlTree.getEncryptedProps(); + this.encryptedProps = sqlTree.encryptedProps(); this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCapture(query); @@ -117,7 +119,7 @@ public class CQueryPlan implements SpiQueryPlan { this.sqlTree = sqlTree; this.rawSql = false; this.logWhereSql = logWhereSql; - this.encryptedProps = sqlTree.getEncryptedProps(); + this.encryptedProps = sqlTree.encryptedProps(); this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCaptureRaw(sql, query); @@ -157,39 +159,39 @@ public class CQueryPlan implements SpiQueryPlan { } @Override - public final Class getBeanType() { + public final Class beanType() { return beanType; } @Override - public final String getName() { + public final String name() { return name; } @Override - public final String getHash() { + public final String hash() { return hash; } @Override - public final String getSql() { + public final String sql() { return sql; } @Override - public final ProfileLocation getProfileLocation() { + public final ProfileLocation profileLocation() { return profileLocation; } - public final String getLabel() { + public final String label() { return label; } - public final Set getDependentTables() { + public final Set dependentTables() { return dependentTables; } - public final String getLocation() { + public final String location() { return location; } @@ -200,7 +202,7 @@ public class CQueryPlan implements SpiQueryPlan { @Override public final DQueryPlanOutput createMeta(String bind, String planString) { - return new DQueryPlanOutput(getBeanType(), name, hash, sql, profileLocation, bind, planString); + return new DQueryPlanOutput(beanType(), name, hash, sql, profileLocation, bind, planString); } public DataReader createDataReader(ResultSet rset) { @@ -230,14 +232,14 @@ public class CQueryPlan implements SpiQueryPlan { return dataBind; } - final int getAsOfTableCount() { + final int asOfTableCount() { return asOfTableCount; } /** * Return a key used in audit logging to identify the query. */ - final String getAuditQueryKey() { + final String auditQueryKey() { if (auditQueryHash == null) { // volatile object assignment (so happy for multithreaded access) auditQueryHash = calcAuditQueryKey(); @@ -247,10 +249,10 @@ public class CQueryPlan implements SpiQueryPlan { private String calcAuditQueryKey() { // rawSql needs to include the MD5 hash of the sql - return rawSql ? planKey.getPartialKey() + "_" + hash : planKey.getPartialKey(); + return rawSql ? planKey.partialKey() + "_" + hash : planKey.partialKey(); } - final SqlTreePlan getSqlTree() { + final SqlTreePlan sqlTree() { return sqlTree; } @@ -258,7 +260,7 @@ public class CQueryPlan implements SpiQueryPlan { return rawSql; } - final String getLogWhereSql() { + final String logWhereSql() { return logWhereSql; } @@ -287,12 +289,12 @@ public class CQueryPlan implements SpiQueryPlan { /** * Return the time this query plan was last used. */ - public final long getLastQueryTime() { - return stats.getLastQueryTime(); + public final long lastQueryTime() { + return stats.lastQueryTime(); } - final ScalarDataReader getSingleAttributeScalarType() { - return sqlTree.getRootNode().getSingleAttributeReader(); + final ScalarDataReader singleAttributeScalarType() { + return sqlTree.rootNode().singleAttributeReader(); } /** @@ -313,7 +315,7 @@ public class CQueryPlan implements SpiQueryPlan { predicates.bind(capture); bindCapture.setBind(capture.bindCapture(), executionTimeMicros, startNanos); } catch (SQLException e) { - CoreLog.log.error("Error capturing bind values", e); + CoreLog.log.log(ERROR, "Error capturing bind values", e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java index 72791fc53..ac39f6beb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java @@ -5,13 +5,14 @@ import io.ebean.meta.QueryPlanRequest; import io.ebean.metric.TimedMetric; import io.ebeaninternal.api.*; import io.ebeaninternal.server.transaction.TransactionManager; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import static java.lang.System.Logger.Level.ERROR; import static java.util.Collections.emptyList; public final class CQueryPlanManager implements QueryPlanManager { @@ -62,9 +63,9 @@ public final class CQueryPlanManager implements QueryPlanManager { while (req.hasNext()) { req.nextCapture(); } - return req.getPlans(); + return req.plans(); } catch (SQLException e) { - CoreLog.log.error("Error during query plan collection", e); + CoreLog.log.log(ERROR, "Error during query plan collection", e); return emptyList(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java index 00b202d57..573b66026 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java @@ -34,7 +34,7 @@ final class CQueryPlanRequest { /** * Return the connection used to collect the db query plan. */ - Connection getConnection() { + Connection connection() { return connection; } @@ -48,14 +48,14 @@ final class CQueryPlanRequest { /** * Return the min epoch time in millis for minimum bind capture age. */ - long getSince() { + long since() { return since; } /** * Return the captured query plans. */ - List getPlans() { + List plans() { return plans; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java index 6b6c3d66e..8c911aaac 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java @@ -50,7 +50,7 @@ public final class CQueryPlanStats { /** * Return the last time this query was executed. */ - long getLastQueryTime() { + long lastQueryTime() { return lastQueryTime; } @@ -66,7 +66,7 @@ public final class CQueryPlanStats { } String reportName(MetricVisitor visitor) { - final String tmp = visitor.namingConvention().apply(queryPlan.getName()); + final String tmp = visitor.namingConvention().apply(queryPlan.name()); this.reportName = tmp; return tmp; } @@ -95,12 +95,12 @@ public final class CQueryPlanStats { @Override public Class type() { - return queryPlan.getBeanType(); + return queryPlan.beanType(); } @Override public String label() { - return queryPlan.getLabel(); + return queryPlan.label(); } @Override @@ -110,7 +110,7 @@ public final class CQueryPlanStats { @Override public String location() { - return queryPlan.getLocation(); + return queryPlan.location(); } @Override @@ -135,12 +135,12 @@ public final class CQueryPlanStats { @Override public String hash() { - return queryPlan.getHash(); + return queryPlan.hash(); } @Override public String sql() { - return queryPlan.getSql(); + return queryPlan.sql(); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java index 783ffe852..1577768c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java @@ -14,7 +14,7 @@ import io.ebeaninternal.server.persist.Binder; import io.ebeaninternal.server.querydefn.OrmQueryProperties; import io.ebeaninternal.server.querydefn.OrmUpdateProperties; import io.ebeaninternal.server.rawsql.SpiRawSql; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import io.ebeaninternal.server.util.BindParamsParser; import java.sql.Connection; @@ -26,6 +26,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import static java.lang.System.Logger.Level.WARNING; + /** * Compile Query Predicates. *

@@ -111,7 +113,7 @@ public final class CQueryPredicates { } CQueryPlan queryPlan = request.queryPlan(); if (queryPlan != null) { - int asOfTableCount = queryPlan.getAsOfTableCount(); + int asOfTableCount = queryPlan.asOfTableCount(); if (asOfTableCount > 0) { // bind the asOf value for each table alias as part of the from/join clauses // there is one effective date predicate per table alias @@ -332,14 +334,14 @@ public final class CQueryPredicates { // orderById is already in the order by clause return orderBy; } - if (idPos <= -1 || idPos >= manyPos) { + if (idPos == -1 || idPos >= manyPos) { if (idPos > manyPos) { // there was an error with the order by... - String msg = "A Query on [" + desc + "] includes a join to a 'many' association [" + manyProp.name(); - msg += "] with an incorrect orderBy [" + orderBy + "]. The id property [" + orderById + "]"; - msg += " must come before the many property [" + manyProp.name() + "] in the orderBy."; - msg += " Ebean has automatically modified the orderBy clause to do this."; - CoreLog.log.warn(msg); + String msg = "A Query on [" + desc + "] includes a join to a 'many' association [" + manyProp.name() + + "] with an incorrect orderBy [" + orderBy + "]. The id property [" + orderById + + "] must come before the many property [" + manyProp.name() + "] in the orderBy." + + " Ebean has automatically modified the orderBy clause to do this."; + CoreLog.log.log(WARNING, msg); } // the id needs to come before the manyPropName orderBy = orderBy.substring(0, manyPos) + orderById + ", " + orderBy.substring(manyPos); @@ -350,60 +352,60 @@ public final class CQueryPredicates { /** * Return the bind values for the where expression. */ - public List getWhereExprBindValues() { + public List whereExprBindValues() { return where == null ? Collections.emptyList() : where.getBindValues(); } /** * Return the db update set clause for an UpdateQuery. */ - String getDbUpdateClause() { + String dbUpdateClause() { return dbUpdateClause; } /** * Return the db column version of the combined where clause. */ - String getDbHaving() { + String dbHaving() { return dbHaving; } /** * Return the db column version of the combined where clause. */ - String getDbWhere() { + String dbWhere() { return dbWhere; } /** * Return a db filter for filtering many fetch joins. */ - String getDbFilterMany() { + String dbFilterMany() { return dbFilterMany; } /** * Return the db column version of the order by clause. */ - String getDbOrderBy() { + String dbOrderBy() { return dbOrderBy; } /** * Return the includes required for the where and order by clause. */ - Set getPredicateIncludes() { + Set predicateIncludes() { return predicateIncludes; } /** * Return the orderBy includes. */ - Set getOrderByIncludes() { + Set orderByIncludes() { return orderByIncludes; } - String getLogWhereSql() { + String logWhereSql() { if (dbWhere == null && dbFilterMany == null) { return ""; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java index da7def29b..3b1865825 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java @@ -42,7 +42,7 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer this.queryPlan = queryPlan; this.request = request; this.query = request.query(); - this.sql = queryPlan.getSql(); + this.sql = queryPlan.sql(); this.desc = request.descriptor(); this.predicates = predicates; query.setGeneratedSql(sql); @@ -51,13 +51,13 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer /** * Return a summary description of this query. */ - public String getSummary() { + public String summary() { //noinspection StringBufferReplaceableByString StringBuilder sb = new StringBuilder(80); sb.append("FindCount exeMicros[").append(executionTimeMicros) .append("] rows[").append(rowCount) .append("] type[").append(desc.fullName()) - .append("] predicates[").append(predicates.getLogWhereSql()) + .append("] predicates[").append(predicates.logWhereSql()) .append("] bind[").append(bindLog).append("]"); return sb.toString(); @@ -66,14 +66,14 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer /** * Return the bind log. */ - public String getBindLog() { + public String bindLog() { return bindLog; } /** * Return the generated sql. */ - public String getGeneratedSql() { + public String generatedSql() { return sql; } @@ -87,7 +87,7 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer public int findCount() throws SQLException { long startNano = System.nanoTime(); try { - SpiTransaction t = getTransaction(); + SpiTransaction t = transaction(); profileOffset = t.profileOffset(); Connection conn = t.getInternalConnection(); lock.lock(); @@ -119,7 +119,7 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer } } - private SpiTransaction getTransaction() { + private SpiTransaction transaction() { return request.transaction(); } @@ -135,13 +135,13 @@ final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuer @Override public void profile() { - getTransaction() + transaction() .profileStream() .addQueryEvent(query.profileEventId(), profileOffset, desc.name(), rowCount, query.getProfileId()); } - Set getDependentTables() { - return queryPlan.getDependentTables(); + Set dependentTables() { + return queryPlan.dependentTables(); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java index 8e7dfd1f5..edd8b348f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java @@ -38,7 +38,7 @@ final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery this.request = request; this.queryPlan = queryPlan; this.query = request.query(); - this.sql = queryPlan.getSql(); + this.sql = queryPlan.sql(); this.desc = request.descriptor(); this.predicates = predicates; query.setGeneratedSql(sql); @@ -47,14 +47,14 @@ final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery /** * Return the bind log. */ - public String getBindLog() { + public String bindLog() { return bindLog; } /** * Return the generated sql. */ - public String getGeneratedSql() { + public String generatedSql() { return sql; } @@ -64,7 +64,7 @@ final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery public int execute() throws SQLException { long startNano = System.nanoTime(); try { - SpiTransaction t = getTransaction(); + SpiTransaction t = transaction(); profileOffset = t.profileOffset(); Connection conn = t.getInternalConnection(); lock.lock(); @@ -97,7 +97,7 @@ final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery return executionTimeMicros; } - private SpiTransaction getTransaction() { + private SpiTransaction transaction() { return request.transaction(); } @@ -111,7 +111,7 @@ final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery @Override public void profile() { - getTransaction() + transaction() .profileStream() .addQueryEvent(query.profileEventId(), profileOffset, desc.name(), rowCount, query.getProfileId()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java index 63fa76d92..f4611617c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java @@ -94,7 +94,7 @@ final class DefaultDbSqlContext implements DbSqlContext { } @Override - public BeanProperty[] getEncryptedProps() { + public BeanProperty[] encryptedProps() { if (encryptedProps == null) { return null; } @@ -125,13 +125,13 @@ final class DefaultDbSqlContext implements DbSqlContext { sb.append(" ").append(type); boolean addAsOfOnClause = false; if (draftSupport != null) { - appendTable(table, draftSupport.getDraftTable(table)); + appendTable(table, draftSupport.draftTable(table)); } else if (!historyQuery) { sb.append(" ").append(table).append(" "); } else { // check if there is an associated history table and if so // use the unionAll view - we expect an additional predicate to match - String asOfView = historySupport.getAsOfView(table); + String asOfView = historySupport.asOfView(table); appendTable(table, asOfView); if (asOfView != null) { if (historySupport.isStandardsBased()) { @@ -161,7 +161,7 @@ final class DefaultDbSqlContext implements DbSqlContext { } } if (addAsOfOnClause) { - sb.append(" and ").append(historySupport.getAsOfPredicate(a2)); + sb.append(" and ").append(historySupport.asOfPredicate(a2)); asOfTableCount++; } if (extraWhere != null && !extraWhere.isEmpty()) { @@ -191,17 +191,17 @@ final class DefaultDbSqlContext implements DbSqlContext { } @Override - public String getTableAlias(String prefix) { - return alias.getTableAlias(prefix); + public String tableAlias(String prefix) { + return alias.tableAlias(prefix); } @Override - public String getTableAliasManyWhere(String prefix) { - return alias.getTableAliasManyWhere(prefix); + public String tableAliasManyWhere(String prefix) { + return alias.tableAliasManyWhere(prefix); } @Override - public String getRelativePrefix(String propName) { + public String relativePrefix(String propName) { return currentPrefix == null ? propName : currentPrefix + "." + propName; } @@ -209,7 +209,7 @@ final class DefaultDbSqlContext implements DbSqlContext { public void pushTableAlias(String prefix) { prefixStack.push(currentPrefix); currentPrefix = prefix; - tableAliasStack.push(getTableAlias(prefix)); + tableAliasStack.push(tableAlias(prefix)); } @Override @@ -227,7 +227,7 @@ final class DefaultDbSqlContext implements DbSqlContext { @Override public void appendFormulaJoin(String sqlFormulaJoin, SqlJoinType joinType, String manyWhere) { // replace ${ta} placeholder with the real table alias... - String tableAlias = manyWhere == null ? tableAliasStack.peek() : getTableAliasManyWhere(manyWhere); + String tableAlias = manyWhere == null ? tableAliasStack.peek() : tableAliasManyWhere(manyWhere); String converted = sqlFormulaJoin.replace(tableAliasPlaceHolder, tableAlias); if (formulaJoins == null) { formulaJoins = new HashSet<>(); @@ -272,10 +272,10 @@ final class DefaultDbSqlContext implements DbSqlContext { public void appendHistorySysPeriod() { String tableAlias = tableAliasStack.peek(); sb.append(COMMA); - sb.append(historySupport.getSysPeriodLower(tableAlias)); + sb.append(historySupport.sysPeriodLower(tableAlias)); appendColumnAlias(); sb.append(COMMA); - sb.append(historySupport.getSysPeriodUpper(tableAlias)); + sb.append(historySupport.sysPeriodUpper(tableAlias)); appendColumnAlias(); } @@ -325,7 +325,7 @@ final class DefaultDbSqlContext implements DbSqlContext { } @Override - public String getContent() { + public String content() { String s = sb.toString(); sb = new StringBuilder(STRING_BUILDER_INITIAL_CAPACITY); return s; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java index 71e13330e..b4ce3a696 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java @@ -48,9 +48,7 @@ import java.util.stream.Stream; final class DefaultFetchGroupQuery implements SpiFetchGroupQuery, SpiQueryFetch { private static final FetchConfig FETCH_CACHE = FetchConfig.ofCache(); - private static final FetchConfig FETCH_QUERY = FetchConfig.ofQuery(); - private static final FetchConfig FETCH_LAZY = FetchConfig.ofLazy(); private OrmQueryDetail detail = new OrmQueryDetail(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java index 95c5dbe7e..98a2ca471 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -17,25 +17,19 @@ import javax.persistence.PersistenceException; import java.sql.SQLException; import java.util.Collection; import java.util.List; -import java.util.Set; -/** - * Main Finder implementation. - */ public final class DefaultOrmQueryEngine implements OrmQueryEngine { - /** - * Find using predicates - */ private final CQueryEngine queryEngine; - private final Binder binder; + private final int forwardOnlyFetchSize; /** * Create the Finder. */ public DefaultOrmQueryEngine(CQueryEngine queryEngine, Binder binder) { this.queryEngine = queryEngine; + this.forwardOnlyFetchSize = queryEngine.forwardOnlyFetchSize(); this.binder = binder; } @@ -44,6 +38,11 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { return queryEngine.translate(request, bindLog, sql, e); } + @Override + public int forwardOnlyFetchSize() { + return forwardOnlyFetchSize; + } + @Override public boolean isMultiValueSupported(Class cls) { return binder.isMultiValueSupported(cls); @@ -53,7 +52,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { * Flushes the jdbc batch by default unless explicitly turned off on the transaction. */ private void flushJdbcBatchOnQuery(OrmQueryRequest request) { - SpiTransaction t = request.transaction(); if (t.isFlushOnQuery()) { // before we perform a query, we need to flush any @@ -65,14 +63,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public int delete(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.delete(request); } @Override public int update(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.update(request); } @@ -85,14 +81,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public int findCount(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findCount(request); } @Override public List findIds(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findIds(request); } @@ -112,16 +106,13 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public List> findVersions(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findVersions(request); } @Override public BeanCollection findMany(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); - BeanFindController finder = request.finder(); BeanCollection result; @@ -131,13 +122,11 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } else { result = queryEngine.findMany(request); } - if (finder != null) { result = finder.postProcessMany(request, result); } SpiQuery query = request.query(); - if (result != null && request.isBeanCachePutMany()) { // load the individual beans into the bean cache BeanDescriptor descriptor = request.descriptor(); @@ -146,7 +135,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } request.mergeCacheHits(result); - if (request.isQueryCachePut()) { // load the query result into the query cache result.setReadOnly(true); @@ -155,7 +143,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { result = result.getShallowCopy(); } } - return result; } @@ -164,9 +151,7 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { */ @Override public T findId(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); - BeanFindController finder = request.finder(); T result; @@ -175,15 +160,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } else { result = queryEngine.find(request); } - if (finder != null) { result = finder.postProcess(request, result); } - if (result != null && request.isBeanCachePut()) { request.descriptor().cacheBeanPut((EntityBean) result); } - return result; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index 44b84a6a5..047b9f696 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -26,11 +26,8 @@ import java.util.function.Predicate; public final class DefaultRelationalQueryEngine implements RelationalQueryEngine { private final Binder binder; - private final String dbTrueValue; - private final boolean binaryOptimizedUUID; - private final TimedMetricMap timedMetricMap; public DefaultRelationalQueryEngine(Binder binder, String dbTrueValue, boolean binaryOptimizedUUID) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java index e38d9d7d7..ad9902a2d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.query; import io.ebean.SqlQuery; import io.ebean.SqlRow; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.math.BigDecimal; import java.sql.Date; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/ExtraJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/ExtraJoin.java index 6fdeedd43..1b7859038 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/ExtraJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/ExtraJoin.java @@ -10,7 +10,7 @@ public final class ExtraJoin { this.containsMany = containsMany; } - public STreePropertyAssoc getProperty() { + public STreePropertyAssoc property() { return property; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/LimitOffsetPagedList.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/LimitOffsetPagedList.java index cb9f6f560..f763341f8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/LimitOffsetPagedList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/LimitOffsetPagedList.java @@ -15,19 +15,13 @@ import java.util.concurrent.locks.ReentrantLock; public final class LimitOffsetPagedList implements PagedList { private final transient SpiEbeanServer server; - private final transient ReentrantLock lock = new ReentrantLock(); - private final SpiQuery query; - private final int firstRow; - private final int maxRows; private int foregroundTotalRowCount = -1; - private Future futureRowCount; - private List list; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/NativeSqlQueryPlanKey.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/NativeSqlQueryPlanKey.java index 2a0313ff3..2c5c7c4b4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/NativeSqlQueryPlanKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/NativeSqlQueryPlanKey.java @@ -15,7 +15,7 @@ public class NativeSqlQueryPlanKey implements CQueryPlanKey { @Override public String toString() { - return getPartialKey(); + return partialKey(); } @Override @@ -29,7 +29,7 @@ public class NativeSqlQueryPlanKey implements CQueryPlanKey { * can be used as a short form proxy for the actual sql. */ @Override - public String getPartialKey() { + public String partialKey() { return hashCode() + "_n"; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/OrderVersionDesc.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/OrderVersionDesc.java index 52e661b10..2f564a5af 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/OrderVersionDesc.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/OrderVersionDesc.java @@ -17,7 +17,6 @@ final class OrderVersionDesc implements Comparator>, Serializable { @Override public int compare(Version o1, Version o2) { - Timestamp v1 = o1.getStart(); if (v1 == null) { return 1; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureIds.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureIds.java index ff5acb76c..912075e58 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureIds.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureIds.java @@ -19,11 +19,11 @@ public final class QueryFutureIds extends BaseFuture> implements this.call = call; } - public FutureTask> getFutureTask() { + public FutureTask> futureTask() { return futureTask; } - public Transaction getTransaction() { + public Transaction transaction() { return call.transaction; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureList.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureList.java index 34264ffcf..bd232c91f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureList.java @@ -23,11 +23,11 @@ public final class QueryFutureList extends BaseFuture> implements Fut this.call = call; } - public FutureTask> getFutureTask() { + public FutureTask> futureTask() { return futureTask; } - public Transaction getTransaction() { + public Transaction transaction() { return call.transaction; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureRowCount.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureRowCount.java index 832653f1d..28b66a198 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureRowCount.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryFutureRowCount.java @@ -17,11 +17,11 @@ public final class QueryFutureRowCount extends BaseFuture implements this.call = call; } - public FutureTask getFutureTask() { + public FutureTask futureTask() { return futureTask; } - public Transaction getTransaction() { + public Transaction transaction() { return call.transaction; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLogger.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLogger.java index aecdfd841..1af72113c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLogger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLogger.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.ResultSet; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerExplain.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerExplain.java index 8aab42e4e..3af04a56c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerExplain.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerExplain.java @@ -3,13 +3,15 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import static java.lang.System.Logger.Level.WARNING; + /** * A QueryPlanLogger that prefixes "EXPLAIN " to the query. This works for Postgres, H2 and MySql. */ @@ -17,13 +19,13 @@ public final class QueryPlanLoggerExplain extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { - try (PreparedStatement explainStmt = conn.prepareStatement("EXPLAIN " + plan.getSql())) { + try (PreparedStatement explainStmt = conn.prepareStatement("EXPLAIN " + plan.sql())) { bind.prepare(explainStmt, conn); try (ResultSet rset = explainStmt.executeQuery()) { return readQueryPlan(plan, bind, rset); } } catch (SQLException e) { - CoreLog.log.warn("Could not log query plan", e); + CoreLog.log.log(WARNING, "Could not log query plan", e); return null; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerOracle.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerOracle.java index 90c806dc0..2230d78cb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerOracle.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerOracle.java @@ -4,7 +4,7 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.PreparedStatement; @@ -12,6 +12,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import static java.lang.System.Logger.Level.WARNING; + /** * A QueryPlanLogger for oracle. * @@ -22,7 +24,7 @@ public final class QueryPlanLoggerOracle extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { try (Statement stmt = conn.createStatement()) { - try (PreparedStatement explainStmt = conn.prepareStatement("EXPLAIN PLAN FOR " + plan.getSql())) { + try (PreparedStatement explainStmt = conn.prepareStatement("EXPLAIN PLAN FOR " + plan.sql())) { bind.prepare(explainStmt, conn); explainStmt.execute(); } @@ -30,7 +32,7 @@ public final class QueryPlanLoggerOracle extends QueryPlanLogger { return readQueryPlan(plan, bind, rset); } } catch (SQLException e) { - CoreLog.log.warn("Could not log query plan", e); + CoreLog.log.log(WARNING, "Could not log query plan", e); return null; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerPostgres.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerPostgres.java index 9b5bed9a9..d51c1c351 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerPostgres.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerPostgres.java @@ -3,13 +3,15 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import static java.lang.System.Logger.Level.WARNING; + /** * A QueryPlanLogger for Postgres that prefixes "EXPLAIN ANALYZE" to the query. */ @@ -17,14 +19,14 @@ public final class QueryPlanLoggerPostgres extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { - String explain = "explain analyze " + plan.getSql(); + String explain = "explain analyze " + plan.sql(); try (PreparedStatement explainStmt = conn.prepareStatement(explain)) { bind.prepare(explainStmt, conn); try (ResultSet rset = explainStmt.executeQuery()) { return readQueryPlanBasic(plan, bind, rset); } } catch (SQLException e) { - CoreLog.log.warn("Could not log query plan: " + explain, e); + CoreLog.log.log(WARNING, "Could not log query plan: " + explain, e); return null; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java index 0bec7e4db..a8c3527a8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.query; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiDbQueryPlan; import io.ebeaninternal.api.SpiQueryPlan; -import io.ebeaninternal.server.type.bindcapture.BindCapture; +import io.ebeaninternal.server.bind.capture.BindCapture; import java.sql.Connection; import java.sql.PreparedStatement; @@ -11,6 +11,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import static java.lang.System.Logger.Level.WARNING; + /** * A QueryPlanLogger for SqlServer. It will return the plan as XML, which can be opened in * Microsoft SQL Server Management Studio. @@ -24,7 +26,7 @@ public final class QueryPlanLoggerSqlServer extends QueryPlanLogger { try (Statement stmt = conn.createStatement()) { stmt.execute("set statistics xml on"); stmt.execute("begin transaction"); - try (PreparedStatement explainStmt = conn.prepareStatement(plan.getSql())) { + try (PreparedStatement explainStmt = conn.prepareStatement(plan.sql())) { bind.prepare(explainStmt, conn); try (ResultSet rset = explainStmt.executeQuery()) { @@ -42,13 +44,13 @@ public final class QueryPlanLoggerSqlServer extends QueryPlanLogger { return createPlan(plan, bind.toString(), xml); } catch (SQLException e) { - CoreLog.log.warn("Could not log query plan", e); + CoreLog.log.log(WARNING, "Could not log query plan", e); return null; } finally { stmt.execute("set statistics xml off"); } } catch (SQLException e) { - CoreLog.log.warn("Could not log query plan", e); + CoreLog.log.log(WARNING, "Could not log query plan", e); return null; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/RawSqlQueryPlanKey.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/RawSqlQueryPlanKey.java index b24a57e04..77546dee6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/RawSqlQueryPlanKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/RawSqlQueryPlanKey.java @@ -21,7 +21,7 @@ final class RawSqlQueryPlanKey implements CQueryPlanKey { @Override public String toString() { - return getPartialKey() + ":r"; + return partialKey() + ":r"; } @Override @@ -35,7 +35,7 @@ final class RawSqlQueryPlanKey implements CQueryPlanKey { * can be used as a short form proxy for the actual sql. */ @Override - public String getPartialKey() { + public String partialKey() { return hashCode() + "_0"; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/STreePropertyAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/STreePropertyAssocOne.java index d7ff3016d..ca6f2ba67 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/STreePropertyAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/STreePropertyAssocOne.java @@ -23,5 +23,5 @@ public interface STreePropertyAssocOne extends STreePropertyAssoc { /** * Return the property value as an entity bean from the parent. */ - EntityBean getValueAsEntityBean(EntityBean parentBean); + EntityBean valueAsEntityBean(EntityBean parentBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/STreeType.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/STreeType.java index 12e14abbf..449b65926 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/STreeType.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/STreeType.java @@ -136,10 +136,8 @@ public interface STreeType { /** * Mark the bean as deleted by setting the softDelete property to true. - * * This works also, if there is only a virtual softDelete property computed by a formula. - * - * If there is no softdelete property, it sets the lazyLoadFailure flag in EBI. + * If there is no soft delete property, it sets the lazyLoadFailure flag in EBI. */ void markAsDeleted(EntityBean bean); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlJoinType.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlJoinType.java index 8ad0d8a39..ba2e4a584 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlJoinType.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlJoinType.java @@ -30,7 +30,7 @@ public enum SqlJoinType { * Return the actual SQL join literal taking into account the current join type and the 'default * join type as per deployment cardinality and optionality'. */ - public String getLiteral(SqlJoinType deploymentJoinType) { + public String literal(SqlJoinType deploymentJoinType) { if (this == SqlJoinType.AUTO) { return deploymentJoinType.literal; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java index d055b94c9..126e9ce7a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java @@ -88,33 +88,33 @@ final class SqlTree { return list; } - String getDistinctOn() { + String distinctOn() { return distinctOn; } /** * Return the String for the actual SQL. */ - String getSelectSql() { + String selectSql() { assert selectSql != null : "selectSql was null"; return selectSql; } - String getFromSql() { + String fromSql() { return fromSql; } /** * Return the groupBy clause. */ - String getGroupBy() { + String groupBy() { return groupBy; } /** * Return the where clause for inheritance. */ - String getInheritanceWhereSql() { + String inheritanceWhereSql() { return inheritanceWhereSql; } @@ -122,7 +122,7 @@ final class SqlTree { * Return the property that is associated with the many. There can only be one * per SqlSelect. This can be null. */ - STreePropertyAssocMany getManyProperty() { + STreePropertyAssocMany manyProperty() { return manyProperty; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java index a3661e816..3a5e7bdc7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java @@ -89,7 +89,7 @@ final class SqlTreeAlias { for (String propJoin : embeddedPropertyJoins) { String[] split = SplitName.split(propJoin); // the table alias of the parent path - String alias = getTableAlias(split[0]); + String alias = tableAlias(split[0]); aliasMap.put(propJoin, alias); } } @@ -109,34 +109,30 @@ final class SqlTreeAlias { /** * Return the table alias for a given property name. */ - String getTableAlias(String prefix) { + String tableAlias(String prefix) { if (prefix == null) { return rootTableAlias; } else { - String s = aliasMap.get(prefix); - if (s == null) { - return calcAlias(prefix); - } - return s; + String alias = aliasMap.get(prefix); + return alias != null ? alias : calcAlias(prefix); } } /** * Return an alias using "Many where joins". */ - String getTableAliasManyWhere(String prefix) { + String tableAliasManyWhere(String prefix) { if (prefix == null) { return rootTableAlias; } - String s = manyWhereAliasMap.get(prefix); - if (s == null) { - s = aliasMap.get(prefix); + String alias = manyWhereAliasMap.get(prefix); + if (alias == null) { + alias = aliasMap.get(prefix); } - if (s == null) { - String msg = "Could not determine table alias for [" + prefix + "] manyMap[" + manyWhereAliasMap + "] aliasMap[" + aliasMap + "]"; - throw new RuntimeException(msg); + if (alias == null) { + throw new RuntimeException("Could not determine table alias for " + prefix); } - return s; + return alias; } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java index faf4a2a5a..412c74fc8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java @@ -11,23 +11,17 @@ import io.ebeaninternal.server.deploy.InheritInfo; import io.ebeaninternal.server.deploy.TableJoin; import io.ebeaninternal.server.querydefn.OrmQueryDetail; import io.ebeaninternal.server.querydefn.OrmQueryProperties; -import org.slf4j.Logger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; + +import static java.lang.System.Logger.Level.ERROR; /** * Factory for SqlTree. */ public final class SqlTreeBuilder { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final SpiQuery query; private final STreeType desc; @@ -92,10 +86,10 @@ public final class SqlTreeBuilder { this.disableLazyLoad = query.isDisableLazyLoading(); this.readOnly = Boolean.TRUE.equals(query.isReadOnly()); this.subQuery = Type.SQ_EXISTS == query.getType() - || Type.SQ_IN == query.getType() - || Type.ID_LIST == query.getType() - || Type.DELETE == query.getType() - || query.isCountDistinct(); + || Type.SQ_IN == query.getType() + || Type.ID_LIST == query.getType() + || Type.DELETE == query.getType() + || query.isCountDistinct(); this.includeJoin = query.getM2mIncludeJoin(); this.manyWhereJoins = query.getManyWhereJoins(); this.queryDetail = query.getDetail(); @@ -104,8 +98,8 @@ public final class SqlTreeBuilder { this.distinctOnPlatform = builder.isPlatformDistinctOn(); this.distinctNoLobs = builder.isPlatformDistinctNoLobs(); String fromForUpdate = builder.fromForUpdate(query); - CQueryHistorySupport historySupport = builder.getHistorySupport(query); - CQueryDraftSupport draftSupport = builder.getDraftSupport(query); + CQueryHistorySupport historySupport = builder.historySupport(query); + CQueryDraftSupport draftSupport = builder.draftSupport(query); String colAlias = subQuery ? null : columnAliasPrefix; this.ctx = new DefaultDbSqlContext(alias, colAlias, historySupport, draftSupport, fromForUpdate); } @@ -129,7 +123,7 @@ public final class SqlTreeBuilder { inheritanceWhereSql = buildWhereClause(); groupBy = buildGroupByClause(); distinctOn = buildDistinctOn(); - encryptedProps = ctx.getEncryptedProps(); + encryptedProps = ctx.encryptedProps(); query.incrementAsOfTableCount(ctx.asOfTableCount()); } @@ -146,7 +140,7 @@ public final class SqlTreeBuilder { return "1"; } rootNode.appendSelect(ctx, subQuery); - return trimComma(ctx.getContent()); + return trimComma(ctx.content()); } private String buildGroupByClause() { @@ -155,7 +149,7 @@ public final class SqlTreeBuilder { } ctx.startGroupBy(); rootNode.appendGroupBy(ctx, subQuery); - return trimComma(ctx.getContent()); + return trimComma(ctx.content()); } private String buildDistinctOn() { @@ -164,8 +158,8 @@ public final class SqlTreeBuilder { } ctx.startGroupBy(); rootNode.appendDistinctOn(ctx, subQuery); - String idCols = trimComma(ctx.getContent()); - return idCols == null ? null : mergeOnDistinct(idCols, predicates.getDbOrderBy()); + String idCols = trimComma(ctx.content()); + return idCols == null ? null : mergeOnDistinct(idCols, predicates.dbOrderBy()); } static String mergeOnDistinct(String idCols, String dbOrderBy) { @@ -201,7 +195,7 @@ public final class SqlTreeBuilder { return "Not Used"; } rootNode.appendWhere(ctx); - return ctx.getContent(); + return ctx.content(); } private String buildFromClause() { @@ -209,14 +203,14 @@ public final class SqlTreeBuilder { return "Not Used"; } rootNode.appendFrom(ctx, SqlJoinType.AUTO); - return ctx.getContent(); + return ctx.content(); } private void buildRoot(STreeType desc) { rootNode = buildSelectChain(null, null, desc, null); if (!rawSql) { alias.addJoin(queryDetail.getFetchPaths(), desc); - alias.addJoin(predicates.getPredicateIncludes(), desc); + alias.addJoin(predicates.predicateIncludes(), desc); alias.addManyWhereJoins(manyWhereJoins.getPropertyNames()); // build set of table alias alias.buildAlias(); @@ -348,7 +342,7 @@ public final class SqlTreeBuilder { if (rawSql) { return; } - Set predicateIncludes = predicates.getPredicateIncludes(); + Set predicateIncludes = predicates.predicateIncludes(); if (predicateIncludes == null) { return; } @@ -360,7 +354,7 @@ public final class SqlTreeBuilder { // remove ManyWhereJoins from the predicateIncludes predicateIncludes.removeAll(manyWhereJoins.getPropertyNames()); - predicateIncludes.addAll(predicates.getOrderByIncludes()); + predicateIncludes.addAll(predicates.orderByIncludes()); // look for predicateIncludes that are not in selectIncludes and add // them as extra joins to the query @@ -392,7 +386,7 @@ public final class SqlTreeBuilder { private void addPropertyToSubQuery(SqlTreeProperties selectProps, STreeType desc, String propName, String path) { STreeProperty p = desc.findPropertyWithDynamic(propName, path); if (p == null) { - log.error("property [" + propName + "]not found on " + desc + " for query - excluding it."); + log.log(ERROR, "property [{0}] not found on {1} for query - excluding it.", propName, desc); return; } else if (p instanceof STreePropertyAssoc && p.isEmbedded()) { // if the property is embedded we need to lookup the real column name @@ -427,13 +421,13 @@ public final class SqlTreeBuilder { if (p != null) { selectProps.add(p); } else { - log.error("property [" + propName + "] not found on " + desc + " for query - excluding it."); + log.log(ERROR, "property [{0}] not found on {1} for query - excluding it.", propName, desc); } } else if (p.isEmbedded() || (p instanceof STreePropertyAssoc && !queryProps.isIncludedBeanJoin(p.name()))) { // add the embedded bean or the *ToOne assoc bean. We skip the check that the *ToOne propName maps to Id property ... selectProps.add(p); } else { - log.error("property [" + p.fullName() + "] expected to be an embedded or *ToOne bean for query - excluding it."); + log.log(ERROR, "property [{0}] expected to be an embedded or *ToOne bean for query - excluding it.", p.fullName()); } } @@ -442,7 +436,7 @@ public final class SqlTreeBuilder { // sub class hierarchy if required STreeProperty p = desc.findPropertyWithDynamic(propName, queryProps.getPath()); if (p == null) { - log.error("property [" + propName + "] not found on " + desc + " for query - excluding it."); + log.log(ERROR, "property [{0}] not found on {1} for query - excluding it.", propName, desc); p = desc.findProperty("id"); selectProps.add(p); @@ -542,9 +536,6 @@ public final class SqlTreeBuilder { if (queryDetail.includesPath(propName)) { if (manyProperty != null) { // only one many associated allowed to be included in fetch - if (log.isDebugEnabled()) { - log.debug("Not joining [" + propName + "] as already joined to a Many[" + manyProperty + "]."); - } return false; } manyProperty = manyProp; @@ -559,7 +550,6 @@ public final class SqlTreeBuilder { * Return true if this node is FULLY included resulting in table join. If the * node is not included but its parent has been included then a "bean proxy" * is added and false is returned. - *

*/ private boolean isIncludeBean(String prefix) { if (queryDetail.includesPath(prefix)) { @@ -641,7 +631,7 @@ public final class SqlTreeBuilder { SqlTreeNodeExtraJoin root = findExtraJoinRoot(includeProp, extraJoin); // register the root because these are the only ones we // return back. - rootRegister.put(root.getName(), root); + rootRegister.put(root.name(), root); } } @@ -653,7 +643,7 @@ public final class SqlTreeBuilder { if (extra == null) { return null; } else { - SqlTreeNodeExtraJoin extraJoin = new SqlTreeNodeExtraJoin(propertyName, extra.getProperty(), extra.isContainsMany(), temporalMode); + SqlTreeNodeExtraJoin extraJoin = new SqlTreeNodeExtraJoin(propertyName, extra.property(), extra.isContainsMany(), temporalMode); joinRegister.put(propertyName, extraJoin); return extraJoin; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoad.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoad.java index c5ac129b1..d2fa59c56 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoad.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoad.java @@ -23,6 +23,6 @@ interface SqlTreeLoad { /** * Return the reader for the single attribute query. */ - ScalarDataReader getSingleAttributeReader(); + ScalarDataReader singleAttributeReader(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java index a95ff951f..a542fc89d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadBean.java @@ -73,14 +73,14 @@ class SqlTreeLoadBean implements SqlTreeLoad { } @Override - public final ScalarDataReader getSingleAttributeReader() { + public final ScalarDataReader singleAttributeReader() { if (properties == null || properties.length == 0) { // if we have no property ask first children (in a distinct select with join) if (children.length == 0) { // expected to be a findIds query return desc.idBinder().getBeanProperty(); } - return children[0].getSingleAttributeReader(); + return children[0].singleAttributeReader(); } if (properties[0] instanceof STreePropertyAssocOne) { STreePropertyAssocOne assocOne = (STreePropertyAssocOne)properties[0]; @@ -163,8 +163,8 @@ class SqlTreeLoadBean implements SqlTreeLoad { } private void initPersistenceContext() { - queryMode = ctx.getQueryMode(); - persistenceContext = (!readIdNormal) ? null : ctx.getPersistenceContext(); + queryMode = ctx.queryMode(); + persistenceContext = (!readIdNormal) ? null : ctx.persistenceContext(); } private void readId() throws SQLException { @@ -208,7 +208,7 @@ class SqlTreeLoadBean implements SqlTreeLoad { localBean = null; // ... but there may exist as reference bean in parent which has to be marked as deleted. if (parentBean != null && nodeBeanProp instanceof STreePropertyAssocOne) { - contextBean = ((STreePropertyAssocOne)nodeBeanProp).getValueAsEntityBean(parentBean); + contextBean = ((STreePropertyAssocOne)nodeBeanProp).valueAsEntityBean(parentBean); if (contextBean != null) { desc.markAsDeleted(contextBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadRoot.java index d1792ecbe..475dd9576 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeLoadRoot.java @@ -34,8 +34,8 @@ final class SqlTreeLoadRoot extends SqlTreeLoadBean implements SqlTreeRoot { public Version loadVersion(DbReadContext ctx) throws SQLException { // read the sys period lower and upper bounds // these are always the first 2 columns in the resultSet - Timestamp start = ctx.getDataReader().getTimestamp(); - Timestamp end = ctx.getDataReader().getTimestamp(); + Timestamp start = ctx.dataReader().getTimestamp(); + Timestamp end = ctx.dataReader().getTimestamp(); T bean = (T) load(ctx, null, null); return new Version<>(bean, start, end); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java index 3d50a9377..5aff65c43 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java @@ -83,5 +83,5 @@ interface SqlTreeNode { * Unselect lobs (for distinct queries on DB2 and Oracle). */ default void unselectLobs() { - }; + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index a09e7ad41..8e8c23167 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -94,7 +94,7 @@ class SqlTreeNodeBean implements SqlTreeNode { this.disableLazyLoad = disableLazyLoad || !readIdNormal || desc.isRawSqlBased(); this.readOnly = readOnly; this.partialObject = props.isPartialObject(); - this.properties = props.getProps(); + this.properties = props.props(); this.children = myChildren == null ? Collections.emptyList() : myChildren; this.pathMap = createPathMap(prefix, desc); } @@ -248,7 +248,7 @@ class SqlTreeNodeBean implements SqlTreeNode { if (ctx.length() > 0) { ctx.append(" and"); } - ctx.append(" ").append(ctx.getTableAlias(prefix)).append("."); + ctx.append(" ").append(ctx.tableAlias(prefix)).append("."); ctx.append(inheritInfo.getWhere()); } } @@ -263,7 +263,7 @@ class SqlTreeNodeBean implements SqlTreeNode { if (ctx.length() > 0) { ctx.append(" and"); } - String ta = ctx.getTableAlias(prefix); + String ta = ctx.tableAlias(prefix); ctx.append(" ").append(extraWhere.replace("${ta}", ta)); } } @@ -280,7 +280,7 @@ class SqlTreeNodeBean implements SqlTreeNode { ctx.pushJoin(prefix); ctx.pushTableAlias(prefix); - baseTableAlias = ctx.getTableAlias(prefix); + baseTableAlias = ctx.tableAlias(prefix); // join and return SqlJoinType to use for child joins joinType = appendFromBaseTable(ctx, joinType); for (STreeProperty property : properties) { @@ -325,7 +325,7 @@ class SqlTreeNodeBean implements SqlTreeNode { appendJoinDiscriminator(ctx); } if (desc.isSoftDelete() && temporalMode != SpiQuery.TemporalMode.SOFT_DELETED) { - ctx.append(" and ").append(desc.softDeletePredicate(ctx.getTableAlias(prefix))); + ctx.append(" and ").append(desc.softDeletePredicate(ctx.tableAlias(prefix))); } return sqlJoinType; } @@ -335,9 +335,9 @@ class SqlTreeNodeBean implements SqlTreeNode { STreePropertyAssocMany manyProp = (STreePropertyAssocMany) nodeBeanProp; if (manyProp.hasJoinTable()) { - String alias = ctx.getTableAlias(prefix); + String alias = ctx.tableAlias(prefix); String[] split = SplitName.split(prefix); - String parentAlias = ctx.getTableAlias(split[0]); + String parentAlias = ctx.tableAlias(split[0]); String alias2 = alias + "z_"; // adding the additional join to the intersection table @@ -354,7 +354,7 @@ class SqlTreeNodeBean implements SqlTreeNode { void appendJoinDiscriminator(DbSqlContext ctx) { if (inheritInfo.getWhere() == null) return; - String alias = ctx.getTableAlias(prefix); + String alias = ctx.tableAlias(prefix); ctx.append(" and ").append(alias).append(".").append(inheritInfo.getWhere()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java index 5547d1c92..9b8806406 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java @@ -85,7 +85,7 @@ final class SqlTreeNodeExtraJoin implements SqlTreeNode { return manyJoin; } - public String getName() { + public String name() { return prefix; } @@ -115,9 +115,9 @@ final class SqlTreeNodeExtraJoin implements SqlTreeNode { manyToMany = true; - String alias = ctx.getTableAlias(prefix); + String alias = ctx.tableAlias(prefix); String[] split = SplitName.split(prefix); - String parentAlias = ctx.getTableAlias(split[0]); + String parentAlias = ctx.tableAlias(split[0]); String alias2 = alias + "z_"; TableJoin manyToManyJoin = manyProp.intersectionTableJoin(); @@ -146,7 +146,7 @@ final class SqlTreeNodeExtraJoin implements SqlTreeNode { } joinType = assocBeanProperty.addJoin(joinType, prefix, ctx); if (!oneToOneExported && assocBeanProperty.isTargetSoftDelete() && temporalMode != SpiQuery.TemporalMode.SOFT_DELETED) { - ctx.append(" and ").append(assocBeanProperty.softDeletePredicate(ctx.getTableAlias(prefix))); + ctx.append(" and ").append(assocBeanProperty.softDeletePredicate(ctx.tableAlias(prefix))); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java index cb2ba54e7..325f58cea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java @@ -73,7 +73,6 @@ final class SqlTreeNodeManyWhereJoin implements SqlTreeNode { */ @Override public void appendFrom(DbSqlContext ctx, SqlJoinType currentJoinType) { - // always use the join type as per this many where join // (OUTER for disjunction and otherwise INNER) appendFromBaseTable(ctx, manyJoinType); @@ -84,9 +83,8 @@ final class SqlTreeNodeManyWhereJoin implements SqlTreeNode { * intersection table if this is a ManyToMany node. */ private void appendFromBaseTable(DbSqlContext ctx, SqlJoinType joinType) { - - String alias = ctx.getTableAliasManyWhere(prefix); - String parentAlias = ctx.getTableAliasManyWhere(parentPrefix); + String alias = ctx.tableAliasManyWhere(prefix); + String parentAlias = ctx.tableAliasManyWhere(parentPrefix); if (nodeBeanProp instanceof STreePropertyAssocOne) { nodeBeanProp.addJoin(joinType, parentAlias, alias, ctx); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreePlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreePlan.java index 7a0e929ef..03343b336 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreePlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreePlan.java @@ -16,7 +16,7 @@ final class SqlTreePlan { this.dependentTables = dependentTables; } - SqlTreeRoot getRootNode() { + SqlTreeRoot rootNode() { return (SqlTreeRoot)rootNode; } @@ -24,11 +24,11 @@ final class SqlTreePlan { * Return the property that is associated with the many. There can only be one * per SqlSelect. This can be null. */ - STreePropertyAssocMany getManyProperty() { + STreePropertyAssocMany manyProperty() { return manyProperty; } - STreeProperty[] getEncryptedProps() { + STreeProperty[] encryptedProps() { return encryptedProps; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java index 806af5ef6..acc0cfae7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java @@ -53,7 +53,7 @@ public final class SqlTreeProperties { } } - public STreeProperty[] getProps() { + public STreeProperty[] props() { return propsList.toArray(new STreeProperty[0]); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java index 64938bc22..e9a927197 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java @@ -29,6 +29,6 @@ interface SqlTreeRoot { /** * Return a Scalar single attribute reader based on the first property. */ - ScalarDataReader getSingleAttributeReader(); + ScalarDataReader singleAttributeReader(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java index 8120aa093..fc82d72ca 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java @@ -181,7 +181,7 @@ public final class DefaultDtoQuery extends AbstractQuery implements SpiDtoQue @Override public String toString() { - return "DtoQuery [" + sql + "]"; + return "DtoQuery " + sql; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 86bb27c5a..5c5ff7f14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -411,22 +411,23 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { return expressionFactory; } - private final void createExtraJoinsToSupportManyWhereClause() { - manyWhereJoins = new ManyWhereJoins(); + private void createExtraJoinsToSupportManyWhereClause() { + final var manyWhere = new ManyWhereJoins(); if (whereExpressions != null) { - whereExpressions.containsMany(beanDescriptor, manyWhereJoins); + whereExpressions.containsMany(beanDescriptor, manyWhere); } if (havingExpressions != null) { - havingExpressions.containsMany(beanDescriptor, manyWhereJoins); + havingExpressions.containsMany(beanDescriptor, manyWhere); } if (orderBy != null) { for (Property orderProperty : orderBy.getProperties()) { ElPropertyDeploy elProp = beanDescriptor.elPropertyDeploy(orderProperty.getProperty()); if (elProp != null && elProp.containsFormulaWithJoin()) { - manyWhereJoins.addFormulaWithJoin(elProp.elPrefix(), elProp.name()); + manyWhere.addFormulaWithJoin(elProp.elPrefix(), elProp.name()); } } } + manyWhereJoins = manyWhere; } /** @@ -442,14 +443,12 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { * included in the query. */ @Override - public final boolean selectAllForLazyLoadProperty() { + public final void selectAllForLazyLoadProperty() { if (lazyLoadProperty != null) { if (!detail.containsProperty(lazyLoadProperty)) { detail.select("*"); - return true; } } - return false; } private List removeQueryJoins() { @@ -1499,12 +1498,12 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { @Override @SuppressWarnings("unchecked") public final
List findSingleAttributeList() { - return (List) server.findSingleAttributeList(this, transaction); + return server.findSingleAttributeList(this, transaction); } @Override public final Set findSingleAttributeSet() { - return (Set) server.findSingleAttributeSet(this, transaction); + return server.findSingleAttributeSet(this, transaction); } @Override @@ -1714,7 +1713,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { @Override public final String toString() { - return "Query [" + whereExpressions + "]"; + return "Query " + whereExpressions; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index f059e4b7c..4b7c59625 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -121,7 +121,7 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq @Override public String toString() { - return "SqlQuery [" + query + "]"; + return "SqlQuery " + query; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java index fab176ecb..e2ce3f307 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java @@ -232,7 +232,7 @@ public final class OrmQueryDetail implements Serializable { /** * Add or replace the fetch detail. */ - protected void fetch(OrmQueryProperties chunk) { + void fetch(OrmQueryProperties chunk) { String path = chunk.getPath(); if (path == null) { baseProps = chunk; @@ -480,10 +480,8 @@ public final class OrmQueryDetail implements Serializable { if (create && props == null) { props = new OrmQueryProperties(path); fetch(props); - return props; - } else { - return props; } + return props; } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java index 3ce478c92..f58ca42f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java @@ -33,7 +33,7 @@ final class OrmQueryPlanKey implements CQueryPlanKey { } @Override - public String getPartialKey() { + public String partialKey() { return description; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmUpdateProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmUpdateProperties.java index 5a9d5b392..d4db67d81 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmUpdateProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmUpdateProperties.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.querydefn; import io.ebean.core.type.ScalarType; import io.ebeaninternal.server.deploy.DeployParser; import io.ebeaninternal.server.persist.Binder; -import io.ebeaninternal.server.type.DataBind; +import io.ebeaninternal.server.bind.DataBind; import java.sql.SQLException; import java.util.LinkedHashMap; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/SimpleTextParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/SimpleTextParser.java index 0072c8eec..e2b4c56ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/SimpleTextParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/SimpleTextParser.java @@ -144,12 +144,9 @@ public final class SimpleTextParser { private boolean isOperator(char c) { switch (c) { case '<': - return true; - case '>': - return true; - case '=': - return true; case '!': + case '=': + case '>': return true; default: diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlService.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlService.java index 8ffef8a33..3f8a2c2bc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlService.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlService.java @@ -58,6 +58,7 @@ public final class DRawSqlService implements SpiRawSqlService { ret.put(name, resultSet.getString(i)); break; + case Types.LONGVARBINARY: case Types.BLOB: ret.put(name, resultSet.getBytes(i)); break; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/SpiRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/SpiRawSql.java index 73bc6ff19..d38f600ee 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/SpiRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/SpiRawSql.java @@ -64,7 +64,7 @@ public interface SpiRawSql extends RawSql { /** * Construct for unparsed SQL. */ - protected Sql(String unparsedSql) { + Sql(String unparsedSql) { this.parsed = false; this.unparsedSql = unparsedSql; this.preFrom = null; @@ -80,7 +80,7 @@ public interface SpiRawSql extends RawSql { /** * Construct for parsed SQL. */ - protected Sql(String unparsedSql, String preFrom, String preWhere, boolean andWhereExpr, + Sql(String unparsedSql, String preFrom, String preWhere, boolean andWhereExpr, String preHaving, boolean andHavingExpr, String orderByPrefix, String orderBy, boolean distinct) { this.unparsedSql = unparsedSql; @@ -98,9 +98,9 @@ public interface SpiRawSql extends RawSql { @Override public String toString() { if (!parsed) { - return "unparsed[" + unparsedSql + "]"; + return "unparsed " + unparsedSql; } - return "select[" + preFrom + "] preWhere[" + preWhere + "] preHaving[" + preHaving + "] orderBy[" + orderBy + "]"; + return "select:" + preFrom + " preWhere:" + preWhere + " preHaving:" + preHaving + " orderBy:" + orderBy; } public boolean isDistinct() { @@ -199,7 +199,7 @@ public interface SpiRawSql extends RawSql { /** * Construct from parsed sql where the columns have been identified. */ - protected ColumnMapping(List columns) { + ColumnMapping(List columns) { this.immutable = false; this.parsed = true; this.propertyMap = null; @@ -213,7 +213,7 @@ public interface SpiRawSql extends RawSql { /** * Construct for unparsed sql. */ - protected ColumnMapping() { + ColumnMapping() { this.immutable = false; this.parsed = false; this.propertyMap = null; @@ -224,7 +224,7 @@ public interface SpiRawSql extends RawSql { /** * Construct for ResultSet use. */ - protected ColumnMapping(String... propertyNames) { + ColumnMapping(String... propertyNames) { this.immutable = false; this.parsed = false; this.propertyMap = null; @@ -240,7 +240,7 @@ public interface SpiRawSql extends RawSql { /** * Construct an immutable ColumnMapping based on collected information. */ - protected ColumnMapping(boolean parsed, LinkedHashMap dbColumnMap) { + ColumnMapping(boolean parsed, LinkedHashMap dbColumnMap) { this.immutable = true; this.parsed = parsed; this.dbColumnMap = dbColumnMap; @@ -281,17 +281,14 @@ public interface SpiRawSql extends RawSql { * * @throws IllegalStateException when a propertyName has not been defined for a column. */ - protected ColumnMapping createImmutableCopy() { - + ColumnMapping createImmutableCopy() { for (Column c : dbColumnMap.values()) { c.checkMapping(); } - return new ColumnMapping(parsed, dbColumnMap); } - protected void columnMapping(String dbColumn, String propertyName) { - + void columnMapping(String dbColumn, String propertyName) { if (immutable) { throw new IllegalStateException("Should never happen"); } @@ -301,8 +298,7 @@ public interface SpiRawSql extends RawSql { } else { Column column = dbColumnMap.get(dbColumn); if (column == null) { - String msg = "DB Column [" + dbColumn + "] not found in mapping. Expecting one of [" + dbColumnMap.keySet() + "]"; - throw new IllegalArgumentException(msg); + throw new IllegalArgumentException("DB Column " + dbColumn + " not found in mapping. Expecting one of " + dbColumnMap.keySet()); } column.setPropertyName(propertyName); } @@ -331,7 +327,7 @@ public interface SpiRawSql extends RawSql { /** * Return the column mapping. */ - protected Map mapping() { + Map mapping() { return dbColumnMap; } @@ -420,8 +416,7 @@ public interface SpiRawSql extends RawSql { private void checkMapping() { if (propertyName == null) { - String msg = "No propertyName defined (Column mapping) for dbColumn [" + dbColumn + "]"; - throw new IllegalStateException(msg); + throw new IllegalStateException("No propertyName defined (Column mapping) for dbColumn " + dbColumn); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditLogger.java b/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditLogger.java index 72b5ee85f..785dd57b5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditLogger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditLogger.java @@ -1,30 +1,32 @@ package io.ebeaninternal.server.readaudit; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import io.avaje.applog.AppLog; import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditQueryPlan; import io.ebean.event.readaudit.ReadEvent; import io.ebean.text.json.EJson; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; import io.ebeaninternal.api.CoreLog; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.StringWriter; import java.util.Map; +import static java.lang.System.Logger.Level.ERROR; +import static java.lang.System.Logger.Level.INFO; + /** * Default implementation of ReadAuditLogger that writes the event in JSON format to standard loggers. */ public class DefaultReadAuditLogger implements ReadAuditLogger { - private static final Logger queryLogger = LoggerFactory.getLogger("io.ebean.ReadAuditQuery"); - private static final Logger auditLogger = LoggerFactory.getLogger("io.ebean.ReadAudit"); + private static final System.Logger queryLogger = AppLog.getLogger("io.ebean.ReadAuditQuery"); + private static final System.Logger auditLogger = AppLog.getLogger("io.ebean.ReadAudit"); protected final JsonFactory jsonFactory = new JsonFactory(); - protected int defaultQueryBuffer = 500; - protected int defaultReadBuffer = 150; + protected final int defaultQueryBuffer = 500; + protected final int defaultReadBuffer = 150; /** * Write the query plan details in JSON format to the logger. @@ -48,9 +50,9 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { } gen.writeEndObject(); gen.flush(); - queryLogger.info(writer.toString()); + queryLogger.log(INFO, writer.toString()); } catch (IOException e) { - CoreLog.log.error("Error writing Read audit event", e); + CoreLog.log.log(ERROR, "Error writing Read audit event", e); } } @@ -75,9 +77,9 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { StringWriter writer = new StringWriter(defaultReadBuffer); JsonGenerator gen = jsonFactory.createGenerator(writer); writeDetails(gen, event); - auditLogger.info(writer.toString()); + auditLogger.log(INFO, writer.toString()); } catch (IOException e) { - CoreLog.log.error("Error writing Read audit event", e); + CoreLog.log.log(ERROR, "Error writing Read audit event", e); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/csv/package-info.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/csv/package-info.java deleted file mode 100644 index 039bc09f3..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/csv/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package io.ebeaninternal.server.text.csv; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileHandler.java index 16c4aafad..c690a8061 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileHandler.java @@ -7,9 +7,10 @@ import io.ebean.plugin.SpiServer; import io.ebean.util.IOUtils; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiProfileHandler; -import org.slf4j.Logger; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.Writer; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -20,6 +21,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import static java.lang.System.Logger.Level.*; import static java.time.temporal.ChronoField.*; /** @@ -31,8 +33,9 @@ import static java.time.temporal.ChronoField.*; */ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private static final DateTimeFormatter DTF; + static { DTF = new DateTimeFormatterBuilder() .parseCaseInsensitive() @@ -76,7 +79,7 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { this.executor = Executors.newSingleThreadExecutor(); this.dir = new File(config.getDirectory()); if (!dir.exists() && !dir.mkdirs()) { - log.error("failed to mkdirs " + dir.getAbsolutePath()); + log.log(ERROR, "failed to mkdirs " + dir.getAbsolutePath()); } incrementFile(); } @@ -106,7 +109,7 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { out.close(); out = null; } catch (IOException e) { - log.error("Failed to flush and close transaction profiling file ", e); + log.log(ERROR, "Failed to flush and close transaction profiling file ", e); } } } finally { @@ -126,7 +129,7 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { File file = new File(dir, "txprofile-" + now + ".tprofile"); out = IOUtils.newWriter(file); } catch (IOException e) { - log.error("Not expected", e); + log.log(ERROR, "Not expected", e); } } finally { lock.unlock(); @@ -149,7 +152,7 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { } flushCurrentFile(); } catch (Exception e) { - log.warn("Error on collect", e); + log.log(WARNING, "Error on collect", e); } } @@ -180,10 +183,10 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { if (profileCounter % profilesPerFile == 0) { incrementFile(); - log.debug("profiled {} transactions", profileCounter); + log.log(DEBUG, "profiled {0} transactions", profileCounter); } } catch (IOException e) { - log.warn("Error writing transaction profiling", e); + log.log(WARNING, "Error writing transaction profiling", e); } } @@ -247,16 +250,16 @@ public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { @Override public void shutdown() { shutdown = true; - log.trace("shutting down"); + log.log(TRACE, "shutting down"); try { executor.shutdown(); if (!executor.awaitTermination(4, TimeUnit.SECONDS)) { - log.info("Shut down timeout exceeded. Terminating profiling consumer thread."); + log.log(INFO, "Shut down timeout exceeded. Terminating profiling consumer thread."); executor.shutdownNow(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); - log.warn("Interrupt on shutdown", e); + log.log(WARNING, "Interrupt on shutdown", e); } flushCurrentFile(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java index 675169318..06b78861e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java @@ -21,7 +21,7 @@ public final class DeleteByIdMap { @Override public String toString() { - return "DeleteById[" + beanMap.values() + "]"; + return "DeleteById " + beanMap.values(); } public void notifyCache(CacheChangeSet changeSet) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 42f585707..7ffa36f8d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -17,6 +17,8 @@ import java.sql.SQLException; import java.util.HashMap; import java.util.Map; +import static java.lang.System.Logger.Level.ERROR; + /** * Read only transaction expected to use autoCommit connection and for implicit use only. *

@@ -238,7 +240,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve @Override public boolean isReadOnly() { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } try { @@ -250,7 +252,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve @Override public void setReadOnly(boolean readOnly) { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } try { @@ -401,7 +403,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve */ @Override public void setPersistenceContext(SpiPersistenceContext context) { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } this.persistenceContext = context; @@ -463,7 +465,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve */ @Override public Connection getInternalConnection() { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } return connection; @@ -483,7 +485,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve } catch (Exception ex) { // the connection pool will automatically remove the // connection if it does not pass the test - CoreLog.log.error("Error closing connection", ex); + CoreLog.log.log(ERROR, "Error closing connection", ex); } connection = null; active = false; @@ -506,7 +508,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve */ @Override public void commit() { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } // expect AutoCommit so just deactivate / put back into pool @@ -530,6 +532,11 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve throw new IllegalStateException(notExpectedMessage); } + @Override + public void rollbackAndContinue() { + // do nothing + } + /** * Rollback the transaction. */ @@ -544,7 +551,7 @@ final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEve */ @Override public void rollback(Throwable cause) throws PersistenceException { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } // expect AutoCommit so it really has already committed diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index 4fb74db18..9fae2e21c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -4,7 +4,6 @@ import io.ebean.ProfileLocation; import io.ebean.TransactionCallback; import io.ebean.annotation.DocStoreMode; import io.ebean.config.DatabaseConfig; -import io.ebean.config.dbplatform.DatabasePlatform.OnQueryOnly; import io.ebean.event.changelog.BeanChange; import io.ebean.event.changelog.ChangeSet; import io.ebeaninternal.api.*; @@ -14,7 +13,6 @@ import io.ebeaninternal.server.persist.BatchControl; import io.ebeaninternal.server.persist.BatchedSqlException; import io.ebeaninternal.server.util.Str; import io.ebeanservice.docstore.api.DocStoreTransaction; -import org.slf4j.Logger; import javax.persistence.PersistenceException; import javax.persistence.RollbackException; @@ -23,163 +21,80 @@ import java.sql.SQLException; import java.util.*; import java.util.function.Consumer; +import static java.lang.System.Logger.Level.ERROR; + /** * JDBC Connection based transaction. */ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { - private static final Logger log = CoreLog.log; + private static final System.Logger log = CoreLog.log; private static final Object PLACEHOLDER = new Object(); private static final String illegalStateMessage = "Transaction is Inactive"; - /** - * The associated TransactionManager. - */ final TransactionManager manager; - - /** - * The transaction id. - */ private final String id; - + private final String logPrefix; private final boolean logSql; private final boolean logSummary; - + private final boolean explicit; + private final boolean onQueryOnlyCommit; /** * The user defined label to group execution statistics. */ private String label; - - /** - * Flag to indicate if this was an explicitly created Transaction. - */ - private final boolean explicit; - - /** - * Behaviour for ending query only transactions. - */ - private final OnQueryOnly onQueryOnly; - - /** - * The status of the transaction. - */ private boolean active; - private boolean rollbackOnly; - private boolean nestedUseSavepoint; - - /** - * The underlying Connection. - */ Connection connection; - - /** - * Used to queue up persist requests for batch execution. - */ private BatchControl batchControl; - - /** - * The event which holds persisted beans. - */ private TransactionEvent event; - - /** - * Holder of the objects fetched to ensure unique objects are used. - */ private SpiPersistenceContext persistenceContext; - - /** - * Used to give developers more control over the insert update and delete - * functionality. - */ private boolean persistCascade = true; - - /** - * Flag used for performance to skip commit or rollback of query only - * transactions in read committed transaction isolation. - */ private boolean queryOnly = true; - private boolean localReadOnly; - private Boolean updateAllLoadedProperties; - private boolean oldBatchMode; - private boolean batchMode; - private boolean batchOnCascadeMode; - private int batchSize = -1; - private boolean batchFlushOnQuery = true; - private Boolean batchGetGeneratedKeys; - private Boolean batchFlushOnMixed; - - private final String logPrefix; - private Object tenantId; - /** * The depth used by batch processing to help the ordering of statements. */ private int depth; - - /** - * Set to true if the connection has autoCommit=true initially. - */ private boolean autoCommit; - private IdentityHashMap persistingBeans; - private HashSet deletingBeansHash; - private HashMap m2mIntersectionSave; - private Map userObjects; - private List callbackList; - private boolean batchOnCascadeSet; - private TChangeLogHolder changeLogHolder; - private List deferredList; - /** * The mode for updating doc store indexes for this transaction. * Only set when you want to override the default behavior. */ private DocStoreMode docStoreMode; - private int docStoreBatchSize; - /** * Explicit control over skipCache. */ private Boolean skipCache; - /** * Default skip cache behavior from {@link DatabaseConfig#isSkipCacheAfterWrite()}. */ private final boolean skipCacheAfterWrite; - DocStoreTransaction docStoreTxn; - private ProfileStream profileStream; - private ProfileLocation profileLocation; - private final long startNanos; - private boolean autoPersistUpdates; - /** - * Create a new JdbcTransaction. - */ JdbcTransaction(String id, boolean explicit, Connection connection, TransactionManager manager) { try { this.active = true; @@ -190,14 +105,13 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.connection = connection; this.persistenceContext = new DefaultPersistenceContext(); this.startNanos = System.nanoTime(); - if (manager == null) { this.logSql = false; this.logSummary = false; this.skipCacheAfterWrite = true; this.batchMode = false; this.batchOnCascadeMode = false; - this.onQueryOnly = OnQueryOnly.ROLLBACK; + this.onQueryOnlyCommit = false; } else { this.autoPersistUpdates = explicit && manager.isAutoPersistUpdates(); this.logSql = manager.isLogSql(); @@ -205,7 +119,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.skipCacheAfterWrite = manager.isSkipCacheAfterWrite(); this.batchMode = manager.isPersistBatch(); this.batchOnCascadeMode = manager.isPersistBatchOnCascade(); - this.onQueryOnly = manager.onQueryOnly(); + this.onQueryOnlyCommit = true; } checkAutoCommit(connection); @@ -356,7 +270,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { try { consumer.accept(callbackList.get(i)); } catch (Exception e) { - log.error("Error executing transaction callback", e); + log.log(ERROR, "Error executing transaction callback", e); } } } @@ -494,7 +408,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public final void depthDecrement() { if (depth != 0) { - depth += -1; + depth -= 1; } } @@ -510,9 +424,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public boolean isReadOnly() { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } try { return connection.isReadOnly(); } catch (SQLException e) { @@ -522,9 +433,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public void setReadOnly(boolean readOnly) { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } try { localReadOnly = readOnly; connection.setReadOnly(readOnly); @@ -545,9 +453,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public final void setBatchMode(boolean batchMode) { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } this.batchMode = batchMode; } @@ -558,9 +463,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public final void setBatchOnCascade(boolean batchMode) { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } this.batchOnCascadeMode = batchMode; } @@ -752,9 +654,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ @Override public final void flush() { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } internalBatchFlush(); } @@ -793,9 +692,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ @Override public final void setPersistenceContext(SpiPersistenceContext context) { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } this.persistenceContext = context; } @@ -862,9 +758,6 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ @Override public Connection getInternalConnection() { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } return connection; } @@ -884,7 +777,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { connection.setReadOnly(false); } } catch (SQLException e) { - log.error("Error setting to readOnly?", e); + log.log(ERROR, "Error setting to readOnly?", e); } try { if (autoCommit) { @@ -892,14 +785,14 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { connection.setAutoCommit(true); } } catch (SQLException e) { - log.error("Error setting to readOnly?", e); + log.log(ERROR, "Error setting to readOnly?", e); } try { connection.close(); } catch (Exception ex) { // the connection pool will automatically remove the // connection if it does not pass the test - log.error("Error closing connection", ex); + log.log(ERROR, "Error closing connection", ex); } connection = null; active = false; @@ -925,14 +818,14 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { private void connectionEndForQueryOnly() { try { withEachCallback(TransactionCallback::preCommit); - if (onQueryOnly == OnQueryOnly.COMMIT) { + if (onQueryOnlyCommit) { performCommit(); } else { performRollback(); } withEachCallback(TransactionCallback::postCommit); } catch (SQLException e) { - log.error("Error when ending a query only transaction via " + onQueryOnly, e); + log.log(ERROR, "Error when ending a query only transaction", e); } } @@ -1006,7 +899,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { if (rollbackOnly) { return; } - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } try { @@ -1031,7 +924,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { rollback(); return; } - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } try { @@ -1056,7 +949,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { private RuntimeException wrapIfNeeded(Exception e) { if (e instanceof PersistenceException) { // keep more specific exception if we have it - return (PersistenceException)e; + return (PersistenceException) e; } return new RollbackException(e); } @@ -1100,6 +993,22 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.nestedUseSavepoint = true; } + @Override + public void rollbackAndContinue() { + if (!active) { + throw new IllegalStateException(illegalStateMessage); + } + internalBatchClear(); + if (changeLogHolder != null) { + changeLogHolder.clear(); + } + try { + performRollback(); + } catch (SQLException ex) { + throw new PersistenceException(ex); + } + } + /** * Rollback the transaction. */ @@ -1114,7 +1023,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ @Override public void rollback(Throwable cause) throws PersistenceException { - if (!isActive()) { + if (!active) { throw new IllegalStateException(illegalStateMessage); } try { @@ -1152,7 +1061,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ @Override public void end() throws PersistenceException { - if (isActive()) { + if (active) { rollback(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java index f5edf2688..73bc98981 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java @@ -4,7 +4,6 @@ import io.ebean.config.ExternalTransactionManager; import io.ebean.util.JdbcClose; import io.ebeaninternal.api.CoreLog; import io.ebeaninternal.api.SpiTransaction; -import org.slf4j.Logger; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -15,12 +14,15 @@ import javax.transaction.Synchronization; import javax.transaction.TransactionSynchronizationRegistry; import javax.transaction.UserTransaction; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.WARNING; + /** * Hook into external JTA transaction manager. */ public final class JtaTransactionManager implements ExternalTransactionManager { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private static final String EBEAN_TXN_RESOURCE = "EBEAN_TXN_RESOURCE"; private TransactionManager transactionManager; @@ -87,15 +89,15 @@ public final class JtaTransactionManager implements ExternalTransactionManager { SpiTransaction currentEbeanTransaction = scope.inScope(); if (currentEbeanTransaction != null) { // NOT expecting this so log WARNING - log.warn("JTA Transaction - no current txn BUT using current Ebean one {}", currentEbeanTransaction.getId()); + log.log(WARNING, "JTA Transaction - no current txn BUT using current Ebean one {0}", currentEbeanTransaction.getId()); return currentEbeanTransaction; } UserTransaction ut = getUserTransaction(); if (ut == null) { // no current JTA transaction - if (log.isDebugEnabled()) { - log.debug("JTA Transaction - no current txn"); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "JTA Transaction - no current txn"); } return null; } @@ -181,27 +183,21 @@ public final class JtaTransactionManager implements ExternalTransactionManager { public void afterCompletion(int status) { switch (status) { case Status.STATUS_COMMITTED: - if (log.isDebugEnabled()) { - log.debug("Jta Txn [" + transaction.getId() + "] committed"); - } + log.log(DEBUG, "Jta Txn [{0}] committed", transaction.getId()); transaction.postCommit(); // Remove this transaction object as it is completed transactionManager.scope().clearExternal(); break; case Status.STATUS_ROLLEDBACK: - if (log.isDebugEnabled()) { - log.debug("Jta Txn [" + transaction.getId() + "] rollback"); - } + log.log(DEBUG, "Jta Txn [{0}] rollback", transaction.getId()); transaction.postRollback(null); // Remove this transaction object as it is completed transactionManager.scope().clearExternal(); break; default: - if (log.isDebugEnabled()) { - log.debug("Jta Txn [" + transaction.getId() + "] status:" + status); - } + log.log(DEBUG, "Jta Txn [{0}] status:{1}", transaction.getId(), status); } // No matter the completion status of the transaction, we release the connection we got from the pool. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java index 529a7ca0a..ff094b643 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java @@ -78,10 +78,14 @@ final class NoTransaction implements SpiTransaction { } @Override - public void rollback() throws PersistenceException { + public void rollbackAndContinue() { // do nothing } + @Override + public void rollback() throws PersistenceException { + // do nothing + } @Override public void rollback(Throwable e) throws PersistenceException { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/PostCommitProcessing.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/PostCommitProcessing.java index 51f3ece39..f36dd7ede 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/PostCommitProcessing.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/PostCommitProcessing.java @@ -10,11 +10,12 @@ import io.ebeaninternal.server.cache.CacheChangeSet; import io.ebeaninternal.server.cluster.ClusterManager; import io.ebeaninternal.server.core.PersistRequestBean; import io.ebeanservice.docstore.api.DocStoreUpdates; -import org.slf4j.Logger; import java.util.List; import java.util.Set; +import static java.lang.System.Logger.Level.DEBUG; + /** * Performs post commit processing using a background thread. *

@@ -23,7 +24,7 @@ import java.util.Set; */ final class PostCommitProcessing { - private static final Logger log = CoreLog.internal; + private static final System.Logger log = CoreLog.internal; private final ClusterManager clusterManager; private final TransactionEvent event; @@ -104,8 +105,8 @@ final class PostCommitProcessing { private void notifyCluster() { if (remoteTransactionEvent != null && !remoteTransactionEvent.isEmpty()) { // send the interesting events to the cluster - if (log.isDebugEnabled()) { - log.debug("Cluster Send: {}", remoteTransactionEvent); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "Cluster Send: {0}", remoteTransactionEvent); } clusterManager.broadcast(remoteTransactionEvent); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTableMod.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTableMod.java index a3b97ec2a..cf5db3580 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTableMod.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTableMod.java @@ -27,7 +27,7 @@ public final class RemoteTableMod implements BinaryWritable { @Override public String toString() { - return "TableMod[" + timestamp + "; " + tables + "]"; + return "TableMod " + timestamp + "; " + tables; } public long getTimestamp() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java index aa4bc978e..e35a8c30f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/SavepointTransaction.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.transaction; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.api.SpiTransactionProxy; +import io.ebeaninternal.api.TransactionEvent; import io.ebeaninternal.server.util.Str; import javax.persistence.PersistenceException; @@ -25,6 +26,7 @@ final class SavepointTransaction extends SpiTransactionProxy { private boolean rollbackOnly; private int state; + private TransactionEvent event; SavepointTransaction(SpiTransaction transaction, TransactionManager manager) throws SQLException { this.manager = manager; @@ -40,6 +42,14 @@ final class SavepointTransaction extends SpiTransactionProxy { this.logPrefix = transaction.getLogPrefix() + spPrefix; } + @Override + public TransactionEvent getEvent() { + if (event == null) { + event = new TransactionEvent(); + } + return event; + } + @Override public String getLogPrefix() { return logPrefix; @@ -69,6 +79,11 @@ final class SavepointTransaction extends SpiTransactionProxy { } } + @Override + public void rollbackAndContinue() { + throw new UnsupportedOperationException(); + } + @Override public void rollback() throws PersistenceException { rollbackSavepoint(null); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TChangeLogHolder.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TChangeLogHolder.java index b2a7269d0..73a497fad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TChangeLogHolder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TChangeLogHolder.java @@ -96,4 +96,7 @@ public final class TChangeLogHolder { owner.sendChangeLog(changes); } + void clear() { + changes.getChanges().clear(); + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TableModState.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TableModState.java index d3793a8e4..37669d3a3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TableModState.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TableModState.java @@ -1,16 +1,18 @@ package io.ebeaninternal.server.transaction; +import io.avaje.applog.AppLog; import io.ebean.cache.QueryCacheEntry; import io.ebean.cache.QueryCacheEntryValidate; import io.ebean.cache.ServerCacheNotification; import io.ebean.cache.ServerCacheNotify; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.TRACE; + /** * Holds timestamp of last modification per table. *

@@ -19,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public final class TableModState implements QueryCacheEntryValidate, ServerCacheNotify { - private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.TABLEMOD"); + private static final System.Logger log = AppLog.getLogger("io.ebean.cache.TABLEMOD"); private final Map tableModStamp = new ConcurrentHashMap<>(); @@ -34,8 +36,8 @@ public final class TableModState implements QueryCacheEntryValidate, ServerCache for (String tableName : touchedTables) { tableModStamp.put(tableName, modNanoTime); } - if (log.isDebugEnabled()) { - log.debug("TableModState updated - touched:{} modNanoTime:{}", touchedTables, modNanoTime); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "TableModState updated - touched:{0} modNanoTime:{1}", touchedTables, modNanoTime); } } @@ -46,8 +48,8 @@ public final class TableModState implements QueryCacheEntryValidate, ServerCache for (String tableName : tables) { Long modTime = tableModStamp.get(tableName); if (modTime != null && modTime >= sinceNanoTime) { - if (log.isTraceEnabled()) { - log.trace("Invalidate on table:{}", tableName); + if (log.isLoggable(TRACE)) { + log.log(TRACE, "Invalidate on table:{0}", tableName); } return false; } @@ -68,15 +70,13 @@ public final class TableModState implements QueryCacheEntryValidate, ServerCache * Update the table modification timestamps based on remote table modification events. *

* Generally this is used with distributed caches (Hazelcast, Ignite etc) via topic. - *

*/ @Override public void notify(ServerCacheNotification notification) { - // use local clock - for slightly more aggressive invalidation (as later) // that removes any concern regarding clock syncing across cluster - if (log.isDebugEnabled()) { - log.debug("ServerCacheNotification:{}", notification); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "ServerCacheNotification:{0}", notification); } touch(notification.getDependentTables()); } @@ -85,14 +85,12 @@ public final class TableModState implements QueryCacheEntryValidate, ServerCache * Update from Remote transaction event. *

* Generally this is used with Clustering (ebean-cluster, k8scache). - *

*/ public void notify(RemoteTableMod tableMod) { - // use local clock - for slightly more aggressive invalidation (as later) // that removes any concern regarding clock syncing across cluster - if (log.isDebugEnabled()) { - log.debug("RemoteTableMod:{}", tableMod); + if (log.isLoggable(DEBUG)) { + log.log(DEBUG, "RemoteTableMod:{0}", tableMod); } touch(tableMod.getTables()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java index 381ecea41..0a306640d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.transaction; +import io.avaje.applog.AppLog; import io.ebean.BackgroundExecutor; import io.ebean.ProfileLocation; import io.ebean.TxScope; @@ -9,7 +10,6 @@ import io.ebean.cache.ServerCacheNotification; import io.ebean.cache.ServerCacheNotify; import io.ebean.config.CurrentTenantProvider; import io.ebean.config.dbplatform.DatabasePlatform; -import io.ebean.config.dbplatform.DatabasePlatform.OnQueryOnly; import io.ebean.event.changelog.ChangeLogListener; import io.ebean.event.changelog.ChangeLogPrepare; import io.ebean.event.changelog.ChangeSet; @@ -28,8 +28,6 @@ import io.ebeaninternal.server.profile.TimedProfileLocationRegistry; import io.ebeanservice.docstore.api.DocStoreTransaction; import io.ebeanservice.docstore.api.DocStoreUpdateProcessor; import io.ebeanservice.docstore.api.DocStoreUpdates; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import javax.sql.DataSource; @@ -40,6 +38,9 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.ERROR; + /** * Manages transactions. *

@@ -47,8 +48,8 @@ import java.util.concurrent.atomic.AtomicLong; */ public class TransactionManager implements SpiTransactionManager { - private static final Logger log = CoreLog.log; - private static final Logger clusterLogger = LoggerFactory.getLogger("io.ebean.Cluster"); + private static final System.Logger log = CoreLog.log; + private static final System.Logger clusterLogger = AppLog.getLogger("io.ebean.Cluster"); private final SpiServer server; private final BeanDescriptorManager beanDescriptorManager; @@ -74,7 +75,6 @@ public class TransactionManager implements SpiTransactionManager { * Flag to indicate the default Isolation is READ COMMITTED. This enables us * to close queryOnly transactions rather than commit or rollback them. */ - private final OnQueryOnly onQueryOnly; private final BackgroundExecutor backgroundExecutor; private final ClusterManager clusterManager; private final String serverName; @@ -118,7 +118,7 @@ public class TransactionManager implements SpiTransactionManager { this.txnLogger = logManager.txn(); this.txnDebug = txnLogger.isDebug(); this.databasePlatform = options.config.getDatabasePlatform(); - this.supportsSavepointId = databasePlatform.isSupportsSavepointId(); + this.supportsSavepointId = databasePlatform.supportsSavepointId(); this.skipCacheAfterWrite = options.config.isSkipCacheAfterWrite(); this.notifyL2CacheInForeground = options.notifyL2CacheInForeground; this.autoPersistUpdates = options.config.isAutoPersistUpdates(); @@ -143,7 +143,6 @@ public class TransactionManager implements SpiTransactionManager { this.bulkEventListenerMap = new BulkEventListenerMap(options.config.getBulkTableEventListeners()); this.prefix = ""; this.externalTransPrefix = "e"; - this.onQueryOnly = initOnQueryOnly(options.config.getDatabasePlatform().getOnQueryOnly()); CurrentTenantProvider tenantProvider = options.config.getCurrentTenantProvider(); this.transactionFactory = TransactionFactoryBuilder.build(this, dataSourceSupplier, tenantProvider); @@ -251,26 +250,6 @@ public class TransactionManager implements SpiTransactionManager { return persistBatchOnCascade; } - /** - * Return the behaviour to use when a query only transaction is committed. - *

- * There is a potential optimisation available when read committed is the default - * isolation level. If it is, then Connections used only for queries do not require - * commit or rollback but instead can just be put back into the pool via close(). - *

- * If the Isolation level is higher (say SERIALIZABLE) then Connections used - * just for queries do need to be committed or rollback after the query. - */ - final OnQueryOnly initOnQueryOnly(OnQueryOnly dbPlatformOnQueryOnly) { - // first check for a system property 'override' - String systemPropertyValue = System.getProperty("ebean.transaction.onqueryonly"); - if (systemPropertyValue != null) { - return OnQueryOnly.valueOf(systemPropertyValue.trim().toUpperCase()); - } - // default to rollback if not defined on the platform - return dbPlatformOnQueryOnly == null ? OnQueryOnly.COMMIT : dbPlatformOnQueryOnly; - } - public final String name() { return serverName; } @@ -290,13 +269,6 @@ public class TransactionManager implements SpiTransactionManager { return dataSourceSupplier.getReadOnlyDataSource(); } - /** - * Defines the type of behavior to use when closing a transaction that was used to query data only. - */ - final OnQueryOnly onQueryOnly() { - return onQueryOnly; - } - /** * Wrap the externally supplied Connection. */ @@ -365,7 +337,7 @@ public class TransactionManager implements SpiTransactionManager { txnLogger.debug(msg); } } catch (Exception ex) { - log.error("Error while notifying TransactionEventListener of rollback event", ex); + log.log(ERROR, "Error while notifying TransactionEventListener of rollback event", ex); } } @@ -416,7 +388,7 @@ public class TransactionManager implements SpiTransactionManager { postCommit.notifyLocalCache(); backgroundExecutor.execute(postCommit.backgroundNotify()); } catch (Exception ex) { - log.error("NotifyOfCommit failed. L2 Cache potentially not notified.", ex); + log.log(ERROR, "NotifyOfCommit failed. L2 Cache potentially not notified.", ex); } } @@ -442,8 +414,8 @@ public class TransactionManager implements SpiTransactionManager { * Notify local BeanPersistListeners etc of events from another server in the cluster. */ public final void remoteTransactionEvent(RemoteTransactionEvent remoteEvent) { - if (clusterLogger.isDebugEnabled()) { - clusterLogger.debug("processing {}", remoteEvent); + if (clusterLogger.isLoggable(DEBUG)) { + clusterLogger.log(DEBUG, "processing {0}", remoteEvent); } CacheChangeSet changeSet = new CacheChangeSet(); @@ -601,7 +573,7 @@ public class TransactionManager implements SpiTransactionManager { } else { setToScope = false; transaction = txnContainer.current(); - nestedSavepoint = transaction.isNestedUseSavepoint(); + nestedSavepoint = txnContainer.isNestedUseSavepoint(); } TxType type = txScope.getType(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java index 9982124af..12e5e6b17 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.ScalarType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.math.BigDecimal; import java.util.UUID; @@ -17,7 +17,7 @@ interface ArrayElementConverter { T fromSerialized(Object rawValue); /** - * Convert the array element from it's DB array form. + * Convert the array element from its DB array form. */ T fromDbArray(Object rawValue); @@ -25,31 +25,12 @@ interface ArrayElementConverter { return objects; } - /** - * The UUID converter implementation. - */ ArrayElementConverter UUID = new UuidConverter(); - - /** - * The String converter implementation. - */ ArrayElementConverter STRING = new StringConverter(); - - /** - * The Long converter implementation. - */ ArrayElementConverter LONG = new LongConverter(); - - /** - * The Integer converter implementation. - */ ArrayElementConverter INTEGER = new IntegerConverter(); - - /** - * The Double converter implementation. - */ ArrayElementConverter DOUBLE = new DoubleConverter(); - + ArrayElementConverter FLOAT = new FloatConverter(); ArrayElementConverter BIG_DECIMAL = new BigDecimalConverter(); class LongConverter implements ArrayElementConverter { @@ -86,6 +67,23 @@ interface ArrayElementConverter { } } + class FloatConverter implements ArrayElementConverter { + + @Override + public Float fromSerialized(Object rawValue) { + return fromDbArray(rawValue); + } + + @Override + public Float fromDbArray(Object rawValue) { + if (rawValue instanceof Float) { + return (Float) rawValue; + } else { + return ((Number) rawValue).floatValue(); + } + } + } + class DoubleConverter implements ArrayElementConverter { @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DecimalUtils.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DecimalUtils.java deleted file mode 100644 index 13ceb73c2..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DecimalUtils.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.ebeaninternal.server.type; - -/* - * Copyright 2013 FasterXML.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the license for the specific language governing permissions and - * limitations under the license. - */ - -import java.math.BigDecimal; -import java.sql.Timestamp; -import java.time.Duration; -import java.time.Instant; - -/** - * Utilities to aid in the translation of decimal types to/from multiple parts. - * - * @author Nick Williams - * @since 2.2.0 - */ -final class DecimalUtils { - - private static final char[] ZEROES = new char[]{'0', '0', '0', '0', '0', '0', '0', '0', '0'}; - - private static final BigDecimal ONE_BILLION = new BigDecimal(1000000000L); - - private DecimalUtils() { - throw new RuntimeException("DecimalUtils cannot be instantiated."); - } - - static Duration toDuration(BigDecimal value) { - long seconds = value.longValue(); - int nanoseconds = extractNanosecondDecimal(value, seconds); - return Duration.ofSeconds(seconds, nanoseconds); - } - - static BigDecimal toDecimal(Duration instant) { - return new BigDecimal(toDecimal(instant.getSeconds(), instant.getNano())); - } - - static Timestamp toTimestamp(BigDecimal value) { - long seconds = value.longValue(); - int nanoseconds = extractNanosecondDecimal(value, seconds); - Timestamp ts = new Timestamp(seconds * 1000); - ts.setNanos(nanoseconds); - return ts; - } - - static BigDecimal toDecimal(Timestamp instant) { - long millis = instant.getTime(); - long secs = millis / 1000; - return new BigDecimal(toDecimal(secs, instant.getNanos())); - } - - static Instant toInstant(BigDecimal value) { - long seconds = value.longValue(); - int nanoseconds = extractNanosecondDecimal(value, seconds); - return Instant.ofEpochSecond(seconds, nanoseconds); - } - - static BigDecimal toDecimal(Instant instant) { - return new BigDecimal(toDecimal(instant.getEpochSecond(), instant.getNano())); - } - - static String toDecimal(long seconds, int nanoseconds) { - StringBuilder string = new StringBuilder(Integer.toString(nanoseconds)); - if (string.length() < 9) - string.insert(0, ZEROES, 0, 9 - string.length()); - return seconds + "." + string; - } - - static int extractNanosecondDecimal(BigDecimal value, long integer) { - return value.subtract(new BigDecimal(integer)).multiply(ONE_BILLION).intValue(); - } -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeFactory.java index b962a4811..af89523ab 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeFactory.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.DatabaseConfig; import io.ebean.config.JsonConfig; import io.ebean.core.type.ScalarType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.math.BigInteger; import java.sql.Types; @@ -50,7 +50,7 @@ final class DefaultTypeFactory { return createBoolean(trueValue, falseValue); } // determine based on database platform configuration - int booleanDbType = config.getDatabasePlatform().getBooleanDbType(); + int booleanDbType = config.getDatabasePlatform().booleanDbType(); if (booleanDbType == Types.BIT) { return new ScalarTypeBoolean.BitBoolean(); } 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 165d86c5a..c60386f30 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; @@ -21,11 +18,6 @@ import io.ebeaninternal.api.GeoTypeProvider; import io.ebeaninternal.server.core.ServiceUtil; import io.ebeaninternal.server.core.bootup.BootupClasses; import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; -import org.joda.time.LocalTime; -import org.slf4j.Logger; import javax.persistence.AttributeConverter; import javax.persistence.EnumType; @@ -45,6 +37,9 @@ 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.*; + /** * Default implementation of TypeManager. *

@@ -52,39 +47,17 @@ import java.util.concurrent.ConcurrentHashMap; */ public final class DefaultTypeManager implements TypeManager { - private static final Logger log = CoreLog.internal; + 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; private final DefaultTypeFactory extraTypeFactory; + private final ScalarType fileType = new ScalarTypeFile(); private final ScalarType hstoreType = new ScalarTypePostgresHstore(); - private final ScalarTypeFile fileType = new ScalarTypeFile(); - private final ScalarType charType = new ScalarTypeChar(); - private final ScalarType charArrayType = new ScalarTypeCharArray(); - private final ScalarType longVarcharType = new ScalarTypeLongVarchar(); - private final ScalarType clobType = new ScalarTypeClob(); - private final ScalarType byteType = new ScalarTypeByte(); - private final ScalarType binaryType = new ScalarTypeBytesBinary(); - private final ScalarType blobType = new ScalarTypeBytesBlob(); - private final ScalarType varbinaryType = new ScalarTypeBytesVarbinary(); - private final ScalarType longVarbinaryType = new ScalarTypeBytesLongVarbinary(); - private final ScalarType shortType = new ScalarTypeShort(); - private final ScalarType integerType = new ScalarTypeInteger(); - private final ScalarType longType = new ScalarTypeLong(); - private final ScalarType doubleType = new ScalarTypeDouble(); - private final ScalarType floatType = new ScalarTypeFloat(); - private final ScalarType bigDecimalType = new ScalarTypeBigDecimal(); - private final ScalarType timeType = new ScalarTypeTime(); - private final ScalarType urlType = new ScalarTypeURL(); - private final ScalarType uriType = new ScalarTypeURI(); - private final ScalarType localeType = new ScalarTypeLocale(); - private final ScalarType currencyType = new ScalarTypeCurrency(); - private final ScalarType timeZoneType = new ScalarTypeTimeZone(); - private final ScalarType stringType = ScalarTypeString.INSTANCE; - private final ScalarType classType = new ScalarTypeClass(); private final JsonConfig.DateTime jsonDateTime; private final JsonConfig.Date jsonDate; @@ -92,36 +65,14 @@ public final class DefaultTypeManager implements TypeManager { private final Object objectMapper; private final boolean objectMapperPresent; private final boolean postgres; - private final TypeJsonManager jsonManager; + private final ScalarJsonManager jsonManager; private final boolean offlineMigrationGeneration; 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; + private final ScalarJsonMapper jsonMapper; private GeoTypeBinder geoTypeBinder; /** @@ -144,10 +95,11 @@ public final class DefaultTypeManager implements TypeManager { this.offlineMigrationGeneration = DbOffline.isGenerateMigration(); this.defaultEnumType = config.getDefaultEnumType(); + ServiceLoader mappers = ServiceLoader.load(ScalarJsonMapper.class); + jsonMapper = mappers.findFirst().orElse(null); + initialiseStandard(config); initialiseJavaTimeTypes(config); - initialiseJodaTypes(config); - initialiseJacksonTypes(config); loadTypesFromProviders(config, objectMapper); loadGeoTypeBinder(config); @@ -166,7 +118,7 @@ public final class DefaultTypeManager implements TypeManager { } private PlatformArrayTypeFactory arrayTypeListFactory(DatabasePlatform databasePlatform) { - if (databasePlatform.isNativeArrayType()) { + if (databasePlatform.nativeArrayType()) { return ScalarTypeArrayList.factory(); } else if (databasePlatform.isPlatform(Platform.H2)) { return ScalarTypeArrayListH2.factory(); @@ -175,7 +127,7 @@ public final class DefaultTypeManager implements TypeManager { } private PlatformArrayTypeFactory arrayTypeSetFactory(DatabasePlatform databasePlatform) { - if (databasePlatform.isNativeArrayType()) { + if (databasePlatform.nativeArrayType()) { return ScalarTypeArraySet.factory(); } else if (databasePlatform.isPlatform(Platform.H2)) { return ScalarTypeArraySetH2.factory(); @@ -187,23 +139,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) { - log.debug("adding ScalarType {}", type.getClass()); + for (ExtraTypeFactory plugin : ServiceLoader.load(ExtraTypeFactory.class)) { + for (ScalarType type : plugin.createTypes(config, objectMapper)) { add(type); } } - } - - private boolean isPostgresCompatible(DatabasePlatform databasePlatform) { - return databasePlatform.isPlatform(Platform.POSTGRES) - || databasePlatform.isPlatform(Platform.YUGABYTE) - || databasePlatform.isPlatform(Platform.COCKROACH); + 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 hstoreSupport() { @@ -213,22 +163,19 @@ public final class DefaultTypeManager implements TypeManager { /** * Register a custom ScalarType. */ - @Override - public void add(ScalarType scalarType) { - typeMap.put(scalarType.getType(), scalarType); + private void add(ScalarType scalarType) { + typeMap.put(scalarType.type(), scalarType); logAdd(scalarType); } private void logAdd(ScalarType scalarType) { - if (log.isTraceEnabled()) { - String msg = "ScalarType register [" + scalarType.getClass().getName() + "]"; - msg += " for [" + scalarType.getType().getName() + "]"; - log.trace(msg); + if (log.isLoggable(TRACE)) { + log.log(TRACE, "ScalarType register {0} for {1}", scalarType.getClass().getName(), scalarType.type().getName()); } } @Override - public ScalarType getScalarType(String cast) { + public ScalarType type(String cast) { return logicalMap.get(cast); } @@ -236,32 +183,32 @@ 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; + 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")) { 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); @@ -271,7 +218,7 @@ public final class DefaultTypeManager implements TypeManager { /** * Checks the typeMap for inherited types. - * + *

* If e.g. type is a GregorianCalendar, then this method * will check the class hierarchy and will probably return a * ScalarTypeCalendar To speed up a second lookup, it will write @@ -290,7 +237,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 @@ -304,37 +251,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("Type [" + type + "] not supported for @DbArray"); + 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); } @@ -348,69 +295,52 @@ 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); - if (type.equals(String.class)) { return ScalarTypeJsonString.typeFor(postgres, dbType); } - if (type.equals(List.class)) { - DocPropertyType docType = getDocType(genericType); - if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); - } else { - return createJsonObjectMapperType(prop, dbType, docType); + if (jsonMapper != null) { + var markerAnnotation = jsonMapper.markerAnnotation(); + if (markerAnnotation != null && !prop.getMetaAnnotations(markerAnnotation).isEmpty()) { + return createJsonObjectMapperType(prop, dbType, docPropertyType(prop, type)); } } - if (type.equals(Set.class)) { - DocPropertyType docType = getDocType(genericType); - if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); - } else { - return createJsonObjectMapperType(prop, dbType, docType); - } + Type genericType = prop.getGenericType(); + if (type.equals(List.class) && isValueTypeSimple(genericType)) { + return ScalarTypeJsonList.typeFor(postgres, dbType, docType(genericType), prop.isNullable(), keepSource(prop)); } - if (type.equals(Map.class)) { - if (!hasJacksonAnnotations && isMapValueTypeObject(genericType)) { - return ScalarTypeJsonMap.typeFor(postgres, dbType, jsonManager.keepSource(prop)); - } else { - return createJsonObjectMapperType(prop, dbType, DocPropertyType.OBJECT); - } + if (type.equals(Set.class) && isValueTypeSimple(genericType)) { + return ScalarTypeJsonSet.typeFor(postgres, dbType, docType(genericType), prop.isNullable(), keepSource(prop)); + } + if (type.equals(Map.class) && isMapValueTypeObject(genericType)) { + return ScalarTypeJsonMap.typeFor(postgres, dbType, keepSource(prop)); } 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); } - /** - * Returns TRUE, if there is any jackson annotation on that property. All jackson annotations - * are annotated with the @JacksonAnnotation meta annotation. So detection is easy. - */ - private boolean checkJacksonAnnotations(DeployBeanProperty prop) { - return prop.getMetaAnnotation(com.fasterxml.jackson.annotation.JacksonAnnotation.class) != null; + private boolean keepSource(DeployBeanProperty prop) { + if (prop.getMutationDetection() == MutationDetection.DEFAULT) { + prop.setMutationDetection(jsonManager.mutationDetection()); + } + return prop.getMutationDetection() == MutationDetection.SOURCE; } - private DocPropertyType getDocType(Type genericType) { + private DocPropertyType docPropertyType(DeployBeanProperty prop, Class type) { + return type.equals(List.class) || type.equals(Set.class) ? docType(prop.getGenericType()) : DocPropertyType.OBJECT; + } + + private DocPropertyType docType(Type genericType) { if (genericType instanceof Class) { - ScalarType found = getScalarType((Class)genericType); + ScalarType found = type((Class) genericType); if (found != null) { - return found.getDocType(); + return found.docType(); } } return DocPropertyType.OBJECT; @@ -424,7 +354,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); } @@ -437,11 +367,14 @@ public final class DefaultTypeManager implements TypeManager { } private ScalarType createJsonObjectMapperType(DeployBeanProperty prop, int dbType, DocPropertyType docType) { - Class type = prop.getPropertyType(); - if (objectMapper == null) { - throw new IllegalArgumentException("Type [" + type + "] unsupported for @DbJson mapping - Jackson ObjectMapper not present"); + if (jsonMapper == null) { + throw new IllegalArgumentException("Unsupported @DbJson mapping - Jackson ObjectMapper not present for " + prop); } - return ScalarTypeJsonObjectMapper.createTypeFor(jsonManager, prop, dbType, docType); + if (MutationDetection.DEFAULT == prop.getMutationDetection()) { + prop.setMutationDetection(jsonManager.mutationDetection()); + } + var req = new ScalarJsonRequest(jsonManager, dbType, docType, prop.getDesc().getBeanType(), prop.getMutationDetection(), prop.getName()); + return jsonMapper.createType(req); } /** @@ -451,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; @@ -460,15 +393,15 @@ 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.getJdbcType() == jdbcType) { + if (jdbcType == 0 || scalarType.jdbcType() == jdbcType) { // matching type return scalarType; } @@ -492,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); } /** @@ -537,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()) { @@ -566,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; @@ -579,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); @@ -602,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); } /** @@ -619,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 { @@ -676,7 +609,7 @@ public final class DefaultTypeManager implements TypeManager { } add(scalarType); } catch (Exception e) { - log.error("Error loading ScalarType [" + cls.getName() + "]", e); + log.log(ERROR, "Error loading ScalarType " + cls.getName(), e); } } } @@ -701,16 +634,16 @@ 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]); } ScalarTypeConverter converter = foundType.getDeclaredConstructor().newInstance(); ScalarTypeWrapper stw = new ScalarTypeWrapper(logicalType, wrappedType, converter); - log.debug("Register ScalarTypeWrapper from {} -> {} using:{}", logicalType, persistType, foundType); + log.log(DEBUG, "Register ScalarTypeWrapper from {0} -> {1} using:{2}", logicalType, persistType, foundType); add(stw); } catch (Exception e) { - log.error("Error registering ScalarTypeConverter [" + foundType.getName() + "]", e); + log.log(ERROR, "Error registering ScalarTypeConverter " + foundType.getName(), e); } } } @@ -725,44 +658,23 @@ 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]); } AttributeConverter converter = foundType.getDeclaredConstructor().newInstance(); ScalarTypeWrapper stw = new ScalarTypeWrapper(logicalType, wrappedType, new AttributeConverterAdapter(converter)); - log.debug("Register ScalarTypeWrapper from {} -> {} using:{}", logicalType, persistType, foundType); + log.log(DEBUG, "Register ScalarTypeWrapper from {0} -> {1} using:{2}", logicalType, persistType, foundType); add(stw); } catch (Exception e) { - log.error("Error registering AttributeConverter [" + foundType.getName() + "]", e); + log.log(ERROR, "Error registering AttributeConverter " + foundType.getName(), e); } } } - /** - * Add support for Jackson's JsonNode mapping to Clob, Blob, Varchar, JSON and JSONB. - */ - private void initialiseJacksonTypes(DatabaseConfig config) { - if (objectMapper != null) { - log.trace("Registering JsonNode type support"); - 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) { - - ZoneId zoneId = getZoneId(config); + ZoneId zoneId = zoneId(config); typeMap.put(java.nio.file.Path.class, new ScalarTypePath()); addType(java.time.Period.class, new ScalarTypePeriod()); @@ -789,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(); } @@ -799,46 +711,14 @@ 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.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()); - log.debug("registered ScalarTypeJodaLocalTime"); - } else if ("utc".equalsIgnoreCase(jodaLocalTimeMode)) { - // use the old UTC based - addType(LocalTime.class, new ScalarTypeJodaLocalTimeUTC()); - log.debug("registered 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. */ private void initialiseStandard(DatabaseConfig config) { DatabasePlatform databasePlatform = config.getDatabasePlatform(); - int platformClobType = databasePlatform.getClobDbType(); - int platformBlobType = databasePlatform.getBlobDbType(); + int platformClobType = databasePlatform.clobDbType(); + int platformBlobType = databasePlatform.blobDbType(); nativeMap.put(DbPlatformType.HSTORE, hstoreType); @@ -846,7 +726,7 @@ public final class DefaultTypeManager implements TypeManager { addType(Calendar.class, extraTypeFactory.createCalendar(jsonDateTime)); addType(BigInteger.class, extraTypeFactory.createMathBigInteger()); - ScalarTypeBool booleanType = extraTypeFactory.createBoolean(); + final var booleanType = extraTypeFactory.createBoolean(); addType(Boolean.class, booleanType); addType(boolean.class, booleanType); // register the boolean literals to the platform for DDL default values @@ -854,13 +734,13 @@ public final class DefaultTypeManager implements TypeManager { databasePlatform.setDbFalseLiteral(booleanType.getDbFalseLiteral()); // always register Types.BOOLEAN to our boolean type nativeMap.put(Types.BOOLEAN, booleanType); - if (booleanType.getJdbcType() == Types.BIT) { + if (booleanType.jdbcType() == Types.BIT) { // for MapBeans ... BIT types are assumed to be booleans nativeMap.put(Types.BIT, booleanType); } PlatformConfig.DbUuid dbUuid = config.getPlatformConfig().getDbUuid(); - if (offlineMigrationGeneration || (databasePlatform.isNativeUuidType() && dbUuid.useNativeType())) { + if (offlineMigrationGeneration || (databasePlatform.nativeUuidType() && dbUuid.useNativeType())) { addType(UUID.class, new ScalarTypeUUIDNative()); } else { // Store UUID as binary(16) or varchar(40) @@ -883,90 +763,98 @@ public final class DefaultTypeManager implements TypeManager { } addType(File.class, fileType); - addType(Locale.class, localeType); - addType(Currency.class, currencyType); - addType(TimeZone.class, timeZoneType); - addType(URL.class, urlType); - addType(URI.class, uriType); + addType(Locale.class, new ScalarTypeLocale()); + addType(Currency.class, new ScalarTypeCurrency()); + addType(TimeZone.class, new ScalarTypeTimeZone()); + addType(URL.class, new ScalarTypeURL()); + addType(URI.class, new ScalarTypeURI()); // String types - addType(char[].class, charArrayType); - addType(char.class, charType); - addType(String.class, stringType); - nativeMap.put(Types.VARCHAR, stringType); - nativeMap.put(Types.CHAR, stringType); - nativeMap.put(Types.LONGVARCHAR, longVarcharType); + addType(char[].class, new ScalarTypeCharArray()); + addType(char.class, new ScalarTypeChar()); + addType(String.class, ScalarTypeString.INSTANCE); + nativeMap.put(Types.VARCHAR, ScalarTypeString.INSTANCE); + nativeMap.put(Types.CHAR, ScalarTypeString.INSTANCE); + nativeMap.put(Types.LONGVARCHAR, new ScalarTypeLongVarchar()); - // Class - addType(Class.class, classType); + addType(Class.class, new ScalarTypeClass()); if (platformClobType == Types.CLOB) { - nativeMap.put(Types.CLOB, clobType); + nativeMap.put(Types.CLOB, new ScalarTypeClob()); } else { // for Postgres Clobs handled by Varchar ScalarType... ScalarType platClobScalarType = nativeMap.get(platformClobType); if (platClobScalarType == null) { - throw new IllegalArgumentException("Type for dbPlatform clobType [" + clobType + "] not found."); + throw new IllegalArgumentException("Not found dbPlatform clobType " + platformClobType); } nativeMap.put(Types.CLOB, platClobScalarType); } // Binary type + final var varbinaryType = new ScalarTypeBytesVarbinary(); addType(byte[].class, varbinaryType); - nativeMap.put(Types.BINARY, binaryType); nativeMap.put(Types.VARBINARY, varbinaryType); - nativeMap.put(Types.LONGVARBINARY, longVarbinaryType); + nativeMap.put(Types.BINARY, new ScalarTypeBytesBinary()); + nativeMap.put(Types.LONGVARBINARY, new ScalarTypeBytesLongVarbinary()); if (platformBlobType == Types.BLOB) { - nativeMap.put(Types.BLOB, blobType); + nativeMap.put(Types.BLOB, new ScalarTypeBytesBlob()); } else { // for Postgres Blobs handled by LongVarbinary ScalarType... ScalarType platBlobScalarType = nativeMap.get(platformBlobType); if (platBlobScalarType == null) { - throw new IllegalArgumentException("Type for dbPlatform blobType [" + blobType + "] not found."); + throw new IllegalArgumentException("Not found dbPlatform blobType " + platformBlobType); } nativeMap.put(Types.BLOB, platBlobScalarType); } // Number types + final var byteType = new ScalarTypeByte(); addType(Byte.class, byteType); addType(byte.class, byteType); nativeMap.put(Types.TINYINT, byteType); + final var shortType = new ScalarTypeShort(); addType(Short.class, shortType); addType(short.class, shortType); nativeMap.put(Types.SMALLINT, shortType); + final var integerType = new ScalarTypeInteger(); addType(Integer.class, integerType); addType(int.class, integerType); nativeMap.put(Types.INTEGER, integerType); + final var longType = new ScalarTypeLong(); addType(Long.class, longType); addType(long.class, longType); nativeMap.put(Types.BIGINT, longType); + final var doubleType = new ScalarTypeDouble(); addType(Double.class, doubleType); addType(double.class, doubleType); nativeMap.put(Types.FLOAT, doubleType);// no this is not a bug nativeMap.put(Types.DOUBLE, doubleType); + final var floatType = new ScalarTypeFloat(); addType(Float.class, floatType); addType(float.class, floatType); nativeMap.put(Types.REAL, floatType);// no this is not a bug + final var bigDecimalType = new ScalarTypeBigDecimal(); addType(BigDecimal.class, bigDecimalType); nativeMap.put(Types.DECIMAL, bigDecimalType); nativeMap.put(Types.NUMERIC, bigDecimalType); // Temporal types + final var timeType = new ScalarTypeTime(); addType(Time.class, timeType); nativeMap.put(Types.TIME, timeType); - ScalarTypeDate dateType = new ScalarTypeDate(jsonDate); + final var dateType = new ScalarTypeDate(jsonDate); addType(Date.class, dateType); nativeMap.put(Types.DATE, dateType); - ScalarType timestampType = new ScalarTypeTimestamp(jsonDateTime); + final var timestampType = new ScalarTypeTimestamp(jsonDateTime); addType(Timestamp.class, timestampType); nativeMap.put(Types.TIMESTAMP, timestampType); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbIntegerMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbIntegerMap.java index 5f34e31fe..93860f047 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbIntegerMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbIntegerMap.java @@ -51,10 +51,8 @@ final class EnumToDbIntegerMap extends EnumToDbValueMap { return this; } catch (Exception e) { - String msg = "Error converted enum type[" + beanValue.getClass().getName(); - msg += "] enum value[" + beanValue + "] string value [" + stringDbValue + "]"; - msg += " to an Integer."; - throw new PersistenceException(msg, e); + throw new PersistenceException("Error converted enum [" + beanValue.getClass().getName() + + "] value[" + beanValue + "] string value [" + stringDbValue + "] to an Integer.", e); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/IsoJsonDateTimeParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/IsoJsonDateTimeParser.java deleted file mode 100644 index fd4373062..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/IsoJsonDateTimeParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.ebeaninternal.server.type; - -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; - -final class IsoJsonDateTimeParser { - - private static final DateTimeFormatter ISO_MILLIS = new DateTimeFormatterBuilder() - .parseCaseInsensitive() - .appendInstant(3) - .toFormatter(); - - static Instant parseIso(String jsonDateTime) { - return Instant.parse(jsonDateTime); - } - - static String formatIso(Instant value) { - return ISO_MILLIS.format(value); - } -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java index 8b3232b28..c48b0343c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java @@ -36,6 +36,6 @@ class PlatformArrayTypeJsonList implements PlatformArrayTypeFactory { @Override public ScalarType typeForEnum(ScalarType scalarType, boolean nullable) { final ArrayElementConverter.EnumConverter converter = new ArrayElementConverter.EnumConverter(scalarType); - return new ScalarTypeJsonList.VarcharWithConverter(scalarType.getDocType(), nullable, false, converter); + return new ScalarTypeJsonList.VarcharWithConverter(scalarType.docType(), nullable, false, converter); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonSet.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonSet.java index a5c7595f7..d67722b8f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonSet.java @@ -36,6 +36,6 @@ class PlatformArrayTypeJsonSet implements PlatformArrayTypeFactory { @Override public ScalarType typeForEnum(ScalarType scalarType, boolean nullable) { final ArrayElementConverter.EnumConverter converter = new ArrayElementConverter.EnumConverter(scalarType); - return new ScalarTypeJsonSet.VarcharWithConverter(scalarType.getDocType(), nullable, false, converter); + return new ScalarTypeJsonSet.VarcharWithConverter(scalarType.docType(), nullable, false, converter); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java index b0d742956..1ff82ee3f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java @@ -10,6 +10,8 @@ import java.sql.Types; abstract class ScalarTypeArrayBase extends ScalarTypeJsonCollection { + static final Object[] EMPTY_ARRAY = new Object[]{}; + ScalarTypeArrayBase(Class type, int dbType, DocPropertyType docPropertyType, boolean nullable) { super(type, dbType, docPropertyType, nullable); } @@ -71,13 +73,13 @@ abstract class ScalarTypeArrayBase extends ScalarTypeJsonCollection { protected abstract T fromArray(Object[] array1); static String arrayTypeFor(ScalarType scalarType) { - switch (scalarType.getJdbcType()) { + switch (scalarType.jdbcType()) { case Types.INTEGER: return "integer"; case Types.VARCHAR: return "varchar"; default: - throw new IllegalArgumentException("JdbcType [" + scalarType.getJdbcType() + "] not supported for @DbArray mapping on set."); + throw new IllegalArgumentException("JdbcType [" + scalarType.jdbcType() + "] not supported for @DbArray mapping on set."); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java index fdeef6a30..84fdab9fe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java @@ -16,15 +16,9 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.sql.SQLException; import java.sql.Types; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.locks.ReentrantLock; -import static java.util.Collections.EMPTY_LIST; - /** * Type mapped for DB ARRAY type (Postgres only effectively). */ @@ -57,6 +51,9 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp if (valueType.equals(Integer.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER)); } + if (valueType.equals(Float.class)) { + return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "float4", DocPropertyType.DOUBLE, ArrayElementConverter.FLOAT)); + } if (valueType.equals(Double.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "float", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE)); } @@ -74,7 +71,7 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp @Override public ScalarTypeArrayList typeForEnum(ScalarType scalarType, boolean nullable) { - return new ScalarTypeArrayList(nullable, arrayTypeFor(scalarType), scalarType.getDocType(), new ArrayElementConverter.EnumConverter(scalarType)); + return new ScalarTypeArrayList(nullable, arrayTypeFor(scalarType), scalarType.docType(), new ArrayElementConverter.EnumConverter(scalarType)); } } @@ -89,7 +86,7 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return docPropertyType; } @@ -133,7 +130,7 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp if (nullable) { binder.setNull(Types.ARRAY); } else { - binder.setArray(arrayType, toArray(EMPTY_LIST)); + binder.setArray(arrayType, EMPTY_ARRAY); } } @@ -158,7 +155,7 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp /** * Convert from the json types to the proper scalar types (uuid, enum, double etc) */ - @SuppressWarnings("rawtypes") + @SuppressWarnings({"rawtypes", "unchecked"}) private List convert(List rawList) { List list = new ArrayList(rawList.size()); for (Object rawVal : rawList) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java index 6e16fb018..a72c5ec6e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java @@ -14,8 +14,6 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; -import static java.util.Collections.EMPTY_LIST; - /** * H2 database support for DB ARRAY. */ @@ -48,6 +46,9 @@ final class ScalarTypeArrayListH2 extends ScalarTypeArrayList { if (valueType.equals(Integer.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER)); } + if (valueType.equals(Float.class)) { + return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "real", DocPropertyType.DOUBLE, ArrayElementConverter.FLOAT)); + } if (valueType.equals(Double.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "float", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE)); } @@ -87,7 +88,7 @@ final class ScalarTypeArrayListH2 extends ScalarTypeArrayList { if (nullable) { binder.setNull(Types.ARRAY); } else { - binder.setObject(toArray(EMPTY_LIST)); + binder.setObject(EMPTY_ARRAY); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySet.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySet.java index 666d52b10..2929391cb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySet.java @@ -15,16 +15,9 @@ import java.io.IOException; import java.lang.reflect.Type; import java.sql.SQLException; import java.sql.Types; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.locks.ReentrantLock; -import static java.util.Collections.EMPTY_SET; - /** * Type mapped for DB ARRAY type (Postgres only effectively). */ @@ -71,7 +64,7 @@ class ScalarTypeArraySet extends ScalarTypeArrayBase implements ScalarTypeA @Override public ScalarType typeForEnum(ScalarType scalarType, boolean nullable) { - return new ScalarTypeArraySet(nullable, arrayTypeFor(scalarType), scalarType.getDocType(), new ArrayElementConverter.EnumConverter(scalarType)); + return new ScalarTypeArraySet(nullable, arrayTypeFor(scalarType), scalarType.docType(), new ArrayElementConverter.EnumConverter(scalarType)); } } @@ -86,7 +79,7 @@ class ScalarTypeArraySet extends ScalarTypeArrayBase implements ScalarTypeA } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return docPropertyType; } @@ -125,7 +118,7 @@ class ScalarTypeArraySet extends ScalarTypeArrayBase implements ScalarTypeA if (nullable) { binder.setNull(Types.ARRAY); } else { - binder.setArray(arrayType, toArray(EMPTY_SET)); + binder.setArray(arrayType, EMPTY_ARRAY); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySetH2.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySetH2.java index 1d5c78553..874eda11b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySetH2.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArraySetH2.java @@ -13,8 +13,6 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; -import static java.util.Collections.EMPTY_SET; - /** * H2 database support for DB ARRAY. */ @@ -84,7 +82,7 @@ final class ScalarTypeArraySetH2 extends ScalarTypeArraySet { if (nullable) { binder.setNull(Types.ARRAY); } else { - binder.setObject(toArray(EMPTY_SET)); + binder.setObject(EMPTY_ARRAY); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBase.java deleted file mode 100644 index 93ab0a6a6..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBase.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.ebeaninternal.server.type; - -import io.ebean.core.type.DataReader; -import io.ebean.core.type.ScalarType; - -/** - * Base ScalarType object. - */ -abstract class ScalarTypeBase implements ScalarType { - - protected final Class type; - protected final boolean jdbcNative; - protected final int jdbcType; - - ScalarTypeBase(Class type, boolean jdbcNative, int jdbcType) { - this.type = type; - this.jdbcNative = jdbcNative; - this.jdbcType = jdbcType; - } - - @Override - public boolean isJdbcNative() { - return jdbcNative; - } - - @Override - public int getJdbcType() { - return jdbcType; - } - - @Override - public Class getType() { - return type; - } - - @Override - @SuppressWarnings("unchecked") - public String format(Object value) { - return formatValue((T) value); - } - - @Override - public void loadIgnore(DataReader reader) { - reader.incrementPos(1); - } - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBigDecimal.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBigDecimal.java index 0a3e98b6c..c771ff59b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBigDecimal.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBigDecimal.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -57,22 +58,12 @@ class ScalarTypeBigDecimal extends ScalarTypeBase { return new BigDecimal(value); } - @Override - public BigDecimal convertFromMillis(long systemTimeMillis) { - return BigDecimal.valueOf(systemTimeMillis); - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public BigDecimal readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; } else { - return new BigDecimal(dataInput.readDouble()); + return BigDecimal.valueOf(dataInput.readDouble()); } } @@ -97,7 +88,7 @@ class ScalarTypeBigDecimal extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.DOUBLE; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBoolean.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBoolean.java index 848b0fc2a..62aa6c553 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBoolean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBoolean.java @@ -6,8 +6,8 @@ import com.fasterxml.jackson.core.JsonToken; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -146,7 +146,7 @@ public final class ScalarTypeBoolean { } @Override - public int getLength() { + public int length() { return 1; } @@ -233,7 +233,7 @@ public final class ScalarTypeBoolean { } @Override - public int getLength() { + public int length() { return Math.max(trueValue.length(), falseValue.length()); } @@ -358,7 +358,7 @@ public final class ScalarTypeBoolean { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.BOOLEAN; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeByte.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeByte.java index 5437ecb77..e01bc625e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeByte.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeByte.java @@ -5,8 +5,9 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.io.ByteArrayOutputStream; import java.io.DataInput; @@ -25,7 +26,7 @@ final class ScalarTypeByte extends ScalarTypeBase { } @Override - public boolean isBinaryType() { + public boolean binary() { return true; } @@ -71,7 +72,7 @@ final class ScalarTypeByte extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.BINARY; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBase.java index 51f811ede..a5647e8a7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBase.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import io.ebean.text.TextException; import java.io.ByteArrayOutputStream; @@ -22,7 +23,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase { } @Override - public boolean isBinaryType() { + public boolean binary() { return true; } @@ -96,7 +97,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.BINARY; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java index ec753b307..3fdc0f5b2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java @@ -27,7 +27,7 @@ public final class ScalarTypeBytesEncrypted implements ScalarType { } @Override - public boolean isBinaryType() { + public boolean binary() { return true; } @@ -38,33 +38,23 @@ public final class ScalarTypeBytesEncrypted implements ScalarType { } @Override - public int getJdbcType() { - return baseType.getJdbcType(); + public int jdbcType() { + return baseType.jdbcType(); } @Override - public int getLength() { - return baseType.getLength(); + public int length() { + return baseType.length(); } @Override - public Class getType() { + public Class type() { return byte[].class; } @Override - public boolean isDateTimeCapable() { - return baseType.isDateTimeCapable(); - } - - @Override - public boolean isJdbcNative() { - return baseType.isJdbcNative(); - } - - @Override - public void loadIgnore(DataReader reader) { - baseType.loadIgnore(reader); + public boolean jdbcNative() { + return baseType.jdbcNative(); } @Override @@ -80,13 +70,8 @@ public final class ScalarTypeBytesEncrypted implements ScalarType { } @Override - public DocPropertyType getDocType() { - return baseType.getDocType(); - } - - @Override - public String format(Object v) { - throw new RuntimeException("Not used"); + public DocPropertyType docType() { + return baseType.docType(); } @Override @@ -99,11 +84,6 @@ public final class ScalarTypeBytesEncrypted implements ScalarType { return baseType.parse(value); } - @Override - public byte[] convertFromMillis(long systemTimeMillis) { - return baseType.convertFromMillis(systemTimeMillis); - } - @Override public byte[] read(DataReader reader) throws SQLException { byte[] data = baseType.read(reader); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCalendar.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCalendar.java index 9028523b4..8ac56e517 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCalendar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCalendar.java @@ -2,7 +2,8 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; import io.ebean.core.type.DataBinder; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBaseDateTime; +import io.ebean.core.type.BasicTypeConverter; import java.sql.Date; import java.sql.SQLException; @@ -11,7 +12,7 @@ import java.sql.Types; import java.time.Instant; import java.util.Calendar; -import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.formatIso; +import static io.ebean.core.type.ScalarTypeUtils.formatInstant; /** * ScalarType for java.util.Calendar. @@ -65,7 +66,7 @@ final class ScalarTypeCalendar extends ScalarTypeBaseDateTime { @Override protected String toJsonISO8601(Calendar value) { - return formatIso(value.toInstant()); + return formatInstant(value.toInstant()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java index 6be7012b6..bf181dd2e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeChar.java @@ -2,7 +2,8 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBaseVarchar; +import io.ebean.core.type.BasicTypeConverter; import java.sql.SQLException; import java.sql.Types; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java index 869614f9d..ff74e0cfe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCharArray.java @@ -1,10 +1,10 @@ package io.ebeaninternal.server.type; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBaseVarchar; +import io.ebean.core.type.BasicTypeConverter; import java.io.IOException; import java.sql.SQLException; @@ -75,8 +75,4 @@ final class ScalarTypeCharArray extends ScalarTypeBaseVarchar { public char[] jsonRead(JsonParser parser) throws IOException { return parser.getValueAsString().toCharArray(); } - - public void jsonWrite(JsonGenerator ctx, String name, char[] value) throws IOException { - ctx.writeStringField(name, String.valueOf(value)); - } } 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 6c9f18b82..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,8 @@ 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; import java.sql.SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClass.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClass.java index 44fb1c475..3fae086ec 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClass.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClass.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; + import javax.persistence.PersistenceException; /** @@ -13,7 +15,7 @@ final class ScalarTypeClass extends ScalarTypeBaseVarchar { } @Override - public int getLength() { + public int length() { return 255; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCurrency.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCurrency.java index 194e43c32..ad38e6efb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCurrency.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeCurrency.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; + import java.util.Currency; /** @@ -12,7 +14,7 @@ final class ScalarTypeCurrency extends ScalarTypeBaseVarchar { } @Override - public int getLength() { + public int length() { return 3; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDate.java index 84d7330da..bc4ac8aad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDate.java @@ -3,7 +3,8 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBaseDate; +import io.ebean.core.type.BasicTypeConverter; import java.sql.Date; import java.sql.SQLException; @@ -12,7 +13,7 @@ import java.sql.Types; /** * ScalarType for java.sql.Date. */ -final class ScalarTypeDate extends ScalarTypeBaseDate { +final class ScalarTypeDate extends ScalarTypeBaseDate { ScalarTypeDate(JsonConfig.Date mode) { super(mode, Date.class, true, Types.DATE); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDouble.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDouble.java index 5877c5d4a..3fe5deba0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDouble.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDouble.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -56,16 +57,6 @@ final class ScalarTypeDouble extends ScalarTypeBase { return Double.valueOf(value); } - @Override - public Double convertFromMillis(long systemTimeMillis) { - return (double) systemTimeMillis; - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public Double readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -96,7 +87,7 @@ final class ScalarTypeDouble extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.DOUBLE; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java index 5daff6f4c..1589a22af 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDuration.java @@ -2,11 +2,7 @@ package io.ebeaninternal.server.type; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; -import io.ebean.core.type.DataBinder; -import io.ebean.core.type.DataReader; -import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.*; import java.io.DataInput; import java.io.DataOutput; @@ -30,11 +26,11 @@ class ScalarTypeDuration extends ScalarTypeBase { } BigDecimal convertToBigDecimal(Duration value) { - return (value == null) ? null : DecimalUtils.toDecimal(value); + return (value == null) ? null : ScalarTypeUtils.toDecimal(value); } Duration convertFromBigDecimal(BigDecimal value) { - return (value == null) ? null : DecimalUtils.toDuration(value); + return (value == null) ? null : ScalarTypeUtils.toDuration(value); } @Override @@ -104,7 +100,7 @@ class ScalarTypeDuration extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.KEYWORD; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java index 9ba27cc6c..f298debd8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.math.BigDecimal; import java.sql.SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java index 392fc1b86..627d32a65 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java @@ -31,13 +31,13 @@ public final class ScalarTypeEncryptedWrapper implements ScalarType, Local } @Override - public boolean isBinaryType() { - return wrapped.isBinaryType(); + public boolean binary() { + return wrapped.binary(); } @Override - public boolean isMutable() { - return wrapped.isMutable(); + public boolean mutable() { + return wrapped.mutable(); } @Override @@ -80,41 +80,25 @@ public final class ScalarTypeEncryptedWrapper implements ScalarType, Local } @Override - public int getJdbcType() { - return byteArrayType.getJdbcType(); + public int jdbcType() { + return byteArrayType.jdbcType(); } @Override - public int getLength() { - return byteArrayType.getLength(); + public int length() { + return byteArrayType.length(); } @Override - public Class getType() { - return wrapped.getType(); + public Class type() { + return wrapped.type(); } @Override - public boolean isDateTimeCapable() { - return wrapped.isDateTimeCapable(); - } - - @Override - public boolean isJdbcNative() { + public boolean jdbcNative() { return false; } - @Override - public void loadIgnore(DataReader dataReader) { - wrapped.loadIgnore(dataReader); - } - - @Override - @SuppressWarnings("unchecked") - public String format(Object v) { - return formatValue((T) v); - } - @Override public String formatValue(T v) { return wrapped.formatValue(v); @@ -125,11 +109,6 @@ public final class ScalarTypeEncryptedWrapper implements ScalarType, Local return wrapped.parse(value); } - @Override - public T convertFromMillis(long systemTimeMillis) { - return wrapped.convertFromMillis(systemTimeMillis); - } - @Override public T toBeanType(Object value) { return wrapped.toBeanType(value); @@ -151,8 +130,8 @@ public final class ScalarTypeEncryptedWrapper implements ScalarType, Local } @Override - public DocPropertyType getDocType() { - return wrapped.getDocType(); + public DocPropertyType docType() { + return wrapped.docType(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java index d33b06af4..2596b68f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; +import io.ebean.core.type.ScalarTypeBase; import javax.persistence.EnumType; import java.io.DataInput; @@ -73,7 +73,7 @@ final class ScalarTypeEnumStandard { } @Override - public int getLength() { + public int length() { return length; } @@ -163,8 +163,7 @@ final class ScalarTypeEnumStandard { return null; } else { if (ordinal < 0 || ordinal >= enumArray.length) { - String m = "Unexpected ordinal [" + ordinal + "] out of range [" + enumArray.length + "]"; - throw new IllegalStateException(m); + throw new IllegalStateException("Unexpected ordinal " + ordinal + " out of range " + enumArray.length); } return enumArray[ordinal]; } @@ -196,8 +195,7 @@ final class ScalarTypeEnumStandard { ordinal = Integer.parseInt(dbValue.toString()); } if (ordinal < 0 || ordinal >= enumArray.length) { - String m = "Unexpected ordinal [" + ordinal + "] out of range [" + enumArray.length + "]"; - throw new IllegalStateException(m); + throw new IllegalStateException("Unexpected ordinal " + ordinal + " out of range " + enumArray.length); } return enumArray[ordinal]; } @@ -248,7 +246,7 @@ final class ScalarTypeEnumStandard { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.ENUM; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java index 287c11f60..9054a4546 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java @@ -64,7 +64,7 @@ class ScalarTypeEnumWithMapping extends ScalarTypeEnumStandard.EnumBase implemen * Return the DB column length for storing the enum value. */ @Override - public int getLength() { + public int length() { return length; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFile.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFile.java index be712b659..5e4ad5df8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFile.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFile.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import io.ebean.text.TextException; import io.ebeaninternal.api.CoreLog; @@ -12,6 +13,8 @@ import java.io.*; import java.sql.SQLException; import java.sql.Types; +import static java.lang.System.Logger.Level.ERROR; + /** * ScalarType for streaming between a File and the database. */ @@ -41,7 +44,7 @@ final class ScalarTypeFile extends ScalarTypeBase { } @Override - public boolean isBinaryType() { + public boolean binary() { return true; } @@ -115,7 +118,7 @@ final class ScalarTypeFile extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.BINARY; } @@ -143,12 +146,10 @@ final class ScalarTypeFile extends ScalarTypeBase { /** * Helper method to pump bytes from input to output. */ - public long pump(InputStream is, OutputStream out) throws IOException { - + public void pump(InputStream is, OutputStream out) throws IOException { long totalBytes = 0; InputStream input = null; OutputStream output = null; - try { input = new BufferedInputStream(is, bufferSize); output = new BufferedOutputStream(out, bufferSize); @@ -159,24 +160,20 @@ final class ScalarTypeFile extends ScalarTypeBase { output.write(buffer, 0, length); totalBytes += length; } - output.flush(); - - return totalBytes; - } finally { if (output != null) { try { output.close(); } catch (IOException e) { - CoreLog.log.error("Error when closing outputstream", e); + CoreLog.log.log(ERROR, "Error when closing outputStream", e); } } if (input != null) { try { input.close(); } catch (IOException e) { - CoreLog.log.error("Error when closing inputstream ", e); + CoreLog.log.log(ERROR, "Error when closing inputStream ", e); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFloat.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFloat.java index fd13f2082..facea6618 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFloat.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeFloat.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -56,16 +57,6 @@ final class ScalarTypeFloat extends ScalarTypeBase { return Float.valueOf(value); } - @Override - public Float convertFromMillis(long systemTimeMillis) { - return (float) systemTimeMillis; - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public Float readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -96,7 +87,7 @@ final class ScalarTypeFloat extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.FLOAT; } 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 122fdcc5a..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,8 @@ 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; import java.sql.SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddress.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddress.java index 166a81280..8d0fefd0a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddress.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInetAddress.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; import io.ebean.text.TextException; import java.net.InetAddress; @@ -14,7 +15,7 @@ final class ScalarTypeInetAddress extends ScalarTypeBaseVarchar { } @Override - public int getLength() { + public int length() { return 50; } 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 a4ff9074d..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,8 @@ 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; import java.net.InetAddress; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java index d3fbee011..76654be74 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInstant.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; +import io.ebean.core.type.ScalarTypeBaseDateTime; import java.sql.Timestamp; import java.sql.Types; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInteger.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInteger.java index 0e1ef6075..aea3b8d16 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInteger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeInteger.java @@ -5,8 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -86,16 +86,6 @@ final class ScalarTypeInteger extends ScalarTypeBase { return Integer.valueOf(value); } - @Override - public Integer convertFromMillis(long systemTimeMillis) { - throw new TextException("Not Supported"); - } - - @Override - public boolean isDateTimeCapable() { - return false; - } - @Override public Integer jsonRead(JsonParser parser) throws IOException { return parser.getIntValue(); @@ -107,7 +97,7 @@ final class ScalarTypeInteger extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.INTEGER; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java index e78f6b02d..d42d82b26 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import java.io.DataInput; import java.io.DataOutput; @@ -52,7 +53,7 @@ abstract class ScalarTypeJsonCollection extends ScalarTypeBase implements * Consider as a mutable type. Use the isDirty() method to check for dirty state. */ @Override - public boolean isMutable() { + public boolean mutable() { return true; } @@ -76,7 +77,7 @@ abstract class ScalarTypeJsonCollection extends ScalarTypeBase implements } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return docPropertyType; } 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 4abd85931..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; @@ -118,7 +115,7 @@ final class ScalarTypeJsonList { } @Override - public final boolean isJsonMapper() { + public final boolean jsonMapper() { return keepSource; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java index 96030c23f..a97b9911c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java @@ -6,6 +6,7 @@ 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.ScalarTypeBase; import io.ebean.text.TextException; import io.ebean.text.json.EJson; import io.ebean.util.IOUtils; @@ -123,7 +124,7 @@ abstract class ScalarTypeJsonMap extends ScalarTypeBase { * Map is a mutable type. Use the isDirty() method to check for dirty state. */ @Override - public final boolean isMutable() { + public final boolean mutable() { return true; } @@ -136,7 +137,7 @@ abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public final boolean isJsonMapper() { + public final boolean jsonMapper() { return keepSource; } @@ -244,7 +245,7 @@ abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public final DocPropertyType getDocType() { + public final DocPropertyType docType() { return DocPropertyType.OBJECT; } 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 354d793d7..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; @@ -74,7 +71,7 @@ final class ScalarTypeJsonSet { try { return convertElements(EJson.parseSet(value, false)); } catch (IOException e) { - throw new PersistenceException("Failed to parse JSON content as Set: [" + value + "]", e); + throw new PersistenceException("Failed to parse JSON content as Set: " + value, e); } } } @@ -116,7 +113,7 @@ final class ScalarTypeJsonSet { } @Override - public final boolean isJsonMapper() { + public final boolean jsonMapper() { return keepSource; } @@ -177,7 +174,7 @@ final class ScalarTypeJsonSet { try { return convertList(EJson.parseList(value)); } catch (IOException e) { - throw new PersistenceException("Failed to parse JSON content as Set: [" + value + "]", e); + throw new PersistenceException("Failed to parse JSON content as Set: " + value, e); } } 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/ScalarTypeLocalDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java index c3e26ce56..3176a1886 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java @@ -8,7 +8,8 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import io.ebean.config.JsonConfig; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBaseDate; +import io.ebean.core.type.BasicTypeConverter; /** * ScalarType for java.time.LocalDate. This maps to a JDBC Date. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java index 5e697029d..3de0184e1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDateTime.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import io.ebean.config.JsonConfig; import io.ebean.config.dbplatform.ExtraDbTypes; +import io.ebean.core.type.ScalarTypeBaseDateTime; import java.io.IOException; import java.sql.Timestamp; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTime.java index f851bdcfa..d43f0e6cb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTime.java @@ -5,8 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -86,16 +86,6 @@ class ScalarTypeLocalTime extends ScalarTypeBase { return LocalTime.parse(value); } - @Override - public boolean isDateTimeCapable() { - return false; - } - - @Override - public LocalTime convertFromMillis(long systemTimeMillis) { - throw new TextException("Not Supported"); - } - @Override public LocalTime jsonRead(JsonParser parser) throws IOException { return LocalTime.parse(parser.getValueAsString()); @@ -107,7 +97,7 @@ class ScalarTypeLocalTime extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.KEYWORD; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTimeWithNanos.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTimeWithNanos.java index 237c2f633..aa6adb996 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTimeWithNanos.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalTimeWithNanos.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.BasicTypeConverter; import java.sql.SQLException; import java.sql.Types; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocale.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocale.java index 88190593a..5afed0e38 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocale.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocale.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; + import java.util.Locale; /** @@ -12,7 +14,7 @@ final class ScalarTypeLocale extends ScalarTypeBaseVarchar { } @Override - public int getLength() { + public int length() { return 20; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLong.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLong.java index 3409cc9ed..b04a0a936 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLong.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLong.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -66,16 +67,6 @@ final class ScalarTypeLong extends ScalarTypeBase { return value; } - @Override - public Long convertFromMillis(long systemTimeMillis) { - return systemTimeMillis; - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public Long readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -106,7 +97,7 @@ final class ScalarTypeLong extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.LONG; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMathBigInteger.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMathBigInteger.java index aa6d7d4b5..29ee7316c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMathBigInteger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMathBigInteger.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -48,7 +49,7 @@ final class ScalarTypeMathBigInteger extends ScalarTypeBase { @Override public BigInteger toBeanType(Object value) { - return BasicTypeConverter.toMathBigInteger(value); + return BasicTypeConverter.toBigInteger(value); } @Override @@ -61,16 +62,6 @@ final class ScalarTypeMathBigInteger extends ScalarTypeBase { return new BigInteger(value); } - @Override - public BigInteger convertFromMillis(long systemTimeMillis) { - return BigInteger.valueOf(systemTimeMillis); - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public BigInteger readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -101,7 +92,7 @@ final class ScalarTypeMathBigInteger extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.LONG; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonthDay.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonthDay.java index f655894ee..95d339bc5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonthDay.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonthDay.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarTypeBase; import java.io.DataInput; import java.io.DataOutput; @@ -111,7 +112,7 @@ final class ScalarTypeMonthDay extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.KEYWORD; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeNotFound.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeNotFound.java index ef0495296..235ea7334 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeNotFound.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeNotFound.java @@ -24,17 +24,17 @@ class ScalarTypeNotFound implements ScalarType { private ScalarTypeNotFound() { } @Override - public boolean isJdbcNative() { + public boolean jdbcNative() { throw new UnsupportedOperationException(); } @Override - public int getJdbcType() { + public int jdbcType() { throw new UnsupportedOperationException(); } @Override - public Class getType() { + public Class type() { throw new UnsupportedOperationException(); } @@ -43,11 +43,6 @@ class ScalarTypeNotFound implements ScalarType { throw new UnsupportedOperationException(); } - @Override - public void loadIgnore(DataReader reader) { - throw new UnsupportedOperationException(); - } - @Override public void bind(DataBinder binder, Void value) throws SQLException { throw new UnsupportedOperationException(); @@ -68,18 +63,13 @@ class ScalarTypeNotFound implements ScalarType { throw new UnsupportedOperationException(); } - @Override - public String format(Object value) { - throw new UnsupportedOperationException(); - } - @Override public Void parse(String value) { throw new UnsupportedOperationException(); } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { throw new UnsupportedOperationException(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java index f7e151238..0f0b053cf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; +import io.ebean.core.type.ScalarTypeBaseDateTime; import java.sql.Timestamp; import java.sql.Types; @@ -8,7 +9,7 @@ import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneId; -import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.formatIso; +import static io.ebean.core.type.ScalarTypeUtils.formatInstant; /** * ScalarType for java.sql.Timestamp. @@ -29,7 +30,7 @@ final class ScalarTypeOffsetDateTime extends ScalarTypeBaseDateTime { } @Override - public int getLength() { + public int length() { return 25; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePath.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePath.java index a5e318881..40c1d948d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePath.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; + import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Path; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java index 9b0175173..91d0e074f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePeriod.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.ScalarTypeBaseVarchar; + import java.time.Period; /** @@ -12,7 +14,7 @@ final class ScalarTypePeriod extends ScalarTypeBaseVarchar { } @Override - public int getLength() { + public int length() { return 20; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java index 2f33dc929..92bd4a450 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java @@ -6,6 +6,7 @@ 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.ScalarTypeBase; import io.ebean.text.TextException; import io.ebean.text.json.EJson; import io.ebeaninternal.json.ModifyAwareMap; @@ -27,7 +28,7 @@ final class ScalarTypePostgresHstore extends ScalarTypeBase { } @Override - public boolean isMutable() { + public boolean mutable() { return true; } @@ -114,7 +115,7 @@ final class ScalarTypePostgresHstore extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.OBJECT; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeShort.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeShort.java index 11bfa7b22..059b68a1a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeShort.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeShort.java @@ -5,8 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebean.text.TextException; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -87,7 +87,7 @@ final class ScalarTypeShort extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.SHORT; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeStringBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeStringBase.java index d0ea5a278..4b260e096 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeStringBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeStringBase.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -56,16 +57,6 @@ abstract class ScalarTypeStringBase extends ScalarTypeBase { return value; } - @Override - public String convertFromMillis(long systemTimeMillis) { - return String.valueOf(systemTimeMillis); - } - - @Override - public boolean isDateTimeCapable() { - return true; - } - @Override public String readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { @@ -96,7 +87,7 @@ abstract class ScalarTypeStringBase extends ScalarTypeBase { } @Override - public DocPropertyType getDocType() { + public DocPropertyType docType() { return DocPropertyType.TEXT; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeTime.java index 8328edfbe..a301da7ed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeTime.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.core.JsonParser; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.server.core.BasicTypeConverter; +import io.ebean.core.type.ScalarTypeBase; +import io.ebean.core.type.BasicTypeConverter; import java.io.DataInput; import java.io.DataOutput; @@ -57,16 +58,10 @@ final class ScalarTypeTime extends ScalarTypeBase