diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 8575f4580..357f8aefb 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,9 +1,3 @@ - -GITHUB ISSUES ARE STRICTLY CONTROLLED FOR THIS PROJECT. - -Refer to http://ebean-orm.github.io/support for the policies controlling the use of github issues. -Please post issues to the Ebean group https://groups.google.com/forum/#!forum/ebean first. - ## Expected behavior ## Actual behavior diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index d3868ff91..b6adad05d 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean api @@ -50,7 +50,7 @@ io.ebean ebean-annotation - 7.0 + 7.2 diff --git a/ebean-api/src/main/java/io/ebean/DatabaseFactory.java b/ebean-api/src/main/java/io/ebean/DatabaseFactory.java index 4aace866a..588f48c24 100644 --- a/ebean-api/src/main/java/io/ebean/DatabaseFactory.java +++ b/ebean-api/src/main/java/io/ebean/DatabaseFactory.java @@ -16,18 +16,15 @@ import java.util.concurrent.locks.ReentrantLock; *

* This uses either DatabaseConfig or properties in the application.properties file to * configure and create a Database instance. - *

*

* The Database instance can either be registered with the DB singleton or * not. The DB singleton effectively holds a map of Database by a name. * If the Database is registered with the DB singleton you can retrieve it * later via {@link DB#byName(String)}. - *

*

* One Database can be nominated as the 'default/primary' Database. Many * methods on the DB singleton such as {@link DB#find(Class)} are just a * convenient way of using the 'default/primary' Database. - *

*/ public class DatabaseFactory { @@ -48,7 +45,7 @@ public class DatabaseFactory { public static void initialiseContainer(ContainerConfig containerConfig) { lock.lock(); try { - getContainer(containerConfig); + container(containerConfig); } finally { lock.unlock(); } @@ -60,7 +57,7 @@ public class DatabaseFactory { public static Database create(String name) { lock.lock(); try { - return getContainer(null).createServer(name); + return container(null).createServer(name); } finally { lock.unlock(); } @@ -68,6 +65,16 @@ public class DatabaseFactory { /** * Create using the DatabaseConfig object to configure the database. + * + *
{@code
+   *
+   *   DatabaseConfig config = new DatabaseConfig();
+   *   config.setName("db");
+   *   config.loadProperties();
+   *
+   *   Database database = DatabaseFactory.create(config);
+   *
+   * }
*/ public static Database create(DatabaseConfig config) { lock.lock(); @@ -115,7 +122,6 @@ public class DatabaseFactory { * Shutdown gracefully all Database instances cleaning up any resources as required. *

* This is typically invoked via JVM shutdown hook and not explicitly called. - *

*/ public static void shutdown() { lock.lock(); @@ -127,15 +133,15 @@ public class DatabaseFactory { } private static Database createInternal(DatabaseConfig config) { - return getContainer(config.getContainerConfig()).createServer(config); + return container(config.getContainerConfig()).createServer(config); } /** - * Get the EbeanContainer initialising it if necessary. + * Return the SpiContainer initialising it if necessary. * * @param containerConfig the configuration controlling clustering communication */ - private static SpiContainer getContainer(ContainerConfig containerConfig) { + private static SpiContainer container(ContainerConfig containerConfig) { // thread safe in that all calling methods hold lock if (container != null) { return container; diff --git a/ebean-api/src/main/java/io/ebean/bean/EntityBean.java b/ebean-api/src/main/java/io/ebean/bean/EntityBean.java index 03d1195c8..ee54991ad 100644 --- a/ebean-api/src/main/java/io/ebean/bean/EntityBean.java +++ b/ebean-api/src/main/java/io/ebean/bean/EntityBean.java @@ -27,17 +27,6 @@ public interface EntityBean extends Serializable { throw new NotEnhancedException(); } - /** - * Return the enhancement marker value. - *

- * This is the class name of the enhanced class and used to check that all - * entity classes are enhanced (specifically not just a super class). - *

- */ - default String _ebean_getMarker() { - throw new NotEnhancedException(); - } - /** * Create and return a new entity bean instance. */ diff --git a/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java b/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java index 28a088ce6..527860200 100644 --- a/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java +++ b/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java @@ -51,6 +51,11 @@ public final class EntityBeanIntercept implements Serializable { */ private static final byte FLAG_ORIG_VALUE_SET = 8; + /** + * Flags indicating if the mutable hash is set. + */ + private static final byte FLAG_MUTABLE_HASH_SET = 16; + private transient final ReentrantLock lock = new ReentrantLock(); private transient NodeUsageCollector nodeUsageCollector; private transient PersistenceContext persistenceContext; @@ -91,6 +96,17 @@ public final class EntityBeanIntercept implements Serializable { private Object ownerId; private int sortOrder; + /** + * Holds information of json loaded jackson beans (e.g. the original json or checksum). + */ + private MutableValueInfo[] mutableInfo; + + /** + * Holds json content determined at point of dirty check. + * Stored here on dirty check such that we only convert to json once. + */ + private MutableValueNext[] mutableNext; + /** * Create a intercept with a given entity. */ @@ -228,6 +244,17 @@ public final class EntityBeanIntercept implements Serializable { * if any embedded beans are either new or dirty (and hence need saving). */ public boolean isDirty() { + if (dirty) { + return true; + } + if (mutableInfo != null) { + for (int i = 0; i < mutableInfo.length; i++) { + if (mutableInfo[i] != null && !mutableInfo[i].isEqualToObject(owner._ebean_getField(i))) { + dirty = true; + break; + } + } + } return dirty; } @@ -368,8 +395,18 @@ public final class EntityBeanIntercept implements Serializable { this.owner._ebean_setEmbeddedLoaded(); this.lazyLoadProperty = -1; this.origValues = null; + // after save, transfer the mutable next values back to mutable info + if (mutableNext != null) { + for (int i = 0; i < mutableNext.length; i++) { + MutableValueNext next = mutableNext[i]; + if (next != null) { + mutableInfo(i, next.info()); + } + } + } + this.mutableNext = null; for (int i = 0; i < flags.length; i++) { - flags[i] &= ~(FLAG_CHANGED_PROP + FLAG_ORIG_VALUE_SET); + flags[i] &= ~(FLAG_CHANGED_PROP | FLAG_ORIG_VALUE_SET); } this.dirty = false; } @@ -442,6 +479,10 @@ public final class EntityBeanIntercept implements Serializable { * Return the original value that was changed via an update. */ public Object getOrigValue(int propertyIndex) { + if ((flags[propertyIndex] & (FLAG_ORIG_VALUE_SET | FLAG_MUTABLE_HASH_SET)) == FLAG_MUTABLE_HASH_SET) { + // mutable hash set, but not ORIG_VALUE + setOriginalValue(propertyIndex, mutableInfo[propertyIndex].get()); + } if (origValues == null) { return null; } @@ -638,7 +679,7 @@ public final class EntityBeanIntercept implements Serializable { public void addDirtyPropertyNames(Set props, String prefix) { int len = getPropertyLength(); for (int i = 0; i < len; i++) { - if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + if (isChangedProp(i)) { // the property has been changed on this bean props.add((prefix == null ? getProperty(i) : prefix + getProperty(i))); } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) { @@ -656,7 +697,7 @@ public final class EntityBeanIntercept implements Serializable { String[] names = owner._ebean_getPropertyNames(); int len = getPropertyLength(); for (int i = 0; i < len; i++) { - if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + if (isChangedProp(i)) { if (propertyNames.contains(names[i])) { return true; } @@ -684,7 +725,7 @@ public final class EntityBeanIntercept implements Serializable { public void addDirtyPropertyValues(Map dirtyValues, String prefix) { int len = getPropertyLength(); for (int i = 0; i < len; i++) { - if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + if (isChangedProp(i)) { // the property has been changed on this bean String propName = (prefix == null ? getProperty(i) : prefix + getProperty(i)); Object newVal = owner._ebean_getField(i); @@ -706,7 +747,7 @@ public final class EntityBeanIntercept implements Serializable { public void addDirtyPropertyValues(BeanDiffVisitor visitor) { int len = getPropertyLength(); for (int i = 0; i < len; i++) { - if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + if (isChangedProp(i)) { // the property has been changed on this bean Object newVal = owner._ebean_getField(i); Object oldVal = getOrigValue(i); @@ -741,7 +782,7 @@ public final class EntityBeanIntercept implements Serializable { } int len = getPropertyLength(); for (int i = 0; i < len; i++) { - if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + if ((flags[i] & FLAG_CHANGED_PROP) != 0) { // we do not check against mutablecontent here. sb.append(i).append(','); } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) { // an embedded property has been changed - recurse @@ -1138,4 +1179,60 @@ public final class EntityBeanIntercept implements Serializable { } return ret; } + + private boolean isChangedProp(int i) { + if ((flags[i] & FLAG_CHANGED_PROP) != 0) { + return true; + } else if (mutableInfo == null || mutableInfo[i] == null || mutableInfo[i].isEqualToObject(owner._ebean_getField(i))) { + return false; + } else { + // mark for change + flags[i] |= FLAG_CHANGED_PROP; + dirty = true; // this makes the bean automatically dirty! + return true; + } + } + + /** + * Return the MutableValueInfo for the given property or null. + */ + public MutableValueInfo mutableInfo(int propertyIndex) { + return mutableInfo == null ? null : mutableInfo[propertyIndex]; + } + + /** + * Set the MutableValueInfo for the given property. + */ + public void mutableInfo(int propertyIndex, MutableValueInfo info) { + if (mutableInfo == null) { + mutableInfo = new MutableValueInfo[flags.length]; + } + flags[propertyIndex] |= FLAG_MUTABLE_HASH_SET; + mutableInfo[propertyIndex] = info; + } + + /** + * Dirty detection set the next mutable property content and info . + *

+ * Set here as the mutable property dirty detection is based on json content comparison. + * We only want to perform the json serialisation once so storing it here as part of + * dirty detection so that we can get it back to bind in insert or update etc. + */ + public void mutableNext(int propertyIndex, MutableValueNext next) { + if (mutableNext == null) { + mutableNext = new MutableValueNext[flags.length]; + } + mutableNext[propertyIndex] = next; + } + + /** + * Update the 'next' mutable info returning the content that was obtained via dirty detection. + */ + public String mutableNext(int propertyIndex) { + if (mutableNext == null) { + return null; + } + return mutableNext[propertyIndex].content(); + } + } diff --git a/ebean-api/src/main/java/io/ebean/bean/MutableValueInfo.java b/ebean-api/src/main/java/io/ebean/bean/MutableValueInfo.java new file mode 100644 index 000000000..27716b13c --- /dev/null +++ b/ebean-api/src/main/java/io/ebean/bean/MutableValueInfo.java @@ -0,0 +1,42 @@ +package io.ebean.bean; + +/** + * Holds information on mutable values (like plain beans stored as json). + *

+ * Used internally in EntityBeanIntercept for dirty detection on mutable values. + * Typically, mutation detection is based on a hash/checksum of json content or the + * original json content itself. + *

+ * Refer to the mapping options {@code @DbJson(mutationDetection)}. + */ +public interface MutableValueInfo { + + /** + * Compares the given json returning null if deemed unchanged or returning + * the MutableValueNext to use if deemed dirty/changed. + *

+ * Returning MutableValueNext allows an implementation based on hash/checksum + * to only perform that computation once. + * + * @return Null if deemed unchanged or the MutableValueNext if deemed changed. + */ + MutableValueNext nextDirty(String json); + + /** + * Compares the given object to an internal value. + *

+ * This is used to support changelog/beanState. The implementation can serialize the + * object into json form and compare it against the original json. + */ + boolean isEqualToObject(Object obj); + + /** + * Creates a new instance from the internal json string. + *

+ * This is used to provide an original/old value for change logging / persist listeners. + * This is only available for properties that have {@code @DbJson(keepSource=true)}. + */ + default Object get() { + return null; + } +} diff --git a/ebean-api/src/main/java/io/ebean/bean/MutableValueNext.java b/ebean-api/src/main/java/io/ebean/bean/MutableValueNext.java new file mode 100644 index 000000000..401d3c223 --- /dev/null +++ b/ebean-api/src/main/java/io/ebean/bean/MutableValueNext.java @@ -0,0 +1,17 @@ +package io.ebean.bean; + +/** + * Represents a next value to use for mutable content properties (DbJson with jackson beans). + */ +public interface MutableValueNext { + + /** + * Return the next content to use. Provided such that we serialise to json once. + */ + String content(); + + /** + * Return the next MutableValueInfo to use after an update. + */ + MutableValueInfo info(); +} 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 bc3ae587f..873304c3a 100644 --- a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java @@ -7,9 +7,7 @@ import io.ebean.EbeanVersion; import io.ebean.PersistenceContextScope; import io.ebean.Query; import io.ebean.Transaction; -import io.ebean.annotation.Encrypted; -import io.ebean.annotation.PersistBatch; -import io.ebean.annotation.Platform; +import io.ebean.annotation.*; import io.ebean.cache.ServerCachePlugin; import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.DbEncrypt; @@ -194,10 +192,9 @@ public class DatabaseConfig { private JsonConfig.Include jsonInclude = JsonConfig.Include.ALL; /** - * When true then by default DbJson beans are assumed to be dirty. - * I believe we want to change this default to false in the future. + * The default mode used for {@code @DbJson} with Jackson ObjectMapper. */ - private boolean jsonDirtyByDefault = true; + private MutationDetection jsonMutationDetection = MutationDetection.HASH; /** * The database platform name. Used to imply a DatabasePlatform to use. @@ -322,6 +319,8 @@ public class DatabaseConfig { */ private ExternalTransactionManager externalTransactionManager; + private boolean skipDataSourceCheck; + /** * The data source (if programmatically provided). */ @@ -744,23 +743,21 @@ public class DatabaseConfig { } /** - * Return true if DbJson beans are assumed dirty by default. - *

- * That is, when true beans that do not implement ModifyAwareType are by - * default assumed to be dirty and included in updates. + * Return the default MutableDetection to use with {@code @DbJson} using Jackson. + * + * @see DbJson#mutationDetection() */ - public boolean isJsonDirtyByDefault() { - return jsonDirtyByDefault; + public MutationDetection getJsonMutationDetection() { + return jsonMutationDetection; } /** - * Set to false if we want DbJson beans to not be assumed to be dirty. - *

- * That is, when true beans that do not implement ModifyAwareType are by - * default assumed to be dirty and included in updates. + * Set the default MutableDetection to use with {@code @DbJson} using Jackson. + * + * @see DbJson#mutationDetection() */ - public void setJsonDirtyByDefault(boolean jsonDirtyByDefault) { - this.jsonDirtyByDefault = jsonDirtyByDefault; + public void setJsonMutationDetection(MutationDetection jsonMutationDetection) { + this.jsonMutationDetection = jsonMutationDetection; } /** @@ -1656,6 +1653,20 @@ public class DatabaseConfig { this.autoTuneConfig = autoTuneConfig; } + /** + * Return true if the startup DataSource check should be skipped. + */ + public boolean skipDataSourceCheck() { + return skipDataSourceCheck; + } + + /** + * Set to true to skip the startup DataSource check. + */ + public void setSkipDataSourceCheck(boolean skipDataSourceCheck) { + this.skipDataSourceCheck = skipDataSourceCheck; + } + /** * Return the DataSource. */ @@ -2935,8 +2946,9 @@ public class DatabaseConfig { jsonInclude = p.getEnum(JsonConfig.Include.class, "jsonInclude", jsonInclude); jsonDateTime = p.getEnum(JsonConfig.DateTime.class, "jsonDateTime", jsonDateTime); jsonDate = p.getEnum(JsonConfig.Date.class, "jsonDate", jsonDate); - jsonDirtyByDefault = p.getBoolean("jsonDirtyByDefault", jsonDirtyByDefault); + jsonMutationDetection = p.getEnum(MutationDetection.class, "jsonMutationDetection", jsonMutationDetection); + skipDataSourceCheck = p.getBoolean("skipDataSourceCheck", skipDataSourceCheck); runMigration = p.getBoolean("migration.run", runMigration); ddlGenerate = p.getBoolean("ddl.generate", ddlGenerate); ddlRun = p.getBoolean("ddl.run", ddlRun); 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 f762b0084..4011683ca 100644 --- a/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java +++ b/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java @@ -14,10 +14,9 @@ import java.util.List; import java.util.concurrent.locks.ReentrantLock; /** - * Manages the shutdown of the JVM Runtime. + * Manages the shutdown of Ebean. *

* Makes sure all the resources are shutdown properly and in order. - *

*/ public final class ShutdownManager { @@ -44,6 +43,9 @@ public final class ShutdownManager { private ShutdownManager() { } + /** + * Registers the container (potentially with cluster management). + */ public static void registerContainer(SpiContainer ebeanContainer) { container = ebeanContainer; } @@ -94,7 +96,7 @@ public final class ShutdownManager { /** * Register the shutdown hook with the Runtime. */ - protected static void registerShutdownHook() { + private static void registerShutdownHook() { lock.lock(); try { String value = System.getProperty("ebean.registerShutdownHook"); @@ -123,13 +125,10 @@ public final class ShutdownManager { // Already run shutdown... return; } - if (logger.isDebugEnabled()) { logger.debug("Shutting down"); } - stopping = true; - deregisterShutdownHook(); String shutdownRunner = System.getProperty("ebean.shutdown.runnable"); @@ -147,7 +146,6 @@ public final class ShutdownManager { // shutdown cluster networking if active container.shutdown(); } - // shutdown any registered servers that have not // already been shutdown manually for (Database server : databases) { @@ -158,7 +156,6 @@ public final class ShutdownManager { ex.printStackTrace(); } } - if ("true".equalsIgnoreCase(System.getProperty("ebean.datasource.deregisterAllDrivers", "false"))) { deregisterAllJdbcDrivers(); } @@ -168,15 +165,15 @@ public final class ShutdownManager { } private static void deregisterAllJdbcDrivers() { - // This manually deregisters all JDBC drivers + // This manually de-registers all JDBC drivers Enumeration drivers = DriverManager.getDrivers(); while (drivers.hasMoreElements()) { Driver driver = drivers.nextElement(); try { - logger.info("Deregistering jdbc driver: " + driver); + logger.info("De-registering jdbc driver: " + driver); DriverManager.deregisterDriver(driver); } catch (SQLException e) { - logger.error("Error deregistering driver " + driver, e); + logger.error("Error de-registering driver " + driver, e); } } } @@ -209,6 +206,9 @@ public final class ShutdownManager { } private static class ShutdownHook extends Thread { + private ShutdownHook() { + super("EbeanHook"); + } @Override public void run() { ShutdownManager.shutdown(); diff --git a/ebean-api/src/main/java/io/ebean/meta/AbstractMetricVisitor.java b/ebean-api/src/main/java/io/ebean/meta/AbstractMetricVisitor.java index 323b572ec..51df586d9 100644 --- a/ebean-api/src/main/java/io/ebean/meta/AbstractMetricVisitor.java +++ b/ebean-api/src/main/java/io/ebean/meta/AbstractMetricVisitor.java @@ -18,22 +18,22 @@ public abstract class AbstractMetricVisitor implements MetricVisitor { } @Override - public boolean isReset() { + public boolean reset() { return reset; } @Override - public boolean isCollectTransactionMetrics() { + public boolean collectTransactionMetrics() { return collectTransactionMetrics; } @Override - public boolean isCollectQueryMetrics() { + public boolean collectQueryMetrics() { return collectQueryMetrics; } @Override - public boolean isCollectL2Metrics() { + public boolean collectL2Metrics() { return collectL2Metrics; } diff --git a/ebean-api/src/main/java/io/ebean/meta/BasicMetricVisitor.java b/ebean-api/src/main/java/io/ebean/meta/BasicMetricVisitor.java index c821c63a7..0db953159 100644 --- a/ebean-api/src/main/java/io/ebean/meta/BasicMetricVisitor.java +++ b/ebean-api/src/main/java/io/ebean/meta/BasicMetricVisitor.java @@ -27,17 +27,17 @@ public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerM } @Override - public List getTimedMetrics() { + public List timedMetrics() { return timed; } @Override - public List getQueryMetrics() { + public List queryMetrics() { return query; } @Override - public List getCountMetrics() { + public List countMetrics() { return count; } diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaCountMetric.java b/ebean-api/src/main/java/io/ebean/meta/MetaCountMetric.java index 8b6af3594..cdaa2d7fa 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaCountMetric.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaCountMetric.java @@ -8,6 +8,13 @@ public interface MetaCountMetric extends MetaMetric { /** * Return the total count. */ - long getCount(); + long count(); + /** + * Migrate to count() + */ + @Deprecated + default long getCount() { + return count(); + } } diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaMetric.java b/ebean-api/src/main/java/io/ebean/meta/MetaMetric.java index 0d716fe23..671dc05c1 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaMetric.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaMetric.java @@ -8,6 +8,13 @@ public interface MetaMetric { /** * Return the metric name. */ - String getName(); + String name(); + /** + * Migrate to name(). + */ + @Deprecated + default String getName() { + return name(); + } } diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaQueryMetric.java b/ebean-api/src/main/java/io/ebean/meta/MetaQueryMetric.java index 514b700dc..1c9b5fe12 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaQueryMetric.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaQueryMetric.java @@ -8,21 +8,45 @@ public interface MetaQueryMetric extends MetaTimedMetric { /** * The type of entity or DTO bean. */ - Class getType(); + Class type(); + + /** + * Migrate to type(). + */ + @Deprecated + default Class getType() { + return type(); + } /** * The label for the query (can be null). */ - String getLabel(); + String label(); + + /** + * Migrate to label(). + */ + @Deprecated + default String getLabel() { + return label(); + } /** * The actual SQL of the query. */ - String getSql(); + String sql(); + + /** + * Migrate to sql(). + */ + @Deprecated + default String getSql() { + return sql(); + } /** * Return the hash of the plan. */ - String getHash(); + String hash(); } diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java b/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java index fb2b6d095..c1ae44a82 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java @@ -10,45 +10,45 @@ public interface MetaQueryPlan { /** * Return the bean type for the query. */ - Class getBeanType(); + Class beanType(); /** * Return the label of the query. */ - String getLabel(); + String label(); /** * Return the profile location for the query. */ - ProfileLocation getProfileLocation(); + ProfileLocation profileLocation(); /** * Return the sql of the query. */ - String getSql(); + String sql(); /** * Return the hash of the plan. */ - String getHash(); + String hash(); /** * Return a description of the bind values. */ - String getBind(); + String bind(); /** * Return the raw plan. */ - String getPlan(); + String plan(); /** * Return the query execution time associated with the bind values capture. */ - long getQueryTimeMicros(); + long queryTimeMicros(); /** * Return the total count of times bind capture has occurred. */ - long getCaptureCount(); + long captureCount(); } diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaTimedMetric.java b/ebean-api/src/main/java/io/ebean/meta/MetaTimedMetric.java index c6ba13516..f95f3248d 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaTimedMetric.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaTimedMetric.java @@ -9,27 +9,68 @@ public interface MetaTimedMetric extends MetaMetric { /** * Return the metric location if defined. */ - String getLocation(); + String location(); + + /** + * Migrate to location() + */ + @Deprecated + default String getLocation() { + return location(); + } /** * Return the total count. */ - long getCount(); + long count(); + + /** + * Migrate to count() + */ + @Deprecated + default long getCount() { + return count(); + } /** * Return the total execution time in micros. */ - long getTotal(); + long total(); + + /** + * Migrate to total() + */ + @Deprecated + default long getTotal() { + return total(); + } /** * Return the max execution time in micros. */ - long getMax(); + long max(); + + /** + * Migrate to max() + */ + @Deprecated + default long getMax() { + return max(); + } /** * Return the mean execution time in micros. */ - long getMean(); + long mean(); + + + /** + * Migrate to mean() + */ + @Deprecated + default long getMean() { + return mean(); + } /** * Return true if this is the first metrics collection for this query. diff --git a/ebean-api/src/main/java/io/ebean/meta/MetricVisitor.java b/ebean-api/src/main/java/io/ebean/meta/MetricVisitor.java index 18c7a72dc..fac9f050e 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetricVisitor.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetricVisitor.java @@ -8,22 +8,22 @@ public interface MetricVisitor { /** * Return true if the metrics should be reset. */ - boolean isReset(); + boolean reset(); /** * Return true if we should visit the transaction metrics. */ - boolean isCollectTransactionMetrics(); + boolean collectTransactionMetrics(); /** * Return true if we should visit the ORM and SQL query metrics. */ - boolean isCollectQueryMetrics(); + boolean collectQueryMetrics(); /** * Return true if we should visit the L2 cache metrics. */ - boolean isCollectL2Metrics(); + boolean collectL2Metrics(); /** * Visit has started. diff --git a/ebean-api/src/main/java/io/ebean/meta/QueryPlanInit.java b/ebean-api/src/main/java/io/ebean/meta/QueryPlanInit.java index 3c19caa39..5cce68994 100644 --- a/ebean-api/src/main/java/io/ebean/meta/QueryPlanInit.java +++ b/ebean-api/src/main/java/io/ebean/meta/QueryPlanInit.java @@ -32,7 +32,7 @@ public class QueryPlanInit { * Return the query execution time threshold which must be exceeded to initiate * query plan collection. */ - public long getThresholdMicros() { + public long thresholdMicros() { return thresholdMicros; } @@ -40,7 +40,7 @@ public class QueryPlanInit { * Set the query execution time threshold which must be exceeded to initiate * query plan collection. */ - public void setThresholdMicros(long thresholdMicros) { + public void thresholdMicros(long thresholdMicros) { this.thresholdMicros = thresholdMicros; } @@ -54,14 +54,14 @@ public class QueryPlanInit { /** * Return the specific hashes that we want to collect query plans on. */ - public Set getHashes() { + public Set hashes() { return hashes; } /** * Set the specific hashes that we want to collect query plans on. */ - public void setHashes(Set hashes) { + public void hashes(Set hashes) { this.hashes = hashes; } } diff --git a/ebean-api/src/main/java/io/ebean/meta/QueryPlanRequest.java b/ebean-api/src/main/java/io/ebean/meta/QueryPlanRequest.java index c4a69b1aa..421e0c151 100644 --- a/ebean-api/src/main/java/io/ebean/meta/QueryPlanRequest.java +++ b/ebean-api/src/main/java/io/ebean/meta/QueryPlanRequest.java @@ -18,7 +18,7 @@ public class QueryPlanRequest { * have been around for a while (e.g. 5 mins) and so reasonably represent * bind values that match the slowest execution for this query plan. */ - public long getSince() { + public long since() { return since; } @@ -28,14 +28,14 @@ public class QueryPlanRequest { * * @param since The minimum age of the bind values capture. */ - public void setSince(long since) { + public void since(long since) { this.since = since; } /** * Return the maximum number of plans to capture. */ - public int getMaxCount() { + public int maxCount() { return maxCount; } @@ -45,7 +45,7 @@ public class QueryPlanRequest { * Use this to limit how much query plan capturing is done as query * plan capture is actual database load. */ - public void setMaxCount(int maxCount) { + public void maxCount(int maxCount) { this.maxCount = maxCount; } @@ -54,7 +54,7 @@ public class QueryPlanRequest { *

* Query plan collection will stop once this time is exceeded. */ - public long getMaxTimeMillis() { + public long maxTimeMillis() { return maxTimeMillis; } @@ -65,7 +65,7 @@ public class QueryPlanRequest { * this to ensure the query plan capture does not use excessive amount * of time - put too much load on the database. */ - public void setMaxTimeMillis(long maxTimeMillis) { + public void maxTimeMillis(long maxTimeMillis) { this.maxTimeMillis = maxTimeMillis; } } diff --git a/ebean-api/src/main/java/io/ebean/meta/ServerMetrics.java b/ebean-api/src/main/java/io/ebean/meta/ServerMetrics.java index 8f0488d62..b8a50d85d 100644 --- a/ebean-api/src/main/java/io/ebean/meta/ServerMetrics.java +++ b/ebean-api/src/main/java/io/ebean/meta/ServerMetrics.java @@ -10,16 +10,39 @@ public interface ServerMetrics { /** * Return timed metrics for Transactions, labelled SqlQuery, labelled SqlUpdate. */ - List getTimedMetrics(); + List timedMetrics(); + + /** + * Migrate to timedMetrics(). + */ + @Deprecated + default List getTimedMetrics() { + return timedMetrics(); + } /** * Return the query metrics. */ - List getQueryMetrics(); + List queryMetrics(); + + /** + * Migrate to queryMetrics(). + */ + @Deprecated + default List getQueryMetrics() { + return queryMetrics(); + } /** * Return the Counter metrics. */ - List getCountMetrics(); + List countMetrics(); + /** + * Migrate to countMetrics(). + */ + @Deprecated + default List getCountMetrics() { + return countMetrics(); + } } diff --git a/ebean-api/src/main/java/io/ebean/meta/ServerMetricsAsJson.java b/ebean-api/src/main/java/io/ebean/meta/ServerMetricsAsJson.java index f48ecb5b6..7e42302c8 100644 --- a/ebean-api/src/main/java/io/ebean/meta/ServerMetricsAsJson.java +++ b/ebean-api/src/main/java/io/ebean/meta/ServerMetricsAsJson.java @@ -8,12 +8,12 @@ import java.util.Comparator; public interface ServerMetricsAsJson { /** - * Set to false to exclude profile location and sql. + * Set to false in order to exclude profile location and sql. */ ServerMetricsAsJson withExtraAttributes(boolean withLocation); /** - * Set to false to exclude SQL hash. + * Set to false in order to exclude SQL hash. */ ServerMetricsAsJson withHash(boolean withHash); diff --git a/ebean-api/src/main/java/io/ebean/meta/SortMetric.java b/ebean-api/src/main/java/io/ebean/meta/SortMetric.java index 9df2c704b..30104f1ff 100644 --- a/ebean-api/src/main/java/io/ebean/meta/SortMetric.java +++ b/ebean-api/src/main/java/io/ebean/meta/SortMetric.java @@ -32,7 +32,7 @@ public class SortMetric { @Override public int compare(MetaCountMetric o1, MetaCountMetric o2) { - return stringCompare(o1.getName(), o2.getName()); + return stringCompare(o1.name(), o2.name()); } } @@ -43,8 +43,8 @@ public class SortMetric { @Override public int compare(MetaTimedMetric o1, MetaTimedMetric o2) { - int i = stringCompare(o1.getName(), o2.getName()); - return i != 0 ? i : Long.compare(o1.getCount(), o2.getCount()); + int i = stringCompare(o1.name(), o2.name()); + return i != 0 ? i : Long.compare(o1.count(), o2.count()); } } @@ -55,7 +55,7 @@ public class SortMetric { @Override public int compare(MetaTimedMetric o1, MetaTimedMetric o2) { - return Long.compare(o2.getCount(), o1.getCount()); + return Long.compare(o2.count(), o1.count()); } } @@ -66,7 +66,7 @@ public class SortMetric { @Override public int compare(MetaTimedMetric o1, MetaTimedMetric o2) { - return Long.compare(o2.getTotal(), o1.getTotal()); + return Long.compare(o2.total(), o1.total()); } } @@ -77,7 +77,7 @@ public class SortMetric { @Override public int compare(MetaTimedMetric o1, MetaTimedMetric o2) { - return Long.compare(o2.getMean(), o1.getMean()); + return Long.compare(o2.mean(), o1.mean()); } } @@ -88,7 +88,7 @@ public class SortMetric { @Override public int compare(MetaTimedMetric o1, MetaTimedMetric o2) { - return Long.compare(o2.getMax(), o1.getMax()); + return Long.compare(o2.max(), o1.max()); } } } diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml index 1534f122b..c244053d2 100644 --- a/ebean-autotune/pom.xml +++ b/ebean-autotune/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT @@ -26,7 +26,7 @@ io.ebean ebean-core - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT provided diff --git a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java index af969fd53..b93be5cc8 100644 --- a/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java @@ -146,7 +146,8 @@ public class BaseQueryTuner { case ID_LIST: case UPDATE: case DELETE: - case SUBQUERY: + case SQ_EXISTS: + case SQ_IN: return false; default: // not using autoTune when explicitly loading the l2 bean cache diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index 0e6ebde4d..cb50c064c 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean bom @@ -14,12 +14,12 @@ 1.0 - 1.0 - 12.4.0 + 1.1 + 12.11.0 4.1 7.0 - 12.10.0 - 12.10.0 + 12.11.0 + 12.11.0 @@ -81,88 +81,88 @@ io.ebean ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-api - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core-type - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-ddl-generator - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-api - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-xml - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-autotune - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-querybean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean querybean-generator - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT provided io.ebean kotlin-querybean-generator - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT provided io.ebean ebean-test - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT test io.ebean ebean-postgis - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-redis - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index ad1d7c207..10c45ea74 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean-core-type @@ -16,7 +16,7 @@ io.ebean ebean-api - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/DataBinder.java b/ebean-core-type/src/main/java/io/ebean/core/type/DataBinder.java index be6a3b559..b08bb529a 100644 --- a/ebean-core-type/src/main/java/io/ebean/core/type/DataBinder.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/DataBinder.java @@ -163,4 +163,15 @@ public interface DataBinder { * Bind an array value. */ void setArray(String arrayType, Object[] elements) throws SQLException; + + /** + * Push json from dirty detection to be available for binding. + */ + void pushJson(String json); + + /** + * Pop json made during dirty detection for scalarType binding. + */ + String popJson(); + } diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java b/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java index a8ace12be..ef61b9122 100644 --- a/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java @@ -48,4 +48,14 @@ public interface DataReader { Object getObject() throws SQLException; InputStream getBinaryStream() throws SQLException; + + /** + * Push json from dirty detection to be available for binding. + */ + void pushJson(String json); + + /** + * Pop json made during dirty detection for scalarType binding. + */ + String popJson(); } 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 a971a0115..6c01811c5 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,6 +2,7 @@ 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,6 +35,10 @@ import java.sql.SQLException; */ public interface ScalarType extends StringParser, StringFormatter, ScalarDataReader { + default boolean isJsonMapper() { + return false; + } + /** * 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. diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index 8303c519d..bff1574de 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -3,7 +3,7 @@ ebean-parent io.ebean - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean-core @@ -20,22 +20,13 @@ - db2 + - com.ibm.jdbc - db2jcc4 - 4.23.42 + com.ibm.db2 + jcc + 11.5.5.0 test @@ -52,13 +43,13 @@ io.avaje classpath-scanner - 4.2 + 6.0 io.ebean ebean-migration-auto - 1.0 + 1.1 @@ -72,7 +63,7 @@ io.ebean ebean-ddl-generator - 12.9.4-RC1 + 12.11.0 test @@ -87,19 +78,19 @@ io.ebean ebean-api - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core-type - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-api - 12.10.1-SNAPSHOT + 12.11.2-SNAPSHOT diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BeanCacheResult.java b/ebean-core/src/main/java/io/ebeaninternal/api/BeanCacheResult.java index c3b70e2e1..11e6d5f15 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BeanCacheResult.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BeanCacheResult.java @@ -6,7 +6,7 @@ import java.util.List; /** * The results of bean cache hit. */ -public class BeanCacheResult { +public final class BeanCacheResult { private final List> list = new ArrayList<>(); @@ -27,7 +27,7 @@ public class BeanCacheResult { /** * Bean and cache key pair. */ - static class Entry { + static final class Entry { private final T bean; private final Object key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BinaryReadContext.java b/ebean-core/src/main/java/io/ebeaninternal/api/BinaryReadContext.java index 105a9b81b..bde5c8167 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BinaryReadContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BinaryReadContext.java @@ -7,7 +7,7 @@ import java.io.IOException; /** * Context used to read binary format messages. */ -public class BinaryReadContext { +public final class BinaryReadContext { private final DataInputStream in; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BinaryWriteContext.java b/ebean-core/src/main/java/io/ebeaninternal/api/BinaryWriteContext.java index c36bfebc8..610ad41ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BinaryWriteContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BinaryWriteContext.java @@ -6,10 +6,9 @@ import java.io.IOException; /** * Context used to write binary message (like RemoteTransactionEvent). */ -public class BinaryWriteContext { +public final class BinaryWriteContext { private final DataOutputStream out; - private long counter; public BinaryWriteContext(DataOutputStream out) { 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 afb1e44b8..7c5264892 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -4,11 +4,7 @@ import io.ebeaninternal.server.persist.MultiValueWrapper; import io.ebeaninternal.server.querydefn.NaturalKeyBindParam; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; /** @@ -17,35 +13,28 @@ import java.util.Map.Entry; * Supports ordered or named parameters. *

*/ -public class BindParams implements Serializable { +public final class BindParams implements Serializable { private static final long serialVersionUID = 4541081933302086285L; private final List positionedParameters = new ArrayList<>(); - private final Map namedParameters = new LinkedHashMap<>(); - /** * This is the sql. For named parameters this is the sql after the named * parameters have been replaced with question mark place holders and the * parameters have been ordered by addNamedParamInOrder(). */ private String preparedSql; - /** * Bind hash and count used to detect when the bind values have changed such * that the generated SQL (with named parameters) needs to be recalculated. */ private String bindHash; - /** * Helper to add positioned parameters in order. */ private int addPos; - public BindParams() { - } - /** * Reset positioned parameters (usually due to bind parameter expansion). */ @@ -54,12 +43,11 @@ public class BindParams implements Serializable { positionedParameters.clear(); } - public int queryBindHash() { - int hc = namedParameters.hashCode(); - for (Param positionedParameter : positionedParameters) { - hc = hc * 92821 + positionedParameter.hashCode(); + public void queryBindHash(BindValuesKey key) { + key.add(positionedParameters.size()); + for (Param param : positionedParameters) { + param.queryBindHash(key); } - return hc; } /** @@ -424,7 +412,14 @@ public class BindParams implements Serializable { @Override public boolean equals(Object o) { - return o != null && (o == this || (o instanceof Param) && hashCode() == o.hashCode()); + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Param param = (Param) o; + return isInParam == param.isInParam && isOutParam == param.isOutParam && type == param.type && Objects.equals(inValue, param.inValue); + } + + void queryBindHash(BindValuesKey key) { + key.add(isInParam).add(isOutParam).add(type).add(inValue); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java new file mode 100644 index 000000000..062932af2 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java @@ -0,0 +1,35 @@ +package io.ebeaninternal.api; + +import java.util.ArrayList; +import java.util.List; + +/** + * BindValues used for L2 query cache key matching. + *

+ * The equals/hashCode implementation must meet the requirement that the query bind values + * match for L2 query cache hit (given the query plan hash is already a match). + */ +public final class BindValuesKey { + + private final List values = new ArrayList<>(); + + /** + * Add a bind value. + */ + public BindValuesKey add(Object value) { + values.add(value); + return this; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof BindValuesKey && ((BindValuesKey) obj).values.equals(values); + } + + @Override + public int hashCode() { + return values.hashCode(); + } + + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java index bfe9d5b84..2c896e2fb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java @@ -11,10 +11,9 @@ import java.util.Set; /** * Used for bean cache lookup with where ids in expression. */ -public class CacheIdLookupMany implements CacheIdLookup { +public final class CacheIdLookupMany implements CacheIdLookup { private final IdInExpression idInExpression; - private int remaining; public CacheIdLookupMany(IdInExpression idInExpression) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java index 47ee89c4b..bfc55b5c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java @@ -7,7 +7,7 @@ import java.util.List; /** * Used for bean cache lookup with a single id value. */ -public class CacheIdLookupSingle implements CacheIdLookup { +public final class CacheIdLookupSingle implements CacheIdLookup { private final Object idValue; private boolean found; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java index 3c5ca5a7b..0d3c72db7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java @@ -1,16 +1,12 @@ package io.ebeaninternal.api; import io.ebean.annotation.Platform; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Helper to indicate that an EbeanServer should come up offline * typically for DDL generation purposes. */ -public class DbOffline { - - private static final Logger logger = LoggerFactory.getLogger(DbOffline.class); +public final class DbOffline { private static final String KEY = "ebean.dboffline"; @@ -73,7 +69,6 @@ public class DbOffline { public static void reset() { generateMigration = false; System.clearProperty(KEY); - logger.debug("reset"); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java b/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java index 5d6f79527..57280b9f3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java @@ -8,7 +8,7 @@ import io.ebean.metric.TimedMetric; /** * Extra metrics collected to measure internal behaviour. */ -public class ExtraMetrics { +public final class ExtraMetrics { private final TimedMetric bindCapture; private final TimedMetric planCollect; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java index c14cb88d7..a207f3c57 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java @@ -3,18 +3,17 @@ package io.ebeaninternal.api; /** * A hash key for a query including both the query plan and bind values. */ -public class HashQuery { +public final class HashQuery { private final CQueryPlanKey planHash; - - private final int bindHash; + private final BindValuesKey bindValuesKey; /** * Create the HashQuery. */ - public HashQuery(CQueryPlanKey planHash, int bindHash) { + public HashQuery(CQueryPlanKey planHash, BindValuesKey bindValuesKey) { this.planHash = planHash; - this.bindHash = bindHash; + this.bindValuesKey = bindValuesKey; } @Override @@ -25,7 +24,7 @@ public class HashQuery { @Override public int hashCode() { int hc = 92821 * planHash.hashCode(); - hc = 92821 * hc + bindHash; + hc = 92821 * hc + bindValuesKey.hashCode(); return hc; } @@ -37,8 +36,7 @@ public class HashQuery { if (!(obj instanceof HashQuery)) { return false; } - HashQuery e = (HashQuery) obj; - return e.bindHash == bindHash && e.planHash.equals(planHash); + return e.bindValuesKey.equals(bindValuesKey) && e.planHash.equals(planHash); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java b/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java index cb7643c65..7356fbc01 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java @@ -6,7 +6,7 @@ import io.ebean.TxScope; /** * Helper object to make AOP generated code simpler. */ -public class HelpScopeTrans { +public final class HelpScopeTrans { private static boolean enabled = true; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java b/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java index fef666a63..a763182b2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java @@ -13,16 +13,12 @@ import java.util.Set; /** * Request for loading ManyToOne and OneToOne relationships. */ -public class LoadBeanRequest extends LoadRequest { +public final class LoadBeanRequest extends LoadRequest { private final List batch; - private final LoadBeanBuffer loadBuffer; - private final String lazyLoadProperty; - private final boolean loadCache; - private boolean loadedFromCache; /** @@ -92,9 +88,7 @@ public class LoadBeanRequest extends LoadRequest { * Return the list of Id values for the beans in the lazy load buffer. */ public List getIdList() { - List idList = new ArrayList<>(); - BeanDescriptor desc = loadBuffer.getBeanDescriptor(); for (EntityBeanIntercept ebi : batch) { idList.add(desc.getId(ebi.getOwner())); @@ -106,10 +100,8 @@ public class LoadBeanRequest extends LoadRequest { * Configure the query for lazy loading execution. */ public void configureQuery(SpiQuery query, List idList) { - query.setMode(SpiQuery.Mode.LAZYLOAD_BEAN); query.setPersistenceContext(loadBuffer.getPersistenceContext()); - String mode = isLazy() ? "+lazy" : "+query"; query.setLoadDescription(mode, getDescription()); @@ -117,9 +109,7 @@ public class LoadBeanRequest extends LoadRequest { // cascade the batch size (if set) for further lazy loading query.setLazyLoadBatchSize(getBatchSize()); } - loadBuffer.configureQuery(query, lazyLoadProperty); - if (idList.size() == 1) { query.where().idEq(idList.get(0)); } else { @@ -131,19 +121,16 @@ public class LoadBeanRequest extends LoadRequest { * Load the beans into the L2 cache if that is requested and check for load failures due to deletes. */ public void postLoad(List list) { - Set loadedIds = new HashSet<>(); - BeanDescriptor desc = loadBuffer.getBeanDescriptor(); // collect Ids and maybe load bean cache - for (Object aList : list) { - EntityBean loadedBean = (EntityBean) aList; + for (Object bean : list) { + EntityBean loadedBean = (EntityBean) bean; loadedIds.add(desc.getId(loadedBean)); } if (isLoadCache()) { desc.cacheBeanPutAll(list); } - if (lazyLoadProperty != null) { for (EntityBeanIntercept ebi : batch) { // check if the underlying row in DB was deleted. Mark the bean as 'failed' if 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 0343b8579..cd49558d6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java @@ -15,16 +15,13 @@ import java.util.List; /** * Request for loading Associated Many Beans. */ -public class LoadManyRequest extends LoadRequest { +public final class LoadManyRequest extends LoadRequest { private static final Logger logger = LoggerFactory.getLogger(LoadManyRequest.class); private final List> batch; - private final LoadManyBuffer loadContext; - private final boolean onlyIds; - private final boolean loadCache; /** 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 0c6b128a2..91fc49d21 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java @@ -17,16 +17,13 @@ import java.util.TreeSet; * Holds the joins needs to support the many where predicates. * These joins are independent of any 'fetch' joins on the many. */ -public class ManyWhereJoins implements Serializable { +public final class ManyWhereJoins implements Serializable { private static final long serialVersionUID = -6490181101871795417L; private final TreeMap joins = new TreeMap<>(); - private List formulaJoinProperties; - private boolean aggregation; - /** * 'Mode' indicating that joins added while this is true are required to be outer joins. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java b/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java deleted file mode 100644 index e1b930769..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.ebeaninternal.api; - -import java.io.Serializable; - -/** - * Object used as a synchronization monitor that is serializable. - */ -public class Monitor implements Serializable { - - private static final long serialVersionUID = -2741687226680981940L; - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java index aff59771b..61514bc66 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java @@ -11,7 +11,7 @@ import java.util.Map; /** * Natural key entry with name value pairs for each of the properties making up the key. */ -class NaturalKeyEntryBasic implements NaturalKeyEntry { +final class NaturalKeyEntryBasic implements NaturalKeyEntry { private final Map map = new HashMap<>(); private final String key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java index 0fa7bef62..0ad6e9343 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java @@ -1,6 +1,6 @@ package io.ebeaninternal.api; -class NaturalKeyEntrySimple implements NaturalKeyEntry { +final class NaturalKeyEntrySimple implements NaturalKeyEntry { private final String key; private final Object val; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java index e7a6218df..3933c2f4b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java @@ -3,7 +3,7 @@ package io.ebeaninternal.api; /** * A property value pair in a natural key lookup. */ -public class NaturalKeyEq { +public final class NaturalKeyEq { final String property; final Object value; 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 6966787d5..a8b4d348d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java @@ -11,28 +11,22 @@ import java.util.Set; /** * Collects the data for processing the natural key cache processing. */ -public class NaturalKeyQueryData { +public final class NaturalKeyQueryData { private final BeanNaturalKey naturalKey; - /** * Only one of IN or IN PAIRS is allowed. */ private boolean hasIn; - // IN Pairs clause - only one allowed private String inProperty0, inProperty1; private List inPairs; - // IN clause - only one allowed private List inValues; private String inProperty; - // normal EQ expressions private List eqList; - private NaturalKeySet set; - private int hitCount; public NaturalKeyQueryData(BeanNaturalKey naturalKey) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java index cf31afbf9..89b5ae484 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java @@ -4,8 +4,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; -public class NaturalKeySet { - +public final class NaturalKeySet { private final Map map = new LinkedHashMap<>(); 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 2f7162c70..33ee06b54 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java @@ -2,7 +2,7 @@ package io.ebeaninternal.api; import io.ebeaninternal.server.type.bindcapture.BindCapture; -class NoopQueryBindCapture implements SpiQueryBindCapture { +final class NoopQueryBindCapture implements SpiQueryBindCapture { @Override public boolean collectFor(long timeMicros) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java index 813121f92..9c6a54952 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java @@ -6,7 +6,7 @@ import io.ebean.meta.QueryPlanRequest; import java.util.Collections; import java.util.List; -class NoopQueryPlanManager implements QueryPlanManager { +final class NoopQueryPlanManager implements QueryPlanManager { @Override public void setDefaultThreshold(long thresholdMicros) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java b/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java index a333008e9..eeb51221e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java @@ -3,7 +3,7 @@ package io.ebeaninternal.api; import io.ebean.annotation.Platform; import io.ebean.util.StringHelper; -public class PlatformMatch { +public final class PlatformMatch { /** * Return true if the script platforms is a match/supported for the given platform. @@ -15,7 +15,6 @@ public class PlatformMatch { if (platforms == null || platforms.trim().isEmpty()) { return true; } - // match on base platform name and platform name for (String name : StringHelper.splitNames(platforms)) { if (name.equalsIgnoreCase(platform.base().name()) || name.equalsIgnoreCase(platform.name())) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java b/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java index 2b11732b0..ab63e09d4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java @@ -5,16 +5,9 @@ import io.ebeaninternal.server.query.SqlJoinType; /** * Represents a join required for a given property and whether than needs to be an outer join. */ -public class PropertyJoin { +public final class PropertyJoin { - /** - * The property name. - */ private final String property; - - /** - * Set to true if the property needs to be an outer join. - */ private final SqlJoinType joinType; public PropertyJoin(String property, SqlJoinType joinType) { 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 631b6dfb8..f3ca6555f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java @@ -7,7 +7,7 @@ import java.util.ArrayList; /** * Used internally to handle the scoping of transactions for methods. */ -public class ScopeTrans { +public final class ScopeTrans { private static final int OPCODE_ATHROW = 191; @@ -15,43 +15,32 @@ public class ScopeTrans { * The transaction in scope (can be null). */ private final SpiTransaction transaction; - /** * If true by default rollback on Checked exceptions. */ private final boolean rollbackOnChecked; - /** * True if the transaction was created and hence should be committed * on finally if it hasn't already been rolled back. */ private final boolean created; - /** * Explicit set of Exceptions that DO NOT cause a rollback to occur. */ private final ArrayList> noRollbackFor; - /** * Explicit set of Exceptions that DO cause a rollback to occur. */ private final ArrayList> rollbackFor; - private Boolean restoreBatch; - private Boolean restoreBatchOnCascade; - private int restoreBatchSize; - private Boolean restoreBatchGeneratedKeys; - private boolean restoreBatchFlushOnQuery; - /** * Flag set when a rollback has occurred. */ private boolean rolledBack; - /** * Flag set when nested commit has occurred. */ 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 f5a1db07b..383746f13 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -10,15 +10,13 @@ import javax.persistence.PersistenceException; * * These can be nested and internally they are pushed and popped from a stack. */ -public class ScopedTransaction extends SpiTransactionProxy { +public final class ScopedTransaction extends SpiTransactionProxy { private final TransactionScopeManager manager; - /** * Stack of 'nested' transactions. */ private final ArrayStack stack = new ArrayStack<>(); - private ScopeTrans current; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java index daf6418d0..fae60f49d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java @@ -8,6 +8,7 @@ import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditPrepare; import io.ebean.meta.MetricVisitor; +import io.ebeaninternal.api.SpiQuery.Type; import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.core.timezone.DataTimeZone; import io.ebeaninternal.server.deploy.BeanDescriptor; @@ -149,7 +150,7 @@ public interface SpiEbeanServer extends ExtendedServer, EbeanServer, BeanCollect /** * Compile a query. */ - CQuery compileQuery(Query query, Transaction t); + CQuery compileQuery(Type type, Query query, Transaction t); /** * Execute the findId's query but without copying the query. 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 007e9f29f..8fe986259 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java @@ -54,9 +54,9 @@ public interface SpiExpression extends Expression { void queryPlanHash(StringBuilder builder); /** - * Return the hash value for the values that will be bound. + * Build the key for bind values of the query. */ - int queryBindHash(); + void queryBindKey(BindValuesKey key); /** * Return true if the expression is the same with respect to bind values. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java index e02397a75..203827820 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java @@ -8,10 +8,9 @@ import java.util.Set; /** * Property expression validation request for a given root bean type. */ -public class SpiExpressionValidation { +public final class SpiExpressionValidation { private final BeanType desc; - private final LinkedHashSet unknown = new LinkedHashSet<>(); public SpiExpressionValidation(BeanType desc) { 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 12942e7d6..5a6ae2217 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -84,7 +84,7 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod /** * Find single attribute. */ - ATTRIBUTE(FIND_ATTRIBUTE, "findAttribute"), + ATTRIBUTE(FIND_ATTRIBUTE, "findAttribute", false, false), /** * Find rowCount. @@ -92,9 +92,14 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod COUNT(FIND_COUNT, "findCount"), /** - * A subquery used as part of a where clause. + * A subquery used as part of an exists where clause. */ - SUBQUERY(FIND_SUBQUERY, "subquery"), + SQ_EXISTS(FIND_SUBQUERY, "sqExists", false, false), + + /** + * A subquery used as part of an in where clause. + */ + SQ_IN(FIND_SUBQUERY, "sqIn", false, false), /** * Delete query. @@ -107,17 +112,21 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod UPDATE(FIND_UPDATE, "update", true); private final boolean update; + private final boolean defaultSelect; private final String profileEventId; private final String label; Type(String profileEventId, String label) { - this(profileEventId, label, false); + this(profileEventId, label, false, true); } - Type(String profileEventId, String label, boolean update) { + this(profileEventId, label, update, true); + } + Type(String profileEventId, String label, boolean update, boolean defaultSelect) { this.profileEventId = profileEventId; this.label = label; this.update = update; + this.defaultSelect = defaultSelect; } /** @@ -127,6 +136,13 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod return update; } + /** + * Return true if this allows default select clause. + */ + public boolean defaultSelect() { + return defaultSelect; + } + public String profileEventId() { return profileEventId; } @@ -629,13 +645,11 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod CQueryPlanKey prepare(SpiOrmQueryRequest request); /** - * Calculate a hash based on the bind values used in the query. + * Build the key for the bind values used in the query (for l2 query cache). *

- * Combined with queryPlanHash() to return getQueryHash (a unique hash for a - * query). - *

+ * Combined with queryPlanHash() to return queryHash (a unique key for a query). */ - int queryBindHash(); + void queryBindKey(BindValuesKey key); /** * Identifies queries that are exactly the same including bind variables. 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 96a1eade7..0b4c3ea0a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryPlan.java @@ -18,7 +18,7 @@ public interface SpiQueryPlan { String getName(); /** - * The hash for the query plan. + * The hash of the sql. */ String getHash(); 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 52d87d23e..22a5ba904 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java @@ -20,7 +20,7 @@ import java.util.List; * to the TransactionEventManager. *

*/ -public class TransactionEvent implements Serializable { +public final class TransactionEvent implements Serializable { private static final long serialVersionUID = 7230903304106097120L; @@ -29,13 +29,9 @@ public class TransactionEvent implements Serializable { * the cluster). */ private final transient boolean local; - private TransactionEventTable eventTables; - private transient List> listenerNotify; - private transient DeleteByIdMap deleteByIdMap; - private transient CacheChangeSet changeSet; /** @@ -110,11 +106,9 @@ public class TransactionEvent implements Serializable { * Build and return the cache changeSet. */ public CacheChangeSet buildCacheChanges(TransactionManager manager) { - if (changeSet == null && deleteByIdMap == null && eventTables == null) { return null; } - if (changeSet == null) { changeSet = new CacheChangeSet(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEventTable.java b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEventTable.java index 18ea4f5a3..de55cd163 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEventTable.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEventTable.java @@ -28,20 +28,17 @@ public final class TransactionEventTable implements Serializable, BinaryWritable } public void add(TransactionEventTable table) { - for (TableIUD iud : table.values()) { add(iud); } } public void add(String table, boolean insert, boolean update, boolean delete) { - table = table.toUpperCase(); add(new TableIUD(table, insert, update, delete)); } public void add(TableIUD newTableIUD) { - TableIUD existingTableIUD = map.put(newTableIUD.getTableName(), newTableIUD); if (existingTableIUD != null) { newTableIUD.add(existingTableIUD); @@ -56,7 +53,7 @@ public final class TransactionEventTable implements Serializable, BinaryWritable return map.values(); } - public static class TableIUD implements Serializable, BulkTableEvent, BinaryWritable { + public static final class TableIUD implements Serializable, BulkTableEvent, BinaryWritable { private static final long serialVersionUID = -1958317571064162089L; @@ -73,12 +70,10 @@ public final class TransactionEventTable implements Serializable, BinaryWritable } public static TableIUD readBinaryMessage(BinaryReadContext dataInput) throws IOException { - String table = dataInput.readUTF(); boolean insert = dataInput.readBoolean(); boolean update = dataInput.readBoolean(); boolean delete = dataInput.readBoolean(); - return new TableIUD(table, insert, update, delete); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/DJsonService.java b/ebean-core/src/main/java/io/ebeaninternal/json/DJsonService.java index d98aa6d7c..aa3443ced 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/DJsonService.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/DJsonService.java @@ -17,7 +17,7 @@ import java.util.Set; /** * Utility that converts between JSON content and simple java Maps/Lists. */ -public class DJsonService implements SpiJsonService { +public final class DJsonService implements SpiJsonService { /** * Write the nested Map/List as json. diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java index fa3451f8e..938f7f5a9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -class EJsonReader { +final class EJsonReader { static final JsonFactory json = new JsonFactory(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonWriter.java b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonWriter.java index 1c110c077..2a05f306d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonWriter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonWriter.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -class EJsonWriter { +final class EJsonWriter { /** * Base jsonFactory implementation used when it is not passed in. diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java index 911675605..08cdb273e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java @@ -7,7 +7,7 @@ import java.io.Serializable; /** * Detects when content has been modified and as such needs to be persisted (included in an update). */ -public class ModifyAwareFlag implements ModifyAwareType, Serializable { +public final class ModifyAwareFlag implements ModifyAwareType, Serializable { private static final long serialVersionUID = 1; diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java index 7e21e297f..fb57f3447 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java @@ -7,10 +7,9 @@ import java.util.Iterator; /** * Wraps an iterator for the purposes of detecting modifications. */ -public class ModifyAwareIterator implements Iterator { +public final class ModifyAwareIterator implements Iterator { private final ModifyAwareType owner; - private final Iterator it; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java index 7803871df..4743cf27b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java @@ -13,12 +13,11 @@ import java.util.Objects; /** * Modify aware wrapper of a list. */ -public class ModifyAwareList implements List, ModifyAwareType, Serializable { +public final class ModifyAwareList implements List, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; final List list; - final ModifyAwareType owner; public ModifyAwareList(List list) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java index 5f6d5f013..974e88700 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java @@ -7,10 +7,9 @@ import java.util.ListIterator; /** * Modify aware wrapper of a ListIterator. */ -public class ModifyAwareListIterator implements ListIterator { +public final class ModifyAwareListIterator implements ListIterator { final ModifyAwareType owner; - final ListIterator iterator; public ModifyAwareListIterator(ModifyAwareType owner, ListIterator iterator) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java index 9d5e1fffe..2b2610a2e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java @@ -12,15 +12,11 @@ import java.util.Set; /** * Map that is wraps an underlying map for the purpose of detecting changes. */ -public class ModifyAwareMap implements Map, ModifyAwareType, Serializable { +public final class ModifyAwareMap implements Map, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; final ModifyAwareType owner; - - /** - * The underlying map. - */ final Map map; public ModifyAwareMap(Map underlying) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java index f20b39602..06353dd98 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java @@ -11,13 +11,12 @@ import java.util.Set; /** * Wraps a Set for the purposes of detecting modifications. */ -public class ModifyAwareSet implements Set, ModifyAwareType, Serializable { +public final class ModifyAwareSet implements Set, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; - protected final ModifyAwareType owner; - - protected final Set set; + private final ModifyAwareType owner; + private final Set set; /** * Create as top level with it's own ModifyAwareOwner instance wrapping the given Set. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/DContainerFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/DContainerFactory.java index ea9f0b109..77d0a1f72 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/DContainerFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/DContainerFactory.java @@ -8,7 +8,7 @@ import io.ebeaninternal.server.core.DefaultContainer; /** * Default container factory found via service loader. */ -public class DContainerFactory implements SpiContainerFactory { +public final class DContainerFactory implements SpiContainerFactory { @Override public SpiContainer create(ContainerConfig containerConfig) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java index b826329bc..b849bbfb7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java @@ -5,7 +5,7 @@ import io.ebeaninternal.api.SpiQuery; /** * Noop service when AutoTuneService is not available. */ -public class NoAutoTuneService implements AutoTuneService { +public final class NoAutoTuneService implements AutoTuneService { @Override public void startup() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java index c6f99f194..7c2086c55 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java @@ -8,10 +8,9 @@ import java.util.Collection; /** * Change to remove bean from L2 cache. */ -class CacheChangeBeanRemove implements CacheChange { +final class CacheChangeBeanRemove implements CacheChange { private final BeanDescriptor descriptor; - private final Collection ids; CacheChangeBeanRemove(Object id, BeanDescriptor descriptor) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanUpdate.java index 391e778c2..8203d3a19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanUpdate.java @@ -7,7 +7,7 @@ import java.util.Map; /** * Put a new bean entry into the cache. */ -class CacheChangeBeanUpdate implements CacheChange { +final class CacheChangeBeanUpdate implements CacheChange { private final BeanDescriptor desc; private final String key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeNaturalKeyPut.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeNaturalKeyPut.java index f90a23749..72f5cfb45 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeNaturalKeyPut.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeNaturalKeyPut.java @@ -5,7 +5,7 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; /** * Change the natural key mapping for a bean. */ -class CacheChangeNaturalKeyPut implements CacheChange { +final class CacheChangeNaturalKeyPut implements CacheChange { private final BeanDescriptor descriptor; private final String key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java index 20cd7329c..a1393db06 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java @@ -14,18 +14,13 @@ import java.util.Set; /** * List of changes to be applied to L2 cache. */ -public class CacheChangeSet { +public final class CacheChangeSet { private final List entries = new ArrayList<>(); - private final Set touchedTables = new HashSet<>(); - private final Set> queryCaches = new HashSet<>(); - private final Set> beanCaches = new HashSet<>(); - private final Map, CacheChangeBeanRemove> beanRemoveMap = new HashMap<>(); - private final Map manyChangeMap = new HashMap<>(); /** @@ -173,14 +168,11 @@ public class CacheChangeSet { /** * Changes for a specific many property. */ - private static class ManyChange implements CacheChange { + private static final class ManyChange implements CacheChange { final ManyKey key; - final Set removes = new HashSet<>(); - final Map puts = new LinkedHashMap<>(); - boolean clear; ManyChange(ManyKey key) { @@ -229,10 +221,9 @@ public class CacheChangeSet { /** * Key for changes on a many property. */ - private static class ManyKey { + private static final class ManyKey { private final BeanDescriptor desc; - private final String manyProperty; ManyKey(BeanDescriptor desc, String manyProperty) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheManagerOptions.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheManagerOptions.java index 98490702d..ae0c10f4c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheManagerOptions.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CacheManagerOptions.java @@ -10,18 +10,13 @@ import io.ebeaninternal.server.cluster.ClusterManager; /** * Configuration options when creating the default cache manager. */ -public class CacheManagerOptions { +public final class CacheManagerOptions { private final ClusterManager clusterManager; - private final DatabaseConfig databaseConfig; - private final boolean localL2Caching; - private CurrentTenantProvider currentTenantProvider; - private QueryCacheEntryValidate queryCacheEntryValidate; - private ServerCacheFactory cacheFactory = new DefaultServerCacheFactory(); private ServerCacheOptions beanDefault = new ServerCacheOptions(); private ServerCacheOptions queryDefault = new ServerCacheOptions(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanData.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanData.java index 930adae21..23ced1d5e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanData.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanData.java @@ -11,13 +11,12 @@ import java.util.Map; /** * Data held in the bean cache for cached beans. */ -public class CachedBeanData implements Externalizable { +public final class CachedBeanData implements Externalizable { private long whenCreated; private long version; private String discValue; private Map data; - /** * The sharable bean is effectively transient (near cache only). */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataFromBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataFromBean.java index 32ac2ce9a..2fd3fd46b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataFromBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataFromBean.java @@ -9,10 +9,9 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; import java.util.LinkedHashMap; import java.util.Map; -public class CachedBeanDataFromBean { +public final class CachedBeanDataFromBean { public static CachedBeanData extract(BeanDescriptor desc, EntityBean bean) { - EntityBeanIntercept ebi = bean._ebean_getIntercept(); Map data = new LinkedHashMap<>(); @@ -46,7 +45,6 @@ public class CachedBeanDataFromBean { } private static EntityBean createSharableBean(BeanDescriptor desc, EntityBean bean, EntityBeanIntercept beanEbi) { - if (!desc.isCacheSharableBeans() || !beanEbi.isFullyLoadedBean()) { return null; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataToBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataToBean.java index 6dbdae1ff..08f3a80fd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataToBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanDataToBean.java @@ -7,30 +7,24 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -public class CachedBeanDataToBean { - +public final class CachedBeanDataToBean { public static void load(BeanDescriptor desc, EntityBean bean, CachedBeanData cacheBeanData, PersistenceContext context) { - EntityBeanIntercept ebi = bean._ebean_getIntercept(); // any future lazy loading skips L2 bean cache ebi.setLoadedFromCache(true); - BeanProperty idProperty = desc.getIdProperty(); if (desc.getInheritInfo() != null) { desc = desc.getInheritInfo().readType(bean.getClass()).desc(); } - if (idProperty != null) { // load the id property loadProperty(bean, cacheBeanData, ebi, idProperty, context); } - // load the non-many properties for (BeanProperty prop : desc.propertiesNonMany()) { loadProperty(bean, cacheBeanData, ebi, prop, context); } - for (BeanPropertyAssocMany prop : desc.propertiesMany()) { if (prop.isElementCollection()) { loadProperty(bean, cacheBeanData, ebi, prop, context); @@ -38,12 +32,10 @@ public class CachedBeanDataToBean { prop.createReferenceIfNull(bean); } } - ebi.setLoadedLazy(); } private static void loadProperty(EntityBean bean, CachedBeanData cacheBeanData, EntityBeanIntercept ebi, BeanProperty prop, PersistenceContext context) { - if (cacheBeanData.isLoaded(prop.getName())) { if (!ebi.isLoadedProperty(prop.getPropertyIndex())) { Object value = cacheBeanData.getData(prop.getName()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanId.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanId.java index 45eab630c..6b0fc903b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanId.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedBeanId.java @@ -10,7 +10,7 @@ import java.io.ObjectOutput; *

* Put into L2 cache such that we know the type of a bean with inheritance. */ -public class CachedBeanId implements Externalizable { +public final class CachedBeanId implements Externalizable { private String discValue; private Object id; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedManyIds.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedManyIds.java index 155a43ff5..dd589deea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedManyIds.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/CachedManyIds.java @@ -13,7 +13,7 @@ import java.util.List; * This is effectively just the Id values for each of the beans in the collection. *

*/ -public class CachedManyIds implements Externalizable { +public final class CachedManyIds implements Externalizable { private List idList; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheAdapter.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheAdapter.java index bd7b0a763..413af049d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheAdapter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultCacheAdapter.java @@ -13,7 +13,7 @@ import java.util.List; * Used to hide the Supplier part of the SpiCacheManager API from public use. *

*/ -public class DefaultCacheAdapter implements ServerCacheManager { +public final class DefaultCacheAdapter implements ServerCacheManager { private final SpiCacheManager cacheManager; 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 cf15c51fe..6d632acc3 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 @@ -23,14 +23,13 @@ import java.util.concurrent.locks.ReentrantLock; /** * Manages the construction of caches. */ -class DefaultCacheHolder { +final class DefaultCacheHolder { private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.ALL"); private final ReentrantLock lock = new ReentrantLock(); private final ConcurrentHashMap allCaches = new ConcurrentHashMap<>(); private final ConcurrentHashMap> collectIdCaches = new ConcurrentHashMap<>(); - private final ServerCacheFactory cacheFactory; private final ServerCacheOptions beanDefault; private final ServerCacheOptions queryDefault; @@ -76,7 +75,6 @@ class DefaultCacheHolder { * Return the cache for a given bean type. */ private ServerCache getCacheInternal(Class beanType, ServerCacheType type, String collectionProperty) { - String shortName = key(beanType.getSimpleName(), collectionProperty, type); String fullKey = key(beanType.getName(), collectionProperty, type); return allCaches.computeIfAbsent(fullKey, s -> createCache(beanType, type, fullKey, shortName)); @@ -143,10 +141,8 @@ class DefaultCacheHolder { } private ServerCacheOptions getBeanOptions(Class cls) { - Cache cache = cls.getAnnotation(Cache.class); boolean nearCache = (cache != null && cache.nearCache()); - CacheBeanTuning tuning = cls.getAnnotation(CacheBeanTuning.class); if (tuning != null) { return new ServerCacheOptions(nearCache, tuning).applyDefaults(beanDefault); 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 41ec3e2c9..ebd086117 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 @@ -11,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; +import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; @@ -37,8 +38,7 @@ public class DefaultServerCache implements ServerCache { /** * The underlying map (ConcurrentHashMap or similar) */ - protected final Map map; - + protected final Map> map; protected final CountMetric hitCount; protected final CountMetric missCount; protected final CountMetric putCount; @@ -48,16 +48,11 @@ public class DefaultServerCache implements ServerCache { protected final String name; protected final String shortName; - - private int maxSize; - + private final int maxSize; private final int trimFrequency; - - private int maxIdleSecs; - - private int maxSecsToLive; - - private TenantAwareKey tenantAwareKey; + private final int maxIdleSecs; + private final int maxSecsToLive; + private final TenantAwareKey tenantAwareKey; public DefaultServerCache(DefaultServerCacheConfig config) { this.name = config.getName(); @@ -70,7 +65,6 @@ public class DefaultServerCache implements ServerCache { this.trimFrequency = config.determineTrimFrequency(); MetricFactory factory = MetricFactory.get(); - String prefix = "l2n."; this.hitCount = factory.createCountMetric(prefix + shortName + ".hit"); this.missCount = factory.createCountMetric(prefix + shortName + ".miss"); @@ -81,9 +75,7 @@ public class DefaultServerCache implements ServerCache { } public void periodicTrim(BackgroundExecutor executor) { - EvictionRunnable trim = new EvictionRunnable(); - // default to trimming the cache every 60 seconds long trimFreqSecs = (trimFrequency == 0) ? 60 : trimFrequency; executor.scheduleWithFixedDelay(trim, trimFreqSecs, trimFreqSecs, TimeUnit.SECONDS); @@ -101,11 +93,9 @@ public class DefaultServerCache implements ServerCache { @Override public ServerCacheStatistics getStatistics(boolean reset) { - ServerCacheStatistics cacheStats = new ServerCacheStatistics(); cacheStats.setCacheName(name); cacheStats.setMaxSize(maxSize); - cacheStats.setSize(size()); cacheStats.setHitCount(hitCount.get(reset)); cacheStats.setMissCount(missCount.get(reset)); @@ -113,7 +103,6 @@ public class DefaultServerCache implements ServerCache { cacheStats.setRemoveCount(removeCount.get(reset)); cacheStats.setClearCount(clearCount.get(reset)); cacheStats.setEvictCount(evictCount.get(reset)); - return cacheStats; } @@ -133,10 +122,8 @@ public class DefaultServerCache implements ServerCache { @Override public int getHitRatio() { - long mc = missCount.get(false); long hc = hitCount.get(false); - long totalCount = hc + mc; if (totalCount == 0) { return 0; @@ -177,7 +164,6 @@ public class DefaultServerCache implements ServerCache { */ @Override public Object get(Object id) { - CacheEntry entry = getCacheEntry(id); if (entry == null) { missCount.increment(); @@ -199,7 +185,8 @@ public class DefaultServerCache implements ServerCache { * Get the cache entry - override for query cache to validate dependent tables. */ protected CacheEntry getCacheEntry(Object id) { - return map.get(key(id)); + final SoftReference ref = map.get(key(id)); + return ref != null ? ref.get() : null; } @Override @@ -213,7 +200,7 @@ public class DefaultServerCache implements ServerCache { @Override public void put(Object id, Object value) { Object key = key(id); - map.put(key, new CacheEntry(key, value)); + map.put(key, new SoftReference<>(new CacheEntry(key, value))); putCount.increment(); } @@ -222,8 +209,8 @@ public class DefaultServerCache implements ServerCache { */ @Override public void remove(Object id) { - CacheEntry entry = map.remove(key(id)); - if (entry != null) { + SoftReference entry = map.remove(key(id)); + if (entry != null && entry.get() != null) { removeCount.increment(); } } @@ -250,74 +237,69 @@ public class DefaultServerCache implements ServerCache { * Run the eviction based on Idle time, Time to live and LRU last access. */ public void runEviction() { - long trimForMaxSize; if (maxSize == 0) { trimForMaxSize = 0; } else { trimForMaxSize = size() - maxSize; } - if (maxIdleSecs == 0 && maxSecsToLive == 0 && trimForMaxSize < 0) { // nothing to trim on this cache return; } - long startNanos = System.nanoTime(); - long trimmedByIdle = 0; + long trimmedByGC = 0; long trimmedByTTL = 0; long trimmedByLRU = 0; List activeList = new ArrayList<>(map.size()); - long idleExpireNano = startNanos - TimeUnit.SECONDS.toNanos(maxIdleSecs); long ttlExpireNano = startNanos - TimeUnit.SECONDS.toNanos(maxSecsToLive); - - Iterator it = map.values().iterator(); + Iterator> it = map.values().iterator(); while (it.hasNext()) { - CacheEntry cacheEntry = it.next(); - if (maxIdleSecs > 0 && idleExpireNano > cacheEntry.getLastAccessTime()) { + SoftReference ref = it.next(); + final CacheEntry cacheEntry = ref.get(); + if (cacheEntry == null) { + it.remove(); + trimmedByGC++; + } else if (maxIdleSecs > 0 && idleExpireNano > cacheEntry.getLastAccessTime()) { it.remove(); trimmedByIdle++; - } else if (maxSecsToLive > 0 && ttlExpireNano > cacheEntry.getCreateTime()) { it.remove(); trimmedByTTL++; - } else if (trimForMaxSize > 0) { activeList.add(cacheEntry); } } - - if (trimForMaxSize > 0) { - trimmedByLRU = activeList.size() - maxSize; - if (trimmedByLRU > 0) { - // sort into last access time ascending - activeList.sort(BY_LAST_ACCESS); - int trimSize = getTrimSize(); - for (int i = trimSize; i < activeList.size(); i++) { - // remove if still in the cache - map.remove(activeList.get(i).getKey()); + if (trimForMaxSize > 0 && activeList.size() > maxSize) { + // sort into last access time ascending + activeList.sort(BY_LAST_ACCESS); + int trimSize = getTrimSize(); + for (int i = trimSize; i < activeList.size(); i++) { + // remove if still in the cache + if (map.remove(activeList.get(i).getKey()) != null) { + trimmedByLRU++; } } } evictCount.add(trimmedByIdle); + evictCount.add(trimmedByGC); evictCount.add(trimmedByTTL); evictCount.add(trimmedByLRU); - if (logger.isTraceEnabled()) { long exeMicros = TimeUnit.MICROSECONDS.convert(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); - logger.trace("Executed trim of cache {} in [{}]millis idle[{}] timeToLive[{}] accessTime[{}]" - , name, exeMicros, trimmedByIdle, trimmedByTTL, trimmedByLRU); + logger.trace("Executed trim of cache {} in [{}]millis idle[{}] timeToLive[{}] accessTime[{}] gc[{}]", + name, exeMicros, trimmedByIdle, trimmedByTTL, trimmedByLRU, trimmedByGC); } } /** * Runnable that calls the eviction routine. */ - public class EvictionRunnable implements Runnable { + public final class EvictionRunnable implements Runnable { @Override public void run() { @@ -328,7 +310,7 @@ public class DefaultServerCache implements ServerCache { /** * Comparator for sorting by last access time. */ - public static class CompareByLastAccess implements Comparator, Serializable { + public static final class CompareByLastAccess implements Comparator, Serializable { private static final long serialVersionUID = 1L; @@ -341,7 +323,7 @@ public class DefaultServerCache implements ServerCache { /** * Wraps the value to additionally hold createTime and lastAccessTime and hit counter. */ - public static class CacheEntry { + public static final class CacheEntry { private final Object key; private final Object value; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java index 638f237a2..2c329a62a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java @@ -4,26 +4,26 @@ import io.ebean.cache.QueryCacheEntryValidate; import io.ebean.cache.ServerCacheConfig; import io.ebean.cache.ServerCacheOptions; import io.ebean.config.CurrentTenantProvider; +import io.ebeaninternal.server.cache.DefaultServerCache.CacheEntry; +import java.lang.ref.SoftReference; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class DefaultServerCacheConfig { +public final class DefaultServerCacheConfig { private final ServerCacheConfig config; - - private int maxSize; - private int maxIdleSecs; - private int maxSecsToLive; - private int trimFrequency; - - private Map map; + private final int maxSize; + private final int maxIdleSecs; + private final int maxSecsToLive; + private final int trimFrequency; + private final Map> map; public DefaultServerCacheConfig(ServerCacheConfig config) { this(config, new ConcurrentHashMap<>()); } - public DefaultServerCacheConfig(ServerCacheConfig config, Map map) { + public DefaultServerCacheConfig(ServerCacheConfig config, Map> map) { this.config = config; this.map = map; @@ -50,7 +50,7 @@ public class DefaultServerCacheConfig { return config.getShortName(); } - public Map getMap() { + public Map> getMap() { return map; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheFactory.java index 1b0476f3c..eab615ed1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheFactory.java @@ -11,7 +11,7 @@ import io.ebean.cache.ServerCacheNotify; /** * Default implementation of ServerCacheFactory. */ -class DefaultServerCacheFactory implements ServerCacheFactory { +final class DefaultServerCacheFactory implements ServerCacheFactory { private final BackgroundExecutor executor; @@ -31,7 +31,6 @@ class DefaultServerCacheFactory implements ServerCacheFactory { @Override public ServerCache createCache(ServerCacheConfig config) { - DefaultServerCache cache; if (config.isQueryCache()) { // use a server cache aware of extra validation and QueryCacheEntry 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 7214437cc..562a98371 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 @@ -19,18 +19,14 @@ import java.util.Map; /** * Manages the bean and query caches. */ -public class DefaultServerCacheManager implements SpiCacheManager { +public final class DefaultServerCacheManager implements SpiCacheManager { private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.REGION"); private final Map regionMap = new HashMap<>(); - private final ClusterManager clusterManager; - private final DefaultCacheHolder cacheHolder; - private final boolean localL2Caching; - private final String serverName; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCachePlugin.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCachePlugin.java index 262aa8bf2..d4a6a247f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCachePlugin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCachePlugin.java @@ -8,7 +8,7 @@ import io.ebean.config.DatabaseConfig; /** * Default implementation of ServerCachePlugin. */ -public class DefaultServerCachePlugin implements ServerCachePlugin { +public final class DefaultServerCachePlugin implements ServerCachePlugin { /** * Creates the default ServerCacheFactory. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerQueryCache.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerQueryCache.java index afbdb37f7..4f437eafc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerQueryCache.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerQueryCache.java @@ -3,6 +3,8 @@ package io.ebeaninternal.server.cache; import io.ebean.cache.QueryCacheEntry; import io.ebean.cache.QueryCacheEntryValidate; +import java.lang.ref.SoftReference; + /** * Server cache for query caching. *

@@ -27,7 +29,8 @@ public class DefaultServerQueryCache extends DefaultServerCache { @Override protected CacheEntry getCacheEntry(Object id) { Object key = key(id); - CacheEntry entry = map.get(key); + final SoftReference ref = map.get(key); + CacheEntry entry = ref != null ? ref.get() : null; if (entry == null) { return null; } 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 ef327d69e..21f04704d 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 @@ -12,11 +12,10 @@ import java.util.List; /** * Cache events broadcast across the cluster. */ -public class RemoteCacheEvent implements BinaryWritable { +public final class RemoteCacheEvent implements BinaryWritable { - private boolean clearAll; - - private List clearCaches; + private final boolean clearAll; + private final List clearCaches; /** * Clear all the caches. @@ -57,10 +56,8 @@ public class RemoteCacheEvent implements BinaryWritable { } public static RemoteCacheEvent readBinaryMessage(BinaryReadContext dataInput) throws IOException { - boolean clearAll = dataInput.readBoolean(); int size = dataInput.readInt(); - List clearCache = null; if (size > 0) { clearCache = new ArrayList<>(size); @@ -68,7 +65,6 @@ public class RemoteCacheEvent implements BinaryWritable { clearCache.add(dataInput.readUTF()); } } - return new RemoteCacheEvent(clearAll, clearCache); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/ChangeJsonBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/ChangeJsonBuilder.java index 372de9589..f399b78ad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/ChangeJsonBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/ChangeJsonBuilder.java @@ -14,21 +14,14 @@ import java.util.Map; /** * Builds JSON document for a bean change. */ -class ChangeJsonBuilder { +final class ChangeJsonBuilder { - protected final JsonFactory jsonFactory = new JsonFactory(); - - protected final JsonContext json; - - ChangeJsonBuilder(JsonContext json) { - this.json = json; - } + private final JsonFactory jsonFactory = new JsonFactory(); /** * Write the bean change as JSON. */ void writeBeanJson(Writer writer, BeanChange bean, ChangeSet changeSet) throws IOException { - try (JsonGenerator generator = jsonFactory.createGenerator(writer)) { writeBeanChange(generator, bean, changeSet); generator.flush(); @@ -39,9 +32,7 @@ class ChangeJsonBuilder { * Write the bean change as JSON document containing the transaction header details. */ private void writeBeanChange(JsonGenerator gen, BeanChange bean, ChangeSet changeSet) throws IOException { - gen.writeStartObject(); - gen.writeNumberField("ts", bean.getEventTime()); gen.writeStringField("change", bean.getEvent().getCode()); gen.writeStringField("type", bean.getType()); @@ -49,9 +40,7 @@ class ChangeJsonBuilder { if (bean.getTenantId() != null) { gen.writeStringField("tenantId", bean.getTenantId().toString()); } - writeBeanTransactionDetails(gen, changeSet); - writeBeanValues(gen, bean); gen.writeEndObject(); } @@ -60,7 +49,6 @@ class ChangeJsonBuilder { * Denormalise by writing the transaction header details. */ private void writeBeanTransactionDetails(JsonGenerator gen, ChangeSet changeSet) throws IOException { - String source = changeSet.getSource(); if (source != null) { gen.writeStringField("source", source); @@ -87,12 +75,10 @@ class ChangeJsonBuilder { * For insert and update write the new/old values. */ private void writeBeanValues(JsonGenerator gen, BeanChange bean) throws IOException { - if (bean.getEvent() != ChangeType.DELETE) { gen.writeFieldName("data"); gen.writeRaw(":"); gen.writeRaw(bean.getData()); - String oldData = bean.getOldData(); if (oldData != null) { gen.writeRaw(",\"oldData\":"); 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 0168fa222..6e12aa31d 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 @@ -15,12 +15,12 @@ import java.util.Properties; /** * Simply logs the change sets in JSON form to logger named io.ebean.ChangeLog. */ -public class DefaultChangeLogListener implements ChangeLogListener, Plugin { +public final class DefaultChangeLogListener implements ChangeLogListener, Plugin { /** * The usual application specific logger. */ - protected static final Logger logger = LoggerFactory.getLogger(DefaultChangeLogListener.class); + private static final Logger logger = LoggerFactory.getLogger(DefaultChangeLogListener.class); /** * The named logger we send the change set payload to. Can be externally configured as desired. @@ -45,8 +45,7 @@ public class DefaultChangeLogListener implements ChangeLogListener, Plugin { */ @Override public void configure(SpiServer server) { - jsonBuilder = new ChangeJsonBuilder(server.json()); - + jsonBuilder = new ChangeJsonBuilder(); Properties properties = server.getServerConfig().getProperties(); if (properties != null) { String bufferSize = properties.getProperty("ebean.changeLog.bufferSize"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogPrepare.java b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogPrepare.java index 16af27424..596d4d331 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogPrepare.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogPrepare.java @@ -11,7 +11,7 @@ import io.ebean.event.changelog.ChangeSet; * on the changeSet. *

*/ -public class DefaultChangeLogPrepare implements ChangeLogPrepare { +public final class DefaultChangeLogPrepare implements ChangeLogPrepare { /** * Just return true to send change set through to the logger. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java index a6208a703..e7a7bf303 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java @@ -14,10 +14,9 @@ import java.util.Set; /** * Default implementation of ChangeLogRegister. */ -public class DefaultChangeLogRegister implements ChangeLogRegister { +public final class DefaultChangeLogRegister implements ChangeLogRegister { private static final BasicFilter INCLUDE_INSERTS = new BasicFilter(true); - private static final BasicFilter EXCLUDE_INSERTS = new BasicFilter(false); private final boolean defaultInsertsInclude; @@ -31,20 +30,16 @@ public class DefaultChangeLogRegister implements ChangeLogRegister { @Override public ChangeLogFilter getChangeFilter(Class beanType) { - ChangeLog changeLog = getChangeLog(beanType); if (changeLog == null) { return null; } - String[] updatesThatInclude = changeLog.updatesThatInclude(); if (updatesThatInclude.length == 0) { return insertModeInclude(changeLog.inserts()) ? INCLUDE_INSERTS : EXCLUDE_INSERTS; } - Set updateProps = new HashSet<>(); Collections.addAll(updateProps, updatesThatInclude); - return new UpdateFilter(insertModeInclude(changeLog.inserts()), updateProps); } 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 67844c631..a88f1bbe9 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 @@ -23,25 +23,16 @@ import javax.persistence.PersistenceException; public abstract class AbstractSqlQueryRequest implements CancelableQuery { protected final SpiSqlBinding query; - protected final SpiEbeanServer server; - protected SpiTransaction transaction; - private boolean createdTransaction; - protected String sql; - protected ResultSet resultSet; - protected String bindLog = ""; - protected PreparedStatement pstmt; - protected long startNano; - private final ReentrantLock lock = new ReentrantLock(); - + /** * Create the BeanFindRequest. */ @@ -161,7 +152,8 @@ public abstract class AbstractSqlQueryRequest implements CancelableQuery { this.bindLog = binder.bind(bindParams, pstmt, conn); } if (isLogSql()) { - transaction.logSql(Str.add(TrimLogSql.trim(sql), "; --bind(", bindLog, ")")); + long micros = (System.nanoTime() - startNano) / 1000L; + transaction.logSql(Str.add(TrimLogSql.trim(sql), "; --bind(", bindLog, ") --micros(", micros + ")")); } } finally { lock.unlock(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/BindPadding.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/BindPadding.java index 75963723e..8659fabfd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/BindPadding.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/BindPadding.java @@ -33,7 +33,7 @@ public final class BindPadding { * Extra padding on binding id's in order to get better hit ratio on DB prepared statements / query plans. */ static int padding(int size) { - if (size == 1) { + if (size <= 1) { return 0; } if (size <= 5) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DScriptRunner.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DScriptRunner.java index 8bf649438..cb78076bc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DScriptRunner.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DScriptRunner.java @@ -17,7 +17,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.Map; -class DScriptRunner implements ScriptRunner { +final class DScriptRunner implements ScriptRunner { private static final String NEWLINE = "\n"; 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 a96907848..9a7c54034 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 @@ -36,9 +36,8 @@ import java.sql.SQLException; /** * Create a DatabasePlatform from the configuration. *

- * Will used platform name or use the meta data from the JDBC driver to + * Will used platform name or use the metadata from the JDBC driver to * determine the platform automatically. - *

*/ public class DatabasePlatformFactory { @@ -54,14 +53,12 @@ public class DatabasePlatformFactory { logger.info("offline platform [{}]", offlinePlatform); return byDatabaseName(offlinePlatform); } - if (config.getDatabasePlatformName() != null) { // choose based on dbName return byDatabaseName(config.getDatabasePlatformName()); } - if (config.getDataSourceConfig().isOffline()) { - throw new PersistenceException("You must specify a DatabasePlatformName when you are offline"); + throw new PersistenceException("DatabasePlatformName must be specified with offline mode"); } // guess using meta data from driver return byDataSource(config.getDataSource()); @@ -142,10 +139,10 @@ public class DatabasePlatformFactory { * Find the platform by the metaData.getDatabaseProductName(). */ private DatabasePlatform byDatabaseMeta(DatabaseMetaData metaData, Connection connection) throws SQLException { - String dbProductName = metaData.getDatabaseProductName().toLowerCase(); final int majorVersion = metaData.getDatabaseMajorVersion(); final int minorVersion = metaData.getDatabaseMinorVersion(); + logger.debug("platform for productName[{}] version[{}.{}]", dbProductName, majorVersion, minorVersion); if (dbProductName.contains("oracle")) { return oracleVersion(majorVersion); @@ -206,7 +203,6 @@ public class DatabasePlatformFactory { } catch (SQLException e) { logger.warn("Error running detection query on Postgres", e); } - if (majorVersion <= 9) { return new Postgres9Platform(); } 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 34417ed14..4d0409d4c 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 @@ -26,12 +26,11 @@ import java.util.List; /** * Helper to handle lazy loading and refreshing of beans. */ -class DefaultBeanLoader { +final class DefaultBeanLoader { private static final Logger logger = LoggerFactory.getLogger(DefaultBeanLoader.class); private final DefaultServer server; - private final boolean onIterateUseExtraTxn; DefaultBeanLoader(DefaultServer server) { @@ -40,17 +39,14 @@ class DefaultBeanLoader { } void loadMany(LoadManyRequest loadRequest) { - SpiQuery query = loadRequest.createQuery(server); executeQuery(loadRequest, query); loadRequest.postLoad(); } void loadMany(BeanCollection bc, boolean onlyIds) { - EntityBean parentBean = bc.getOwnerBean(); String propertyName = bc.getPropertyName(); - loadManyInternal(parentBean, propertyName, null, false, onlyIds); } @@ -59,13 +55,10 @@ class DefaultBeanLoader { } private void loadManyInternal(EntityBean parentBean, String propertyName, Transaction t, boolean refresh, boolean onlyIds) { - EntityBeanIntercept ebi = parentBean._ebean_getIntercept(); PersistenceContext pc = ebi.getPersistenceContext(); - BeanDescriptor parentDesc = server.getBeanDescriptor(parentBean.getClass()); BeanPropertyAssocMany many = (BeanPropertyAssocMany) parentDesc.getBeanProperty(propertyName); - BeanCollection beanCollection = null; ExpressionList filterMany = null; @@ -126,7 +119,6 @@ class DefaultBeanLoader { } server.findOne(query, t); - if (beanCollection != null) { if (beanCollection.checkEmptyLazyLoad()) { if (logger.isDebugEnabled()) { @@ -142,7 +134,6 @@ class DefaultBeanLoader { * Load a batch of beans for +query or +lazy loading. */ void loadBean(LoadBeanRequest loadRequest) { - List batch = loadRequest.getBatch(); if (batch.isEmpty()) { throw new RuntimeException("Nothing in batch?"); @@ -190,7 +181,6 @@ class DefaultBeanLoader { } private void refreshBeanInternal(EntityBean bean, SpiQuery.Mode mode, int embeddedOwnerIndex) { - EntityBeanIntercept ebi = bean._ebean_getIntercept(); PersistenceContext pc = ebi.getPersistenceContext(); if (Mode.REFRESH_BEAN == mode) { @@ -203,12 +193,10 @@ class DefaultBeanLoader { // lazy loading on an embedded bean property EntityBean embeddedOwner = (EntityBean) ebi.getEmbeddedOwner(); int ownerIndex = ebi.getEmbeddedOwnerIndex(); - refreshBeanInternal(embeddedOwner, mode, ownerIndex); } Object id = desc.getId(bean); - if (pc == null) { // a reference with no existing persistenceContext pc = new DefaultPersistenceContext(); @@ -216,7 +204,6 @@ class DefaultBeanLoader { ebi.setPersistenceContext(pc); } boolean draft = desc.isDraftInstance(bean); - if (embeddedOwnerIndex == -1) { if (desc.lazyLoadMany(ebi)) { return; @@ -246,16 +233,13 @@ class DefaultBeanLoader { query.setPersistenceContext(pc); query.setMode(mode); query.setId(id); - if (embeddedOwnerIndex > -1 || mode == Mode.REFRESH_BEAN) { // make sure the query doesn't use the cache query.setUseCache(false); } - if (ebi.isReadOnly()) { query.setReadOnly(true); } - if (Mode.REFRESH_BEAN == mode) { // explicitly state to load all properties on REFRESH. // Lobs default to fetch lazy so this forces lobs to be @@ -268,7 +252,6 @@ class DefaultBeanLoader { String msg = "Bean not found during lazy load or refresh." + " id[" + id + "] type[" + desc.getBeanType() + "]"; throw new EntityNotFoundException(msg); } - desc.resetManyProperties(dbBean); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanState.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanState.java index 22f2b7ae8..332b4fc0d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanState.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultBeanState.java @@ -11,7 +11,7 @@ import java.util.Set; /** * Default implementation of BeanState. */ -public class DefaultBeanState implements BeanState { +public final class DefaultBeanState implements BeanState { private final EntityBeanIntercept intercept; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallOriginFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallOriginFactory.java index 249f4dbdb..233a2a920 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallOriginFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallOriginFactory.java @@ -8,7 +8,7 @@ import java.util.Arrays; /** * Default CallStackFactory where the Hash function for StackTraceElement includes the line number. */ -public class DefaultCallOriginFactory implements CallOriginFactory { +public final class DefaultCallOriginFactory implements CallOriginFactory { private static final int IGNORE_LEADING_ELEMENTS = 5; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallableSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallableSql.java index f41919ce2..fe7b18392 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallableSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultCallableSql.java @@ -12,7 +12,7 @@ import java.sql.CallableStatement; import java.sql.SQLException; -public class DefaultCallableSql implements Serializable, SpiCallableSql { +public final class DefaultCallableSql implements Serializable, SpiCallableSql { private static final long serialVersionUID = 8984272253185424701L; 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 cdefcc294..348fd2f32 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 @@ -32,9 +32,9 @@ import java.util.concurrent.locks.ReentrantLock; /** * Default Server side implementation of ServerFactory. */ -public class DefaultContainer implements SpiContainer { +public final class DefaultContainer implements SpiContainer { - private static final Logger logger = LoggerFactory.getLogger("io.ebean.internal.DefaultContainer"); + private static final Logger logger = LoggerFactory.getLogger("io.ebean.DB"); private final ReentrantLock lock = new ReentrantLock(); private final ClusterManager clusterManager; @@ -77,9 +77,10 @@ public class DefaultContainer implements SpiContainer { public SpiEbeanServer createServer(DatabaseConfig config) { lock.lock(); try { + long start = System.currentTimeMillis(); applyConfigServices(config); setNamingConvention(config); - BootupClasses bootupClasses = getBootupClasses(config); + BootupClasses bootupClasses = bootupClasses(config); boolean online = true; if (config.isDocStoreOnly()) { @@ -101,22 +102,18 @@ public class DefaultContainer implements SpiContainer { // use a configured DbEncrypt rather than the platform default config.getDatabasePlatform().setDbEncrypt(config.getDbEncrypt()); } - // inform the NamingConvention of the associated DatabasePlatform config.getNamingConvention().setDatabasePlatform(config.getDatabasePlatform()); - // executor and l2 caching service setup early (used during server construction) SpiBackgroundExecutor executor = createBackgroundExecutor(config); InternalConfiguration c = new InternalConfiguration(online, clusterManager, executor, config, bootupClasses); - DefaultServer server = new DefaultServer(c, c.cacheManager()); - - // generate and run DDL if required - // if there are any other tasks requiring action in their plugins, do them as well + // generate and run DDL if required plus other plugins if (!DbOffline.isGenerateMigration()) { startServer(online, server); } DbOffline.reset(); + logger.info("started database[{}] platform[{}] in {}ms", config.getName(), config.getDatabasePlatform().getPlatform(), System.currentTimeMillis() - start); return server; } finally { lock.unlock(); @@ -161,9 +158,8 @@ public class DefaultContainer implements SpiContainer { * Get the entities, scalarTypes, Listeners etc combining the class registered * ones with the already created instances. */ - private BootupClasses getBootupClasses(DatabaseConfig config) { - - BootupClasses bootup = getBootupClasses1(config); + private BootupClasses bootupClasses(DatabaseConfig config) { + BootupClasses bootup = bootupClasses1(config); bootup.addIdGenerators(config.getIdGenerators()); bootup.addPersistControllers(config.getPersistControllers()); bootup.addPostLoaders(config.getPostLoaders()); @@ -173,7 +169,6 @@ public class DefaultContainer implements SpiContainer { bootup.addQueryAdapters(config.getQueryAdapters()); bootup.addServerConfigStartup(config.getServerConfigStartupListeners()); bootup.addChangeLogInstances(config); - bootup.runServerConfigStartup(config); return bootup; } @@ -181,14 +176,12 @@ public class DefaultContainer implements SpiContainer { /** * Get the class based entities, scalarTypes, Listeners etc. */ - private BootupClasses getBootupClasses1(DatabaseConfig config) { - + private BootupClasses bootupClasses1(DatabaseConfig config) { List> entityClasses = config.getClasses(); if (config.isDisableClasspathSearch() || (entityClasses != null && !entityClasses.isEmpty())) { // use classes we explicitly added via configuration return new BootupClasses(entityClasses); } - return BootupClassPathSearch.search(config); } @@ -205,7 +198,6 @@ public class DefaultContainer implements SpiContainer { * Set the DatabasePlatform if it has not already been set. */ private void setDatabasePlatform(DatabaseConfig config) { - DatabasePlatform platform = config.getDatabasePlatform(); if (platform == null) { if (config.getTenantMode().isDynamicDataSource()) { @@ -215,7 +207,6 @@ public class DefaultContainer implements SpiContainer { platform = new DatabasePlatformFactory().create(config); config.setDatabasePlatform(platform); } - logger.info("DatabasePlatform name:{} platform:{}", config.getName(), platform.getName()); platform.configure(config.getPlatformConfig()); } @@ -255,6 +246,9 @@ public class DefaultContainer implements SpiContainer { } throw new RuntimeException("DataSource not set?"); } + if (config.skipDataSourceCheck()) { + return true; + } try (Connection connection = config.getDataSource().getConnection()) { if (connection.getAutoCommit()) { logger.warn("DataSource [{}] has autoCommit defaulting to true!", config.getName()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java index a6a65e19d..a1775e818 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java @@ -19,7 +19,7 @@ import java.util.List; /** * DefaultServer based implementation of MetaInfoManager. */ -public class DefaultMetaInfoManager implements MetaInfoManager { +final class DefaultMetaInfoManager implements MetaInfoManager { private final DefaultServer server; 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 051d331ba..ba2e99bda 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 @@ -6,7 +6,7 @@ import io.ebean.meta.MetaQueryPlan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class DefaultQueryPlanListener implements QueryPlanListener { +final class DefaultQueryPlanListener implements QueryPlanListener { static final QueryPlanListener INSTANT = new DefaultQueryPlanListener(); @@ -18,8 +18,8 @@ class DefaultQueryPlanListener implements QueryPlanListener { String dbName = capture.getDatabase().getName(); for (MetaQueryPlan plan : capture.getPlans()) { log.info("queryPlan db:{} label:{} queryTimeMicros:{} loc:{} sql:{} bind:{} plan:{}", - dbName, plan.getLabel(), plan.getQueryTimeMicros(), plan.getProfileLocation(), - plan.getSql(), plan.getBind(), plan.getPlan()); + 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 4aa90ad13..1c77e06a8 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 @@ -397,6 +397,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { if (dbSchema != null) { migrationRunner.setDefaultDbSchema(dbSchema); } + migrationRunner.setPlatform(config.getDatabasePlatform().getPlatform().base().name().toLowerCase()); migrationRunner.loadProperties(config.getProperties()); migrationRunner.run(config.getDataSource()); } @@ -415,8 +416,8 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { private void collectQueryPlans() { QueryPlanRequest request = new QueryPlanRequest(); - request.setMaxCount(config.getQueryPlanCaptureMaxCount()); - request.setMaxTimeMillis(config.getQueryPlanCaptureMaxTimeMillis()); + request.maxCount(config.getQueryPlanCaptureMaxCount()); + request.maxTimeMillis(config.getQueryPlanCaptureMaxTimeMillis()); // obtains query explain plans ... List plans = metaInfoManager.queryPlanCollectNow(request); @@ -489,6 +490,11 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { } } + @Override + public String toString() { + return "Database{" + serverName + "}"; + } + /** * Return the server name. */ @@ -525,8 +531,8 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { * Compile a query. Only valid for ORM queries. */ @Override - public CQuery compileQuery(Query query, Transaction t) { - SpiOrmQueryRequest qr = createQueryRequest(Type.SUBQUERY, query, t); + public CQuery compileQuery(Type type, Query query, Transaction t) { + SpiOrmQueryRequest qr = createQueryRequest(type, query, t); OrmQueryRequest orm = (OrmQueryRequest) qr; return cqueryEngine.buildQuery(orm); } @@ -2054,17 +2060,15 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return transactionManager; } - public void register(BeanPersistController c) { - List> list = beanDescriptorManager.getBeanDescriptorList(); - for (BeanDescriptor aList : list) { - aList.register(c); + public void register(BeanPersistController controller) { + for (BeanDescriptor desc : beanDescriptorManager.getBeanDescriptorList()) { + desc.register(controller); } } public void deregister(BeanPersistController c) { - List> list = beanDescriptorManager.getBeanDescriptorList(); - for (BeanDescriptor aList : list) { - aList.deregister(c); + for (BeanDescriptor desc : beanDescriptorManager.getBeanDescriptorList()) { + desc.deregister(c); } } @@ -2327,13 +2331,13 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public void visitMetrics(MetricVisitor visitor) { visitor.visitStart(); - if (visitor.isCollectTransactionMetrics()) { + if (visitor.collectTransactionMetrics()) { transactionManager.visitMetrics(visitor); } - if (visitor.isCollectL2Metrics()) { + if (visitor.collectL2Metrics()) { serverCacheManager.visitMetrics(visitor); } - if (visitor.isCollectQueryMetrics()) { + if (visitor.collectQueryMetrics()) { beanDescriptorManager.visitMetrics(visitor); dtoBeanManager.visitMetrics(visitor); relationalQueryEngine.visitMetrics(visitor); @@ -2350,7 +2354,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { List queryPlanInit(QueryPlanInit initRequest) { if (initRequest.isAll()) { - queryPlanManager.setDefaultThreshold(initRequest.getThresholdMicros()); + queryPlanManager.setDefaultThreshold(initRequest.thresholdMicros()); } return beanDescriptorManager.queryPlanInit(initRequest); } 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 b271a513e..64c813213 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 @@ -9,13 +9,12 @@ import org.slf4j.LoggerFactory; /** * Default slow query listener implementation that logs a warning message. */ -class DefaultSlowQueryListener implements SlowQueryListener { +final class DefaultSlowQueryListener implements SlowQueryListener { private static final Logger log = LoggerFactory.getLogger("io.ebean.SlowQuery"); @Override public void process(SlowQueryEvent event) { - String firstStack = ""; ObjectGraphNode node = event.getOriginNode(); if (node != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DiffHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DiffHelp.java index b879727db..9eca59e19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DiffHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DiffHelp.java @@ -12,7 +12,7 @@ import java.util.Map; * This intentionally does not include any OneToMany or ManyToMany properties. *

*/ -public class DiffHelp { +public final class DiffHelp { private DiffHelp() { } @@ -28,11 +28,9 @@ public class DiffHelp { *

*/ public static Map diff(Object newBean, Object oldBean, BeanDescriptor desc) { - if (!(newBean instanceof EntityBean)) { throw new IllegalArgumentException("First bean expected to be an enhanced EntityBean? bean:" + newBean); } - if (oldBean != null) { if (!(oldBean instanceof EntityBean)) { throw new IllegalArgumentException("Second bean expected to be an enhanced EntityBean? bean:" + oldBean); @@ -41,11 +39,9 @@ public class DiffHelp { throw new IllegalArgumentException("Second bean not assignable to the first bean?"); } } - if (oldBean == null) { return ((EntityBean) newBean)._ebean_getIntercept().getDirtyValues(); } - return desc.diff((EntityBean) newBean, (EntityBean) oldBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java index 2b1a55f6e..c023f2d0d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java @@ -28,11 +28,8 @@ public final class DtoQueryRequest extends AbstractSqlQueryRequest { private static final String ENC_PREFIX_UPPER = EncryptAlias.PREFIX.toUpperCase(); private final SpiDtoQuery query; - private final DtoQueryEngine queryEngine; - private DtoQueryPlan plan; - private DataReader dataReader; DtoQueryRequest(SpiEbeanServer server, DtoQueryEngine engine, SpiDtoQuery query) { 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 972ee2754..9b5a1afa7 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 @@ -10,14 +10,12 @@ import io.ebeaninternal.api.SpiEbeanServer; import java.util.Comparator; import java.util.List; -class DumpMetrics { +final class DumpMetrics { private final SpiEbeanServer server; private final String options; - private final String nameFormat; private final String nameFormatTimed; - private boolean dumpHash; private boolean dumpSql; private boolean dumpLoc; @@ -78,11 +76,11 @@ class DumpMetrics { out("-- Dumping metrics for " + server.getName() + " -- "); ServerMetrics serverMetrics = server.getMetaInfoManager().collectMetrics(); - for (MetaTimedMetric metric : serverMetrics.getTimedMetrics()) { + for (MetaTimedMetric metric : serverMetrics.timedMetrics()) { log(metric); } - List countMetrics = serverMetrics.getCountMetrics(); + List countMetrics = serverMetrics.countMetrics(); if (!countMetrics.isEmpty()) { out("\n-- Counters --"); countMetrics.sort(SortMetric.COUNT_NAME); @@ -91,7 +89,7 @@ class DumpMetrics { } } - List queryMetrics = serverMetrics.getQueryMetrics(); + List queryMetrics = serverMetrics.queryMetrics(); if (!queryMetrics.isEmpty()) { out("\n-- Queries --"); queryMetrics.sort(sortBy); @@ -104,8 +102,8 @@ class DumpMetrics { private void logCount(MetaCountMetric metric) { StringBuilder sb = new StringBuilder(); - sb.append(padNameTimed(metric.getName())).append(" "); - sb.append(" count:").append(pad(metric.getCount())); + sb.append(padNameTimed(metric.name())).append(" "); + sb.append(" count:").append(pad(metric.count())); out(sb.toString()); } @@ -120,38 +118,38 @@ class DumpMetrics { appendQueryName(metric, sb); appendCounters(metric, sb); if (dumpHash) { - sb.append("\n hash:").append(metric.getHash()); + sb.append("\n hash:").append(metric.hash()); } appendProfileAndSql(metric, sb); out(sb.toString()); } private void appendQueryName(MetaQueryMetric metric, StringBuilder sb) { - sb.append("query:").append(padName(metric.getName())).append(" "); + sb.append("query:").append(padName(metric.name())).append(" "); } private void appendProfileAndSql(MetaQueryMetric metric, StringBuilder sb) { - String location = metric.getLocation(); + String location = metric.location(); if (dumpLoc && location != null) { sb.append("\n loc:").append(location); } if (dumpSql) { - sb.append(" \n\n sql:").append(metric.getSql()).append("\n\n"); + sb.append(" \n\n sql:").append(metric.sql()).append("\n\n"); } } private void log(MetaTimedMetric metric) { StringBuilder sb = new StringBuilder(); - sb.append(padNameTimed(metric.getName())).append(" "); + sb.append(padNameTimed(metric.name())).append(" "); appendCounters(metric, sb); out(sb.toString()); } private void appendCounters(MetaTimedMetric timedMetric, StringBuilder sb) { - sb.append(" count:").append(pad(timedMetric.getCount())) - .append(" total:").append(pad(timedMetric.getTotal())) - .append(" mean:").append(pad(timedMetric.getMean())) - .append(" max:").append(pad(timedMetric.getMax())); + sb.append(" count:").append(pad(timedMetric.count())) + .append(" total:").append(pad(timedMetric.total())) + .append(" mean:").append(pad(timedMetric.mean())) + .append(" max:").append(pad(timedMetric.max())); } private String padName(String name) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java index 9854cafea..712521ce0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java @@ -14,10 +14,9 @@ import java.util.List; /** * Dump the metrics into a list of MetricData. */ -class DumpMetricsData { +final class DumpMetricsData { private final Database database; - private final List list = new ArrayList<>(); DumpMetricsData(Database database) { @@ -30,10 +29,9 @@ class DumpMetricsData { } private void collect(ServerMetrics serverMetrics) { - - final List timedMetrics = serverMetrics.getTimedMetrics(); - final List countMetrics = serverMetrics.getCountMetrics(); - final List queryMetrics = serverMetrics.getQueryMetrics(); + final List timedMetrics = serverMetrics.timedMetrics(); + final List countMetrics = serverMetrics.countMetrics(); + final List queryMetrics = serverMetrics.queryMetrics(); for (MetaTimedMetric metric : timedMetrics) { add(metric); @@ -47,7 +45,7 @@ class DumpMetricsData { } private MetricData create(MetaMetric metric) { - MetricData data = new MetricData(metric.getName()); + MetricData data = new MetricData(metric.name()); list.add(data); return data; } @@ -55,30 +53,30 @@ class DumpMetricsData { private void add(MetaTimedMetric metric) { final MetricData data = create(metric); appendCounters(data, metric); - data.setLoc(metric.getLocation()); + data.setLoc(metric.location()); } private void addCount(MetaCountMetric metric) { final MetricData data = create(metric); - data.setCount(metric.getCount()); + data.setCount(metric.count()); } private void addQuery(MetaQueryMetric metric) { final MetricData data = create(metric); appendCounters(data, metric); appendLocationAndSql(data, metric); - data.setHash(metric.getHash()); + data.setHash(metric.hash()); } private void appendLocationAndSql(MetricData data, MetaQueryMetric metric) { - data.setLoc(metric.getLocation()); - data.setSql(metric.getSql()); + data.setLoc(metric.location()); + data.setSql(metric.sql()); } private void appendCounters(MetricData data, MetaTimedMetric timedMetric) { - data.setCount(timedMetric.getCount()); - data.setTotal(timedMetric.getTotal()); - data.setMean(timedMetric.getMean()); - data.setMax(timedMetric.getMax()); + data.setCount(timedMetric.count()); + data.setTotal(timedMetric.total()); + data.setMean(timedMetric.mean()); + data.setMax(timedMetric.max()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java index ed13151c4..190af0af4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java @@ -14,23 +14,18 @@ import java.io.StringWriter; import java.util.Comparator; import java.util.List; -class DumpMetricsJson implements ServerMetricsAsJson { +final class DumpMetricsJson implements ServerMetricsAsJson { private final Database database; - private Appendable writer; - /** * By default include sql and location attributes for the initial collection only. */ private int includeExtraAttributes = 1; - private boolean withHeader = true; private boolean withHash = true; private String newLine = "\n"; - private Comparator sortBy = SortMetric.NAME; - private int listCounter; private int objKeyCounter; @@ -84,11 +79,11 @@ class DumpMetricsJson implements ServerMetricsAsJson { private void collect(ServerMetrics serverMetrics) { try { start(); - for (MetaTimedMetric metric : serverMetrics.getTimedMetrics()) { + for (MetaTimedMetric metric : serverMetrics.timedMetrics()) { logTimed(metric); } - List countMetrics = serverMetrics.getCountMetrics(); + List countMetrics = serverMetrics.countMetrics(); if (!countMetrics.isEmpty()) { if (sortBy != null) { countMetrics.sort(SortMetric.COUNT_NAME); @@ -98,7 +93,7 @@ class DumpMetricsJson implements ServerMetricsAsJson { } } - List queryMetrics = serverMetrics.getQueryMetrics(); + List queryMetrics = serverMetrics.queryMetrics(); if (!queryMetrics.isEmpty()) { if (sortBy != null) { queryMetrics.sort(sortBy); @@ -170,7 +165,7 @@ class DumpMetricsJson implements ServerMetricsAsJson { } objStart(); key("name"); - val(metric.getName()); + val(metric.name()); } private void metricEnd() throws IOException { @@ -180,7 +175,7 @@ class DumpMetricsJson implements ServerMetricsAsJson { private void logCount(MetaCountMetric metric) throws IOException { metricStart(metric); key("count"); - val(metric.getCount()); + val(metric.count()); metricEnd(); } @@ -188,7 +183,7 @@ class DumpMetricsJson implements ServerMetricsAsJson { metricStart(metric); appendTiming(metric); if (isIncludeDetail(metric)) { - appendExtra("loc", metric.getLocation()); + append("loc", metric.location()); } metricEnd(); } @@ -197,11 +192,11 @@ class DumpMetricsJson implements ServerMetricsAsJson { metricStart(metric); appendTiming(metric); if (withHash) { - appendExtra("hash", metric.getHash()); + append("hash", metric.hash()); } if (isIncludeDetail(metric)) { - appendExtra("loc", metric.getLocation()); - appendExtra("sql", metric.getSql()); + append("loc", metric.location()); + append("sql", metric.sql()); } metricEnd(); } @@ -210,7 +205,7 @@ class DumpMetricsJson implements ServerMetricsAsJson { return includeExtraAttributes == 2 || includeExtraAttributes == 1 && metric.initialCollection(); } - private void appendExtra(String key, String val) throws IOException { + private void append(String key, String val) throws IOException { if (val != null) { key(key); val(val); @@ -218,13 +213,14 @@ class DumpMetricsJson implements ServerMetricsAsJson { } private void appendTiming(MetaTimedMetric timedMetric) throws IOException { - key("count"); - val(timedMetric.getCount()); - key("total"); - val(timedMetric.getTotal()); - key("mean"); - val(timedMetric.getMean()); - key("max"); - val(timedMetric.getMax()); + append("count", timedMetric.count()); + append("total", timedMetric.total()); + append("mean", timedMetric.mean()); + append("max", timedMetric.max()); + } + + private void append(String key, long value) throws IOException { + key(key); + val(value); } } 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 3a03c7361..f65cb0823 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 @@ -12,10 +12,9 @@ import javax.sql.DataSource; /** * Initialise the main DataSource and read-only DataSource. */ -class InitDataSource { +final class InitDataSource { private final JndiDataSourceLookup jndiDataSourceFactory = new JndiDataSourceLookup(); - private final DatabaseConfig config; /** 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 ccfa08de3..594a9f29d 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 @@ -14,7 +14,7 @@ import java.util.Map; /** * Reads the Xml deployment information. */ -class InternalConfigXmlMap { +final class InternalConfigXmlMap { private static final Logger log = LoggerFactory.getLogger(InternalConfigXmlMap.class); 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 dca8e3059..96ab21aa2 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 @@ -113,7 +113,7 @@ import java.util.ServiceLoader; * Used to extend the DatabaseConfig with additional objects used to configure and * construct an Database. */ -public class InternalConfiguration { +public final class InternalConfiguration { private static final Logger logger = LoggerFactory.getLogger(InternalConfiguration.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/JndiDataSourceLookup.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/JndiDataSourceLookup.java index 0e541fadd..09b2f7a9c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/JndiDataSourceLookup.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/JndiDataSourceLookup.java @@ -9,10 +9,7 @@ import javax.sql.DataSource; /** * Helper to lookup a DataSource from JNDI. */ -public class JndiDataSourceLookup { - - public JndiDataSourceLookup() { - } +class JndiDataSourceLookup { /** * Return the DataSource by JNDI lookup. @@ -21,7 +18,6 @@ public class JndiDataSourceLookup { *

*/ public DataSource lookup(String jndiName) { - try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup(jndiName); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbCatalogSupplier.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbCatalogSupplier.java index 8b369d25a..abe20b1ca 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbCatalogSupplier.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbCatalogSupplier.java @@ -15,11 +15,10 @@ import java.util.logging.Logger; /** * DataSource supplier that changes DB catalog based on current Tenant Id. */ -public class MultiTenantDbCatalogSupplier implements DataSourceSupplier { +final class MultiTenantDbCatalogSupplier implements DataSourceSupplier { private final DataSource dataSource; private final DataSource readOnlyDataSource; - private final CatalogDataSource catalogDataSource; private final CatalogDataSource readOnly; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSchemaSupplier.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSchemaSupplier.java index f37ce202e..2a1af6016 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSchemaSupplier.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSchemaSupplier.java @@ -15,11 +15,10 @@ import java.util.logging.Logger; /** * DataSource supplier that changes DB schema based on current Tenant Id. */ -class MultiTenantDbSchemaSupplier implements DataSourceSupplier { +final class MultiTenantDbSchemaSupplier implements DataSourceSupplier { private final DataSource dataSource; private final DataSource readOnlyDataSource; - private final SchemaDataSource schemaDataSource; private final SchemaDataSource readOnly; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSupplier.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSupplier.java index b985c7864..e6237abfa 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSupplier.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/MultiTenantDbSupplier.java @@ -11,10 +11,9 @@ import java.sql.SQLException; /** * DataSource supplier based on DataSource per Tenant. */ -class MultiTenantDbSupplier implements DataSourceSupplier { +final class MultiTenantDbSupplier implements DataSourceSupplier { private final CurrentTenantProvider tenantProvider; - private final TenantDataSourceProvider dataSourceProvider; MultiTenantDbSupplier(CurrentTenantProvider tenantProvider, TenantDataSourceProvider dataSourceProvider) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/NoopCallOriginFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/NoopCallOriginFactory.java index eee313bc3..a95e507ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/NoopCallOriginFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/NoopCallOriginFactory.java @@ -6,7 +6,7 @@ import io.ebean.bean.CallStack; /** * A CallOriginFactory we can use when we don't use AutoTune. */ -class NoopCallOriginFactory implements CallOriginFactory { +final class NoopCallOriginFactory implements CallOriginFactory { private static final StackTraceElement E0 = new StackTraceElement("none", "none", "none", 0); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistDeferredRelationship.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistDeferredRelationship.java index ff81f49da..41bbb20ef 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistDeferredRelationship.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistDeferredRelationship.java @@ -11,7 +11,7 @@ import io.ebeaninternal.server.deploy.id.ImportedId; * Deferred update of a relationship where an Id value is not initially available * so instead we execute this later as a SqlUpdate statement. */ -public class PersistDeferredRelationship { +public final class PersistDeferredRelationship { private final SpiEbeanServer ebeanServer; private final BeanDescriptor beanDescriptor; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RefreshHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RefreshHelp.java deleted file mode 100644 index 24ff1d117..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RefreshHelp.java +++ /dev/null @@ -1,215 +0,0 @@ -package io.ebeaninternal.server.core; - - -/** - * Helper for performing a 'refresh' on an Entity bean. - *

- * Note that this does not 'refresh' any OnetoMany or ManyToMany properties. It - * refreshes all the other properties though. - *

- */ -public class RefreshHelp { -// -// /** -// * Helper for debug of lazy loading. -// */ -// private final DebugLazyLoad debugLazyLoad; -// -// private final MAdminLoggingMBean logControl; -// -// public RefreshHelp(MAdminLoggingMBean logControl, boolean debugLazyLoad){ -// this.logControl = logControl; -// this.debugLazyLoad = new DebugLazyLoad(debugLazyLoad); -// } -// -// /** -// * Refresh the bean from property values in dbBean. -// */ -// public void refresh(Object o, Object dbBean, BeanDescriptor desc, EntityBeanIntercept ebi, Object id, boolean isLazyLoad) { -// -// Object originalOldValues = null; -// boolean setOriginalOldValues = false; -// -// // set of properties to exclude from the refresh because it is -// // not a refresh but rather a lazyLoading event. -// Set excludes = null; -// -// // turn off intercepting so lazy loading is -// // not invoked when populating the bean -// // with PropertyChangeSupport -// ebi.setIntercepting(false); -// -// boolean readOnly = ebi.isReadOnly(); -// boolean sharedInstance = ebi.isSharedInstance(); -// -// if (isLazyLoad){ -// excludes = ebi.getLoadedProps(); -// if (excludes != null){ -// // lazy loading a "Partial Object"... which already -// // contains some properties and perhaps some oldValues -// // and these will need to be maintained... -// originalOldValues = ebi.getOldValues(); -// setOriginalOldValues = originalOldValues != null; -// } -// -// if (logControl.isDebugLazyLoad()){ -// debug(desc, ebi, id, excludes); -// } -// } -// -// -// BeanProperty[] props = desc.propertiesBaseScalar(); -// for (int i = 0; i < props.length; i++) { -// BeanProperty prop = props[i]; -// if (excludes != null && excludes.contains(prop.getName())){ -// // ignore this property (partial bean lazy loading) -// -// } else { -// Object dbVal = prop.getValue(dbBean); -// if (isLazyLoad) { -// prop.setValue(o, dbVal); -// } else { -// prop.setValueIntercept(o, dbVal); -// } -// if (setOriginalOldValues){ -// // maintain original oldValues for partially loaded bean -// prop.setValue(originalOldValues, dbVal); -// } -// } -// } -// -// BeanPropertyAssocOne[] ones = desc.propertiesOne(); -// for (int i = 0; i < ones.length; i++) { -// BeanProperty prop = ones[i]; -// if (excludes != null && excludes.contains(prop.getName())){ -// // ignore this property (partial bean lazy loading) -// -// } else { -// Object dbVal = prop.getValue(dbBean); -// if (isLazyLoad){ -// prop.setValue(o, dbVal); -// } else { -// prop.setValueIntercept(o, dbVal); -// } -// if (setOriginalOldValues){ -// // maintain original oldValues for partially loaded bean -// prop.setValue(originalOldValues, dbVal); -// } -// if (dbVal != null){ -// if (sharedInstance){ -// // propagate sharedInstance status to associated beans -// ((EntityBean)dbVal)._ebean_getIntercept().setSharedInstance(); -// } else if (readOnly) { -// // propagate readOnly status to associated beans -// ((EntityBean)dbVal)._ebean_getIntercept().setReadOnly(true); -// } -// } -// -// } -// } -// -// refreshEmbedded(o, dbBean, desc, excludes, readOnly); -// -// // set a lazy loading many proxy if required -// BeanPropertyAssocMany[] manys = desc.propertiesMany(); -// for (int i = 0; i < manys.length; i++) { -// BeanPropertyAssocMany prop = manys[i]; -// if (excludes != null && excludes.contains(prop.getName())){ -// // the many already existed on the bean -// -// } else { -// // set a lazy loading proxy -// prop.createReference(o, null, readOnly, sharedInstance); -// } -// } -// -// // the refreshed/lazy loaded bean is always fully -// // populated so set loadedProps to null -// ebi.setLoadedProps(null); -// -// -// // reset the loaded status -// ebi.setLoaded(); -// } -// -// /** -// * Refresh the Embedded beans. -// */ -// private void refreshEmbedded(Object o, Object dbBean, BeanDescriptor desc, Set excludes, boolean propagateReadOnly) { -// -// BeanPropertyAssocOne[] embeds = desc.propertiesEmbedded(); -// for (int i = 0; i < embeds.length; i++) { -// BeanPropertyAssocOne prop = embeds[i]; -// if (excludes != null && excludes.contains(prop.getName())){ -// // ignore this property -// } else { -// // the original embedded bean -// Object oEmb = prop.getValue(o); -// -// // the new one from the database -// Object dbEmb = prop.getValue(dbBean); -// -// if (oEmb == null){ -// // original embedded bean was null -// // so just replace the entire embedded bean -// prop.setValueIntercept(o, dbEmb); -// if (propagateReadOnly && dbEmb != null){ -// // propagate readOnly status to embedded beans -// ((EntityBean)dbEmb)._ebean_getIntercept().setReadOnly(true); -// } -// -// } else { -// // refresh each property of the original -// // embedded bean -// if (oEmb instanceof EntityBean){ -// // turn off interception to stop invoking lazy loading -// // but allow PropertyChangeSupport -// ((EntityBean) oEmb)._ebean_getIntercept().setIntercepting(false); -// } -// -// BeanProperty[] props = prop.getProperties(); -// for (int j = 0; j < props.length; j++) { -// Object v = props[j].getValue(dbEmb); -// props[j].setValueIntercept(oEmb, v); -// } -// -// // No longer calling setLoaded() on embedded bean -// // as the EntityBean itself -// // .. calls setEmbeddedLoaded() on each of -// // .. its embedded beans itself. -// } -// } -// } -// } -// -// -// /** -// * Output some debug to describe the lazy loading event. -// */ -// private void debug(BeanDescriptor desc, EntityBeanIntercept ebi, Object id, Set excludes) { -// -// -// Class beanType = desc.getBeanType(); -// -// StackTraceElement cause = debugLazyLoad.getStackTraceElement(beanType); -// -// String lazyLoadProperty = ebi.getLazyLoadProperty(); -// String msg = "debug.lazyLoad ["+desc+"] id["+id+"] lazyLoadProperty["+lazyLoadProperty+"]"; -// if (excludes != null){ -// msg += " partialProps"+excludes; -// } -// if (cause != null){ -// String causeLine = cause.toString(); -// if (causeLine.indexOf(".groovy:") > -1){ -// // eclipse console does not like finding groovy source at the moment -// causeLine = StringHelper.replaceString(causeLine, ".groovy:", ".groovy :"); -// } -// msg += " at: "+causeLine; -// } -// System.err.println(msg); -// } -// -// -// - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index a5130ef22..ef3874008 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -18,11 +18,8 @@ import java.util.function.Predicate; public final class RelationalQueryRequest extends AbstractSqlQueryRequest { private final RelationalQueryEngine queryEngine; - private String[] propertyNames; - private int estimateCapacity; - private int rows; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/SimpleDataSourceProvider.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/SimpleDataSourceProvider.java index f9a11f14d..7680dd086 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/SimpleDataSourceProvider.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/SimpleDataSourceProvider.java @@ -10,10 +10,9 @@ import java.sql.SQLException; /** * Simple DataSource supplier when no multi-tenancy used. */ -class SimpleDataSourceProvider implements DataSourceSupplier { +final class SimpleDataSourceProvider implements DataSourceSupplier { private final DataSource dataSource; - private final DataSource readOnlyDataSource; SimpleDataSourceProvider(DataSource dataSource, DataSource readOnlyDataSource) { 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 6c539e564..e95c0d461 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 @@ -8,7 +8,7 @@ import java.sql.ResultSet; * * These both must be closed properly when done. */ -public class SpiResultSet { +public final class SpiResultSet { private final PreparedStatement statement; 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 f7c1a5fea..aba5533e0 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 @@ -1,6 +1,5 @@ package io.ebeaninternal.server.core.bootup; -import io.avaje.classpath.scanner.ClassFilter; import io.ebean.annotation.DocStore; import io.ebean.config.DatabaseConfig; import io.ebean.config.IdGenerator; @@ -27,27 +26,23 @@ import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.Table; import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; /** * Interesting classes for a EbeanServer such as Embeddable, Entity, * ScalarTypes, Finders, Listeners and Controllers. */ -public class BootupClasses implements ClassFilter { +public class BootupClasses implements Predicate> { private static final Logger logger = LoggerFactory.getLogger(BootupClasses.class); private final List> embeddableList = new ArrayList<>(); - private final List> entityList = new ArrayList<>(); - private final List>> scalarTypeList = new ArrayList<>(); - private final List>> scalarConverterList = new ArrayList<>(); - private final List>> attributeConverterList = new ArrayList<>(); // The following objects are instantiated on first request @@ -55,19 +50,12 @@ public class BootupClasses implements ClassFilter { // instance list, that holds the instance. Once a class is instantiated // (or added) it will get removed from the candidate list private final List> idGeneratorCandidates = new ArrayList<>(); - private final List> beanPersistControllerCandidates = new ArrayList<>(); - private final List> beanPostLoadCandidates = new ArrayList<>(); - private final List> beanPostConstructListenerCandidates = new ArrayList<>(); - private final List> beanFindControllerCandidates = new ArrayList<>(); - private final List> beanPersistListenerCandidates = new ArrayList<>(); - private final List> beanQueryAdapterCandidates = new ArrayList<>(); - private final List> serverConfigStartupCandidates = new ArrayList<>(); private final List idGeneratorInstances = new ArrayList<>(); @@ -98,7 +86,7 @@ public class BootupClasses implements ClassFilter { public BootupClasses(List> list) { if (list != null) { for (Class cls : list) { - isMatch(cls); + test(cls); } } } @@ -188,13 +176,11 @@ public class BootupClasses implements ClassFilter { } public void addChangeLogInstances(DatabaseConfig config) { - readAuditPrepare = config.getReadAuditPrepare(); readAuditLogger = config.getReadAuditLogger(); changeLogPrepare = config.getChangeLogPrepare(); changeLogListener = config.getChangeLogListener(); changeLogRegister = config.getChangeLogRegister(); - // if not already set create the implementations found // via classpath scanning if (readAuditPrepare == null && readAuditPrepareClass != null) { @@ -341,18 +327,14 @@ public class BootupClasses implements ClassFilter { } @Override - public boolean isMatch(Class cls) { - + public boolean test(Class cls) { if (isEmbeddable(cls)) { embeddableList.add(cls); - } else if (isEntity(cls)) { entityList.add(cls); - } else { return isInterestingInterface(cls); } - return true; } @@ -364,7 +346,6 @@ public class BootupClasses implements ClassFilter { */ @SuppressWarnings("unchecked") private boolean isInterestingInterface(Class cls) { - if (Modifier.isAbstract(cls.getModifiers())) { // do not include abstract classes as we can // not instantiate them 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 874231645..0aad172c3 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 @@ -5,7 +5,7 @@ import io.ebeaninternal.server.query.SqlJoinType; /** * Helper for BeanPropertyAssocOne for OneToOne exported reference - not so common. */ -class AssocOneHelpRefExported extends AssocOneHelp { +final class AssocOneHelpRefExported extends AssocOneHelp { private final boolean softDelete; 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 1d619507b..7204a2cf1 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 @@ -9,7 +9,7 @@ import java.sql.SQLException; /** * Helper for BeanPropertyAssocOne imported reference but with inheritance. */ -class AssocOneHelpRefInherit extends AssocOneHelp { +final class AssocOneHelpRefInherit extends AssocOneHelp { private final InheritInfo inherit; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefSimple.java index 967d7d492..cf6b09798 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefSimple.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.deploy; /** * Helper for BeanPropertyAssocOne imported reference - this is the common case. */ -class AssocOneHelpRefSimple extends AssocOneHelp { +final class AssocOneHelpRefSimple extends AssocOneHelp { AssocOneHelpRefSimple(BeanPropertyAssocOne property, String embeddedPrefix) { super(property, embeddedPrefix); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCascadeInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCascadeInfo.java index 36b7b2152..c5df36975 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCascadeInfo.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCascadeInfo.java @@ -8,7 +8,7 @@ import javax.persistence.CascadeType; * This is set to associated Beans, Table joins and List. *

*/ -public class BeanCascadeInfo { +public final class BeanCascadeInfo { private boolean delete; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanChangeJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanChangeJson.java index e2a6938ff..2e9b9cc69 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanChangeJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanChangeJson.java @@ -11,16 +11,13 @@ import java.io.StringWriter; /** * Builds the 'new values' and 'old values' in JSON form for ChangeLog. */ -class BeanChangeJson implements BeanDiffVisitor { +final class BeanChangeJson implements BeanDiffVisitor { private final StringWriter newData; private final StringWriter oldData; - private final SpiJsonWriter newJson; private final SpiJsonWriter oldJson; - private final ArrayStack> stack = new ArrayStack<>(); - private BeanDescriptor descriptor; BeanChangeJson(BeanDescriptor descriptor, boolean statelessUpdate) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java index a3376cd2e..e46bd2908 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.query.CQueryCollectionAdd; /** * Creates Helpers specific to the type of the property (List Set or Map). */ -public class BeanCollectionHelpFactory { +public final class BeanCollectionHelpFactory { @SuppressWarnings("rawtypes") private static final BeanListHelp LIST_HELP = new BeanListHelp(); @@ -21,7 +21,6 @@ public class BeanCollectionHelpFactory { * Create the helper based on the many property. */ public static BeanCollectionHelp create(BeanPropertyAssocMany many) { - boolean elementCollection = many.isElementCollection(); ManyType manyType = many.getManyType(); switch (manyType) { @@ -30,7 +29,7 @@ public class BeanCollectionHelpFactory { case SET: return elementCollection ? new BeanSetHelpElement<>(many) : new BeanSetHelp<>(many); case MAP: - return elementCollection ? new BeanMapHelpElement<>(many) :new BeanMapHelp<>(many); + return elementCollection ? new BeanMapHelpElement<>(many) : new BeanMapHelp<>(many); default: throw new RuntimeException("Invalid type " + manyType); } @@ -39,7 +38,6 @@ public class BeanCollectionHelpFactory { @SuppressWarnings("unchecked") public static CQueryCollectionAdd create(SpiQuery.Type manyType, OrmQueryRequest request) { - if (manyType == SpiQuery.Type.LIST) { return LIST_HELP; @@ -56,5 +54,4 @@ public class BeanCollectionHelpFactory { } } - } 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 e632a729c..e1a0d352c 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 @@ -9,7 +9,7 @@ import java.util.Map; /** * Utility methods for BeanCollections. */ -public class BeanCollectionUtil { +public final class BeanCollectionUtil { /** * Return true if this is a bean collection and not considered dirty. @@ -66,7 +66,6 @@ public class BeanCollectionUtil { // returns a collection of beans return bc.getActualDetails(); } - if (o instanceof Map) { // yes, we want the entrySet (to set the keys) return ((Map) o).values(); 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 63599b7ad..055f2605a 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 @@ -1559,7 +1559,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { void queryPlanInit(QueryPlanInit request, List list) { for (CQueryPlan queryPlan : queryPlanCache.values()) { if (request.includeHash(queryPlan.getHash())) { - queryPlan.queryPlanInit(request.getThresholdMicros()); + queryPlan.queryPlanInit(request.thresholdMicros()); list.add(queryPlan.createMeta(null, null)); } } @@ -1572,7 +1572,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { iudMetrics.visit(visitor); for (CQueryPlan queryPlan : queryPlanCache.values()) { if (!queryPlan.isEmptyStats()) { - visitor.visitQuery(queryPlan.getSnapshot(visitor.isReset())); + visitor.visitQuery(queryPlan.getSnapshot(visitor.reset())); } } } @@ -2022,7 +2022,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { public boolean isTableManaged(String tableName) { return owner.isTableManaged(tableName); } - + /** * Return the order column property. */ @@ -2519,7 +2519,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { if (propName.indexOf('(') > -1) { return findSqlTreeFormula(propName, path); } - return _findBeanProperty(propName); + return findProperty(propName); } /** @@ -3198,9 +3198,9 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { public void checkMutableProperties(EntityBeanIntercept ebi) { for (BeanProperty beanProperty : propertiesMutable) { int propertyIndex = beanProperty.getPropertyIndex(); - if (!ebi.isDirtyProperty(propertyIndex) && ebi.isLoadedProperty(propertyIndex)) { + if (ebi.isLoadedProperty(propertyIndex)) { Object value = beanProperty.getValue(ebi.getOwner()); - if (value != null && beanProperty.isDirtyValue(value)) { + if (beanProperty.checkMutable(value, ebi.isDirtyProperty(propertyIndex), ebi)) { // mutable scalar value which is considered dirty so mark // it as such so that it is included in an update ebi.markPropertyAsChanged(propertyIndex); 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 059b368a0..d9b56f215 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 @@ -16,10 +16,9 @@ import java.util.Map; import static io.ebeaninternal.server.persist.DmlUtil.isNullOrZero; -class BeanDescriptorJsonHelp { +final class BeanDescriptorJsonHelp { private final BeanDescriptor desc; - private final InheritInfo inheritInfo; BeanDescriptorJsonHelp(BeanDescriptor desc) { @@ -28,21 +27,16 @@ class BeanDescriptorJsonHelp { } void jsonWrite(SpiJsonWriter writeJson, EntityBean bean, String key) throws IOException { - writeJson.writeStartObject(key); - if (inheritInfo == null) { jsonWriteProperties(writeJson, bean); - } else { InheritInfo localInheritInfo = inheritInfo.readType(bean.getClass()); String discValue = localInheritInfo.getDiscriminatorStringValue(); String discColumn = localInheritInfo.getDiscriminatorColumn(); writeJson.gen().writeStringField(discColumn, discValue); - localInheritInfo.desc().jsonWriteProperties(writeJson, bean); } - writeJson.writeEndObject(); } @@ -59,7 +53,6 @@ class BeanDescriptorJsonHelp { } void jsonWriteDirtyProperties(SpiJsonWriter writeJson, EntityBean bean, boolean[] dirtyProps) throws IOException { - writeJson.writeStartObject(null); // render the dirty properties BeanProperty[] props = desc.propertiesNonTransient(); @@ -73,7 +66,6 @@ class BeanDescriptorJsonHelp { @SuppressWarnings("unchecked") T jsonRead(SpiJsonReader jsonRead, String path, boolean withInheritance) throws IOException { - JsonParser parser = jsonRead.getParser(); //noinspection StatementWithEmptyBody if (parser.getCurrentToken() == JsonToken.START_OBJECT) { @@ -115,21 +107,17 @@ class BeanDescriptorJsonHelp { } private T jsonReadObject(SpiJsonReader readJson, String path) throws IOException { - EntityBean bean = desc.createEntityBeanForJson(); return jsonReadProperties(readJson, bean, path); } @SuppressWarnings("unchecked") private T jsonReadProperties(SpiJsonReader readJson, EntityBean bean, String path) throws IOException { - if (path != null) { readJson.pushPath(path); } - // unmapped properties, send to JsonReadBeanVisitor later Map unmappedProperties = null; - do { JsonParser parser = readJson.getParser(); JsonToken event = parser.nextToken(); 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 84b412513..edeaa397b 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 @@ -6,16 +6,8 @@ import io.ebean.RawSqlBuilder; import io.ebean.annotation.ConstraintMode; import io.ebean.bean.BeanCollection; import io.ebean.bean.EntityBean; -import io.ebean.config.BeanNotEnhancedException; -import io.ebean.config.DatabaseConfig; -import io.ebean.config.EncryptKey; -import io.ebean.config.EncryptKeyManager; -import io.ebean.config.NamingConvention; -import io.ebean.config.dbplatform.DatabasePlatform; -import io.ebean.config.dbplatform.DbHistorySupport; -import io.ebean.config.dbplatform.DbIdentity; -import io.ebean.config.dbplatform.IdType; -import io.ebean.config.dbplatform.PlatformIdGenerator; +import io.ebean.config.*; +import io.ebean.config.dbplatform.*; import io.ebean.core.type.ScalarType; import io.ebean.event.changelog.ChangeLogFilter; import io.ebean.event.changelog.ChangeLogListener; @@ -36,26 +28,12 @@ import io.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import io.ebeaninternal.server.deploy.id.IdBinder; import io.ebeaninternal.server.deploy.id.IdBinderEmbedded; import io.ebeaninternal.server.deploy.id.IdBinderFactory; -import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; -import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; -import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssoc; -import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocMany; -import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne; -import io.ebeaninternal.server.deploy.meta.DeployBeanTable; -import io.ebeaninternal.server.deploy.meta.DeployIdentityMode; -import io.ebeaninternal.server.deploy.meta.DeployOrderColumn; -import io.ebeaninternal.server.deploy.meta.DeployTableJoin; -import io.ebeaninternal.server.deploy.parse.DeployBeanInfo; -import io.ebeaninternal.server.deploy.parse.DeployCreateProperties; -import io.ebeaninternal.server.deploy.parse.DeployInherit; -import io.ebeaninternal.server.deploy.parse.DeployUtil; -import io.ebeaninternal.server.deploy.parse.ReadAnnotations; -import io.ebeaninternal.server.deploy.parse.TransientProperties; +import io.ebeaninternal.server.deploy.meta.*; +import io.ebeaninternal.server.deploy.parse.*; import io.ebeaninternal.server.persist.platform.MultiValueBind; import io.ebeaninternal.server.properties.BeanPropertiesReader; import io.ebeaninternal.server.properties.BeanPropertyAccess; import io.ebeaninternal.server.properties.EnhanceBeanPropertyAccess; -import io.ebeaninternal.server.type.ScalarTypeInteger; import io.ebeaninternal.server.type.TypeManager; import io.ebeaninternal.xmapping.api.XmapEbean; import io.ebeaninternal.xmapping.api.XmapEntity; @@ -73,20 +51,13 @@ import javax.sql.DataSource; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; /** * Creates BeanDescriptors. */ -public class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeManager { +public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeManager { private static final Logger logger = LoggerFactory.getLogger(BeanDescriptorManager.class); @@ -905,7 +876,8 @@ public class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeMana private void makeOrderColumn(DeployBeanPropertyAssocMany oneToMany) { DeployBeanDescriptor targetDesc = getTargetDescriptor(oneToMany); DeployOrderColumn orderColumn = oneToMany.getOrderColumn(); - DeployBeanProperty orderProperty = new DeployBeanProperty(targetDesc, Integer.class, ScalarTypeInteger.INSTANCE, null); + final ScalarType scalarType = typeManager.getScalarType(Integer.class); + DeployBeanProperty orderProperty = new DeployBeanProperty(targetDesc, Integer.class, scalarType, null); orderProperty.setName(DeployOrderColumn.LOGICAL_NAME); orderProperty.setDbColumn(orderColumn.getName()); orderProperty.setNullable(orderColumn.isNullable()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMeta.java index cac179b62..57aed6cb3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMeta.java @@ -1,7 +1,6 @@ package io.ebeaninternal.server.deploy; -public class BeanEmbeddedMeta { - +public final class BeanEmbeddedMeta { private final BeanProperty[] properties; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java index af6e7b9e4..d6ee56491 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java @@ -10,7 +10,7 @@ import java.util.Map; * Creates BeanProperties for Embedded beans that have deployment information * such as the actual DB column name and table alias. */ -class BeanEmbeddedMetaFactory { +final class BeanEmbeddedMetaFactory { /** * Create BeanProperties for embedded beans using the deployment specific DB column name and table alias. @@ -42,11 +42,7 @@ class BeanEmbeddedMetaFactory { int dbScale = dbScale(column, sourceProperties[i]); String colDefn = getDbColumnDefn(column, sourceProperties[i]); BeanPropertyOverride overrides = new BeanPropertyOverride(dbColumn, dbNullable, dbLength, dbScale, colDefn); - if (sourceProperties[i] instanceof BeanPropertyAssocOne) { - embeddedProperties[i] = new BeanPropertyAssocOne((BeanPropertyAssocOne)sourceProperties[i], overrides); - } else { - embeddedProperties[i] = new BeanProperty(sourceProperties[i], overrides); - } + embeddedProperties[i] = sourceProperties[i].override(overrides); } return new BeanEmbeddedMeta(embeddedProperties); 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 a1e916310..bb85c3b76 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Default implementation for BeanFinderFactory. */ -class BeanFinderManager { +final class BeanFinderManager { private final Logger logger = LoggerFactory.getLogger(BeanFinderManager.class); 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 e651e7fc2..071a0f660 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 @@ -16,7 +16,6 @@ public final class BeanFkeyProperty implements ElPropertyValue { private final String name; private final String dbColumn; private final boolean containsMany; - private final int deployOrder; public BeanFkeyProperty(String name, String dbColumn, int deployOrder) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanIudMetrics.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanIudMetrics.java index 889716aa3..64e4deb8f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanIudMetrics.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanIudMetrics.java @@ -8,7 +8,7 @@ import io.ebeaninternal.server.core.PersistRequest; /** * Metrics for ORM Insert Update and Delete for a given bean type. */ -class BeanIudMetrics { +final class BeanIudMetrics { private final TimedMetric insert; private final TimedMetric update; @@ -21,7 +21,6 @@ class BeanIudMetrics { * Create for a given bean type. */ BeanIudMetrics(String beanShortName) { - MetricFactory metricFactory = MetricFactory.get(); String prefix = "iud." + beanShortName; this.insert = metricFactory.createTimedMetric(prefix + ".insert"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java index 7a581e1c8..f754c9060 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java @@ -30,7 +30,7 @@ import java.util.List; * lifecycle events. *

*/ -class BeanLifecycleAdapterFactory { +final class BeanLifecycleAdapterFactory { private final boolean postConstructPresent; @@ -42,20 +42,16 @@ class BeanLifecycleAdapterFactory { * Register a BeanPersistController for methods annotated with lifecycle events. */ void addLifecycleMethods(DeployBeanDescriptor deployDesc) { - Method[] methods = deployDesc.getBeanType().getMethods(); - // look for annotated methods MethodsHolder methodHolder = new MethodsHolder(); for (Method m : methods) { methodHolder.checkMethod(m, postConstructPresent); } - if (methodHolder.hasPersistMethods()) { // has pre/post persist annotated methods deployDesc.addPersistController(new PersistAdapter(new PersistMethodsHolder(methodHolder))); } - if (!methodHolder.postLoads.isEmpty()) { // has postLoad methods deployDesc.addPostLoad(new PostLoadAdapter(methodHolder.postLoads)); @@ -69,7 +65,7 @@ class BeanLifecycleAdapterFactory { /** * Holds Methods for the lifecycle events.s */ - private static class MethodsHolder { + private static final class MethodsHolder { private boolean hasPersistMethods; private final List preInserts = new ArrayList<>(); @@ -162,7 +158,7 @@ class BeanLifecycleAdapterFactory { /** * Holds Methods for the lifecycle events.s */ - private static class PersistMethodsHolder { + private static final class PersistMethodsHolder { private final Method[] preInserts; private final Method[] postInserts; @@ -188,7 +184,7 @@ class BeanLifecycleAdapterFactory { /** * BeanPersistAdapter using reflection to invoke lifecycle methods. */ - private static class PersistAdapter extends BeanPersistAdapter { + private static final class PersistAdapter extends BeanPersistAdapter { private final PersistMethodsHolder methodHolder; @@ -264,7 +260,7 @@ class BeanLifecycleAdapterFactory { /** * BeanPostLoad using reflection to invoke lifecycle methods. */ - private static class PostLoadAdapter implements BeanPostLoad { + private static final class PostLoadAdapter implements BeanPostLoad { private final Method[] postLoadMethods; @@ -297,7 +293,7 @@ class BeanLifecycleAdapterFactory { /** * PostConstructAdapter using reflection to invoke lifecycle methods. */ - private static class PostConstructAdapter implements BeanPostConstructListener { + private static final class PostConstructAdapter implements BeanPostConstructListener { private final Method[] postConstructMethods; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanListHelpElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanListHelpElement.java index 0e473e4eb..b5f3ae432 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanListHelpElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanListHelpElement.java @@ -7,7 +7,7 @@ import io.ebeaninternal.api.json.SpiJsonWriter; /** * Helper for element collection List. */ -public class BeanListHelpElement extends BeanListHelp { +public final class BeanListHelpElement extends BeanListHelp { BeanListHelpElement(BeanPropertyAssocMany many) { super(many); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManager.java index 630c60b4e..d6d605313 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManager.java @@ -5,10 +5,9 @@ import io.ebeaninternal.server.persist.BeanPersister; /** * Holds the BeanDescriptor and its associated BeanPersister. */ -public class BeanManager { +public final class BeanManager { private final BeanPersister persister; - private final BeanDescriptor descriptor; public BeanManager(BeanDescriptor descriptor, BeanPersister persister) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManagerFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManagerFactory.java index e80cff573..3f2f61e14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManagerFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanManagerFactory.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.persist.dml.DmlBeanPersisterFactory; /** * Creates BeanManagers. */ -class BeanManagerFactory { +final class BeanManagerFactory { private final BeanPersisterFactory persisterFactory; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelpElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelpElement.java index 71cdfb3fa..1c6fb7931 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelpElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelpElement.java @@ -5,7 +5,7 @@ import io.ebean.bean.EntityBean; import io.ebean.common.BeanMap; import io.ebeaninternal.api.json.SpiJsonWriter; -public class BeanMapHelpElement extends BeanMapHelp { +public final class BeanMapHelpElement extends BeanMapHelp { BeanMapHelpElement(BeanPropertyAssocMany many) { super(many); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java index e78381b0b..b2e4f0f7d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java @@ -6,7 +6,7 @@ import io.ebean.common.BeanMap; import io.ebeaninternal.server.el.ElPropertyValue; import io.ebeaninternal.server.query.CQueryCollectionAdd; -class BeanMapQueryHelp implements CQueryCollectionAdd { +final class BeanMapQueryHelp implements CQueryCollectionAdd { private final ElPropertyValue elGetValue; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanNaturalKey.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanNaturalKey.java index 57f6c2512..3d3ed9866 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanNaturalKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanNaturalKey.java @@ -6,7 +6,7 @@ import java.util.Set; /** * Natural key for a bean type. */ -public class BeanNaturalKey { +public final class BeanNaturalKey { private final String[] naturalKey; private final BeanProperty[] props; 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 8793942b6..413d0b460 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 @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonToken; import io.ebean.ValuePair; import io.ebean.bean.EntityBean; import io.ebean.bean.EntityBeanIntercept; +import io.ebean.bean.MutableValueInfo; import io.ebean.bean.PersistenceContext; import io.ebean.config.EncryptKey; import io.ebean.config.dbplatform.DbEncryptFunction; @@ -13,6 +14,7 @@ import io.ebean.core.type.DocPropertyType; import io.ebean.core.type.ScalarType; import io.ebean.plugin.Property; import io.ebean.text.StringParser; +import io.ebean.text.TextException; import io.ebean.util.SplitName; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.api.SpiQuery; @@ -31,11 +33,7 @@ import io.ebeaninternal.server.properties.BeanPropertySetter; import io.ebeaninternal.server.query.STreeProperty; import io.ebeaninternal.server.query.SqlBeanLoad; import io.ebeaninternal.server.query.SqlJoinType; -import io.ebeaninternal.server.type.DataBind; -import io.ebeaninternal.server.type.LocalEncryptedType; -import io.ebeaninternal.server.type.ScalarTypeBoolean; -import io.ebeaninternal.server.type.ScalarTypeEnum; -import io.ebeaninternal.server.type.ScalarTypeLogicalType; +import io.ebeaninternal.server.type.*; import io.ebeaninternal.util.ValueUtil; import io.ebeanservice.docstore.api.mapping.DocMappingBuilder; import io.ebeanservice.docstore.api.mapping.DocPropertyMapping; @@ -52,6 +50,7 @@ import java.io.IOException; import java.lang.reflect.Field; import java.sql.SQLException; import java.sql.Types; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -366,13 +365,14 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { return InternString.intern(s); } + public BeanProperty override(BeanPropertyOverride override) { + return new BeanProperty(this, override); + } + /** - * Create a Matching BeanProperty with some attributes overridden. - *

- * Primarily for supporting Embedded beans with overridden dbColumn - * mappings. + * Create a Matching BeanProperty with some attributes overridden for Embedded beans. */ - public BeanProperty(BeanProperty source, BeanPropertyOverride override) { + protected BeanProperty(BeanProperty source, BeanPropertyOverride override) { this.descriptor = source.descriptor; this.propertyIndex = source.propertyIndex; this.name = source.getName(); @@ -642,15 +642,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { } public Object readSet(DbReadContext ctx, EntityBean bean) throws SQLException { - try { - Object value = scalarType.read(ctx.getDataReader()); - if (bean != null) { - setValue(bean, value); - } - return value; - } catch (Exception e) { - throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); - } + return readSet(ctx.getDataReader(), bean); } @SuppressWarnings("unchecked") @@ -828,6 +820,13 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { return scalarType.parse(value); } + /** + * creates a mutableHash for the given JSON value. + */ + public MutableValueInfo createMutableInfo(String json) { + throw new UnsupportedOperationException(); + } + /** * Read the value for this property from L2 cache entry and set it to the bean. *

@@ -909,7 +908,8 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { /** * Return the name of the property. */ - @Override @Nonnull + @Override + @Nonnull public String getName() { return name; } @@ -1018,8 +1018,8 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { * Return true if the mutable value is considered dirty. * This is only used for 'mutable' scalar types like hstore etc. */ - boolean isDirtyValue(Object value) { - return scalarType.isDirty(value); + boolean checkMutable(Object value, boolean alreadyDirty, EntityBeanIntercept ebi) { + return alreadyDirty || value != null && scalarType.isDirty(value); } /** @@ -1281,7 +1281,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { @Override public Object localEncrypt(Object value) { - return ((LocalEncryptedType)scalarType).localEncrypt(value); + return ((LocalEncryptedType) scalarType).localEncrypt(value); } /** @@ -1394,7 +1394,8 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { /** * Return the property type. */ - @Override @Nonnull + @Override + @Nonnull public Class getPropertyType() { return propertyType; } 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 ca81267eb..9a69b8c9c 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 @@ -94,10 +94,12 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } } - /** - * Copy constructor for ManyToOne inside Embeddable. - */ - public BeanPropertyAssocOne(BeanPropertyAssocOne source, BeanPropertyOverride override) { + @Override + public BeanPropertyAssocOne override(BeanPropertyOverride override) { + return new BeanPropertyAssocOne<>(this, override); + } + + protected BeanPropertyAssocOne(BeanPropertyAssocOne source, BeanPropertyOverride override) { super(source, override); primaryKeyExport = source.primaryKeyExport; primaryKeyJoin = source.primaryKeyJoin; @@ -255,12 +257,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private SqlUpdate deleteByParentIdList(List parentIds) { - - StringBuilder sb = new StringBuilder(100); - sb.append(deleteByParentIdInSql); - sb.append(targetIdBinder.getIdInValueExpr(false, parentIds.size())); - - DefaultSqlUpdate delete = new DefaultSqlUpdate(sb.toString()); + String sql = deleteByParentIdInSql + targetIdBinder.getIdInValueExpr(false, parentIds.size()); + DefaultSqlUpdate delete = new DefaultSqlUpdate(sql); bindParentIds(delete, parentIds); return delete; } @@ -501,7 +499,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr return targetDescriptor.getIdProperty(); } - ScalarType getIdScalarType() { + ScalarType getIdScalarType() { return targetDescriptor.getIdProperty().scalarType; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyIdClass.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyIdClass.java index 45d3614c3..9e0d61684 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyIdClass.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyIdClass.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne; /** * Bean property for an IdClass embeddedId. */ -public class BeanPropertyIdClass extends BeanPropertyAssocOne { +public final class BeanPropertyIdClass extends BeanPropertyAssocOne { @SuppressWarnings("unchecked") public BeanPropertyIdClass(BeanDescriptorMap owner, BeanDescriptor descriptor, DeployBeanPropertyAssocOne deploy) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java new file mode 100644 index 000000000..6593186a6 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonBasic.java @@ -0,0 +1,58 @@ +package io.ebeaninternal.server.deploy; + +import io.ebean.bean.EntityBean; +import io.ebean.core.type.DataReader; +import io.ebean.text.TextException; +import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; + +import javax.persistence.PersistenceException; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Map; + +/** + * A DbJson property that does not use Jackson ObjectMapper. + */ +public class BeanPropertyJsonBasic extends BeanProperty { + + public BeanPropertyJsonBasic(BeanDescriptor descriptor, DeployBeanProperty deploy) { + super(descriptor, deploy); + } + + protected BeanPropertyJsonBasic(BeanProperty source, BeanPropertyOverride override) { + super(source, override); + } + + @Override + public BeanProperty override(BeanPropertyOverride override) { + return new BeanPropertyJsonBasic(this, override); + } + + protected Object checkForEmpty(EntityBean bean) { + final Object value = getValue(bean); + if (value instanceof Collection && ((Collection) value).isEmpty() + || value instanceof Map && ((Map) value).isEmpty()) { + return value; + } + return null; + } + + @Override + public Object readSet(DataReader reader, EntityBean bean) throws SQLException { + try { + Object value = scalarType.read(reader); + if (value == null) { + value = checkForEmpty(bean); + } + if (bean != null) { + setValue(bean, value); + } + return value; + } catch (TextException e) { + throw e; + } catch (Exception e) { + throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); + } + } + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java new file mode 100644 index 000000000..bb234664f --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java @@ -0,0 +1,222 @@ +package io.ebeaninternal.server.deploy; + +import io.ebean.annotation.MutationDetection; +import io.ebean.bean.EntityBean; +import io.ebean.bean.EntityBeanIntercept; +import io.ebean.bean.MutableValueInfo; +import io.ebean.bean.MutableValueNext; +import io.ebean.bean.PersistenceContext; +import io.ebean.core.type.DataReader; +import io.ebean.core.type.ScalarType; +import io.ebean.text.TextException; +import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; +import io.ebeaninternal.server.util.Checksum; + +import javax.persistence.PersistenceException; +import java.sql.SQLException; +import java.util.Objects; + +/** + * Handle json property with MutationDetection of SOURCE or HASH only. + */ +public final class BeanPropertyJsonMapper extends BeanPropertyJsonBasic { + + private final boolean sourceDetection; + + public BeanPropertyJsonMapper(BeanDescriptor desc, DeployBeanProperty deployProp) { + super(desc, deployProp); + this.sourceDetection = deployProp.getMutationDetection() == MutationDetection.SOURCE; + } + + private BeanPropertyJsonMapper(BeanPropertyJsonMapper source, BeanPropertyOverride override) { + super(source, override); + this.sourceDetection = source.sourceDetection; + } + + @Override + public BeanProperty override(BeanPropertyOverride override) { + return new BeanPropertyJsonMapper(this, override); + } + + @Override + public MutableValueInfo createMutableInfo(String json) { + if (sourceDetection) { + return new SourceMutableValue(scalarType, json); + } else { + return new ChecksumMutableValue(scalarType, json); + } + } + + /** + * Next when no prior MutableValueInfo. + */ + private MutableValueNext next(String json) { + if (sourceDetection) { + return new SourceMutableValue(scalarType, json); + } else { + return new NextPair(json, new ChecksumMutableValue(scalarType, json)); + } + } + + /** + * Return true if the json property is considered dirty. + */ + @Override + boolean checkMutable(Object value, boolean alreadyDirty, EntityBeanIntercept ebi) { + // mutation detection based on json content or checksum of json content + // only perform serialisation to json once + final String json = scalarType.format(value); + final MutableValueInfo oldHash = ebi.mutableInfo(propertyIndex); + if (oldHash == null) { + if (value == null) { + return false; // no change, still null + } + ebi.mutableNext(propertyIndex, next(json)); + return true; + } + // only perform compute of checksum/hash once (if checksum based) + final MutableValueNext next = oldHash.nextDirty(json); + if (next != null) { + ebi.mutableNext(propertyIndex, next); + return true; + } + return false; + } + + @Override + public Object readSet(DataReader reader, EntityBean bean) throws SQLException { + try { + Object value = scalarType.read(reader); + if (value == null) { + value = checkForEmpty(bean); + } + if (bean != null) { + setValue(bean, value); + String json = reader.popJson(); + if (json != null) { + final MutableValueInfo hash = createMutableInfo(json); + bean._ebean_getIntercept().mutableInfo(propertyIndex, hash); + } + } + return value; + } catch (TextException e) { + throw e; + } catch (Exception e) { + throw new PersistenceException("Error readSet on " + descriptor + "." + name, e); + } + } + + @Override + public void setCacheDataValue(EntityBean bean, Object cacheData, PersistenceContext context) { + if (cacheData instanceof String) { + // parse back from string to support optimisation of java object serialisation + final String jsonContent = (String) cacheData; + final MutableValueInfo hash = createMutableInfo(jsonContent); + bean._ebean_getIntercept().mutableInfo(propertyIndex, hash); + cacheData = scalarType.parse(jsonContent); + } + setValue(bean, cacheData); + } + + + private static final class NextPair implements MutableValueNext { + + private final String json; + private final MutableValueInfo next; + + NextPair(String json, MutableValueInfo next) { + this.json = json; + this.next = next; + } + + @Override + public String content() { + return json; + } + + @Override + public MutableValueInfo info() { + return next; + } + } + + /** + * Hold checksum of json source content to use for dirty detection. + *

+ * Does not support rebuilding 'oldValue' as no original json content. + */ + private static final class ChecksumMutableValue implements MutableValueInfo { + + private final ScalarType parent; + private final long checksum; + + ChecksumMutableValue(ScalarType parent, String json) { + this.parent = parent; + this.checksum = Checksum.checksum(json); + } + + /** + * Create with pre-computed checksum. + */ + ChecksumMutableValue(ScalarType parent, long checksum) { + this.parent = parent; + this.checksum = checksum; + } + + @Override + public MutableValueNext nextDirty(String json) { + final long nextChecksum = Checksum.checksum(json); + return nextChecksum == checksum ? null : new NextPair(json, new ChecksumMutableValue(parent, nextChecksum)); + } + + @Override + public boolean isEqualToObject(Object obj) { + return Checksum.checksum(parent.format(obj)) == checksum; + } + + @Override + public Object get() { + return null; // cannot create object from json + } + } + + /** + * Hold json source content. This supports rebuilding the 'oldValue'. + */ + private static final class SourceMutableValue implements MutableValueInfo, MutableValueNext { + + private final String originalJson; + private final ScalarType parent; + + SourceMutableValue(ScalarType parent, String json) { + this.parent = parent; + this.originalJson = json; + } + + @Override + public MutableValueNext nextDirty(String json) { + return Objects.equals(originalJson, json) ? null : new SourceMutableValue(parent, json); + } + + @Override + public boolean isEqualToObject(Object obj) { + return Objects.equals(originalJson, parent.format(obj)); + } + + @Override + public Object get() { + // rebuild the 'oldValue' for change log etc + return parent.parse(originalJson); + } + + @Override + public String content() { + return originalJson; + } + + @Override + public MutableValueInfo info() { + return this; + } + } +} 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 319c8830b..a6ac913b9 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 @@ -8,7 +8,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; * * The value of which is held on the entity bean intercept. */ -public class BeanPropertyOrderColumn extends BeanProperty { +public final class BeanPropertyOrderColumn extends BeanProperty { public BeanPropertyOrderColumn(BeanDescriptor descriptor, DeployBeanProperty deploy) { super(descriptor, deploy); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOverride.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOverride.java index d322c5074..fd938d0d2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOverride.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyOverride.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.core.InternString; * Typically this is for Embedded Beans. *

*/ -class BeanPropertyOverride { +final class BeanPropertyOverride { private final String dbColumn; private final boolean dbNullable; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertySimpleCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertySimpleCollection.java index d73574379..2fbf41dcc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertySimpleCollection.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertySimpleCollection.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanPropertySimpleCollection; import java.io.IOException; -public class BeanPropertySimpleCollection extends BeanPropertyAssocMany { +public final class BeanPropertySimpleCollection extends BeanPropertyAssocMany { public BeanPropertySimpleCollection(BeanDescriptor descriptor, DeployBeanPropertySimpleCollection deploy) { super(descriptor, deploy); 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 7a50f2deb..2f8f05317 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Default implementation for creating BeanControllers. */ -class BeanQueryAdapterManager { +final class BeanQueryAdapterManager { private static final Logger logger = LoggerFactory.getLogger(BeanQueryAdapterManager.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelpElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelpElement.java index 94ac9e5a5..2201d69aa 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelpElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelpElement.java @@ -7,7 +7,7 @@ import io.ebeaninternal.api.json.SpiJsonWriter; /** * Helper for element collection List. */ -public class BeanSetHelpElement extends BeanSetHelp { +public final class BeanSetHelpElement extends BeanSetHelp { BeanSetHelpElement(BeanPropertyAssocMany many) { super(many); 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 f2cc09e78..3ccdb8218 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 @@ -17,19 +17,13 @@ import org.slf4j.LoggerFactory; * in a BeanDescriptor. *

*/ -public class BeanTable { +public final class BeanTable { private static final Logger logger = LoggerFactory.getLogger(BeanTable.class); private final BeanDescriptorMap owner; - private final Class beanType; - - /** - * The base table. - */ private final String baseTable; - private final BeanProperty idProperty; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistController.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistController.java index 404336aca..dfb2c302a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistController.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistController.java @@ -14,7 +14,7 @@ import java.util.List; *

* Used when multiple BeanPersistController register for the same bean type. */ -public class ChainedBeanPersistController implements BeanPersistController { +public final class ChainedBeanPersistController implements BeanPersistController { private static final Sorter SORTER = new Sorter(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistListener.java index b92aa4ec7..d49380577 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPersistListener.java @@ -9,10 +9,9 @@ import java.util.Set; /** * Handles multiple BeanPersistListener's for a given entity type. */ -public class ChainedBeanPersistListener implements BeanPersistListener { +public final class ChainedBeanPersistListener implements BeanPersistListener { private final List list; - private final BeanPersistListener[] chain; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostConstructListener.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostConstructListener.java index e9ba81c95..c615f8b20 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostConstructListener.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostConstructListener.java @@ -8,10 +8,9 @@ import java.util.List; /** * Handles multiple BeanPostLoad's for a given entity type. */ -public class ChainedBeanPostConstructListener implements BeanPostConstructListener { +public final class ChainedBeanPostConstructListener implements BeanPostConstructListener { private final List list; - private final BeanPostConstructListener[] chain; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostLoad.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostLoad.java index 9da1fdd66..4d7cff8ef 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostLoad.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanPostLoad.java @@ -8,10 +8,9 @@ import java.util.List; /** * Handles multiple BeanPostLoad's for a given entity type. */ -public class ChainedBeanPostLoad implements BeanPostLoad { +public final class ChainedBeanPostLoad implements BeanPostLoad { private final List list; - private final BeanPostLoad[] chain; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanQueryAdapter.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanQueryAdapter.java index 15501ef0e..ca67a0746 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanQueryAdapter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ChainedBeanQueryAdapter.java @@ -11,12 +11,11 @@ import java.util.List; /** * Handles multiple BeanQueryAdapter for a given entity type. */ -public class ChainedBeanQueryAdapter implements BeanQueryAdapter { +public final class ChainedBeanQueryAdapter implements BeanQueryAdapter { private static final Sorter SORTER = new Sorter(); private final List list; - private final BeanQueryAdapter[] chain; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControl.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControl.java index a99dabf89..a43f9f749 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControl.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControl.java @@ -6,7 +6,7 @@ import io.ebeaninternal.api.SpiCacheRegion; /** * Default implementation of SpiCacheControl. */ -class DCacheControl implements SpiCacheControl { +final class DCacheControl implements SpiCacheControl { private final SpiCacheRegion region; private final boolean bean; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControlNone.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControlNone.java index 8f4797f47..1101c180b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControlNone.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheControlNone.java @@ -5,7 +5,7 @@ import io.ebeaninternal.api.SpiCacheControl; /** * Cache control used when no caching is on the bean type. */ -class DCacheControlNone implements SpiCacheControl { +final class DCacheControlNone implements SpiCacheControl { static final SpiCacheControl INSTANCE = new DCacheControlNone(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegion.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegion.java index 2056833b7..9f1bd5d59 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegion.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegion.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.deploy; import io.ebeaninternal.api.SpiCacheRegion; -public class DCacheRegion implements SpiCacheRegion { +public final class DCacheRegion implements SpiCacheRegion { private boolean enabled = true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegionNone.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegionNone.java index ff8dfeb17..c7b20095a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegionNone.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DCacheRegionNone.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.deploy; import io.ebeaninternal.api.SpiCacheRegion; -class DCacheRegionNone implements SpiCacheRegion { +final class DCacheRegionNone implements SpiCacheRegion { static final SpiCacheRegion INSTANCE = new DCacheRegionNone(); 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 630ea953b..e6e4a3eef 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 @@ -10,7 +10,7 @@ import io.ebean.annotation.Platform; * * @author Roland Praml, FOCONIS AG */ -public class DbMigrationInfo { +public final class DbMigrationInfo { private final List preAdd; private final List postAdd; 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 81d8ea3f8..e6e00b2e9 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 @@ -8,7 +8,7 @@ import io.ebeanservice.docstore.api.mapping.DocPropertyOptions; /** * The options for document property collected when reading deployment mapping. */ -public class DeployDocPropertyOptions { +public final class DeployDocPropertyOptions { private static final DocPropertyOptions EMPTY = new DocPropertyOptions(); @@ -24,7 +24,6 @@ public class DeployDocPropertyOptions { * Read the DocProperty deployment options. */ public void setDocProperty(DocProperty doc) { - createOptions(); mapping.apply(doc); } @@ -33,7 +32,6 @@ public class DeployDocPropertyOptions { * Read the DocSortable deployment options. */ public void setDocSortable(DocSortable doc) { - createOptions(); mapping.setSortable(true); setStore(doc.store()); @@ -45,7 +43,6 @@ public class DeployDocPropertyOptions { * Read the DocCode deployment options. */ public void setDocCode(DocCode doc) { - createOptions(); mapping.setCode(true); setStore(doc.store()); 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 c2e576b0c..5790377db 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 @@ -5,7 +5,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocMany; import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne; -class DetermineAggPath { +final class DetermineAggPath { /** * Return the many path for the given aggregation formula. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java index cfa560310..fc1859074 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java @@ -7,10 +7,7 @@ import java.util.Set; /** * Determine the Many Type for a property. */ -public class DetermineManyType { - - public DetermineManyType() { - } +public final class DetermineManyType { public ManyType getManyType(Class type) { if (type.equals(List.class)) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormulaMTO.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormulaMTO.java index eb8ba9997..0021d9636 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormulaMTO.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormulaMTO.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.deploy; import io.ebeaninternal.server.query.SqlBeanLoad; -public class DynamicPropertyAggregationFormulaMTO extends DynamicPropertyAggregationFormula { +public final class DynamicPropertyAggregationFormulaMTO extends DynamicPropertyAggregationFormula { private final BeanPropertyAssocOne prop; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementEntityBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementEntityBean.java index 366ba5a97..2f6566bff 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementEntityBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementEntityBean.java @@ -3,14 +3,12 @@ package io.ebeaninternal.server.deploy; import io.ebean.bean.EntityBean; import io.ebean.bean.EntityBeanIntercept; -class ElementEntityBean implements EntityBean { +final class ElementEntityBean implements EntityBean { private static final long serialVersionUID = 8742536671024715601L; private final String[] properties; - private Object[] data; - private final EntityBeanIntercept intercept; ElementEntityBean(String[] properties) { @@ -28,11 +26,6 @@ class ElementEntityBean implements EntityBean { return properties[pos]; } - @Override - public String _ebean_getMarker() { - return null; - } - @Override public Object _ebean_newInstance() { return new ElementEntityBean(properties); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpList.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpList.java index 5c48b4f19..a9e38699e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpList.java @@ -6,7 +6,7 @@ import io.ebean.common.BeanList; import java.util.ArrayList; import java.util.List; -class ElementHelpList implements ElementHelp { +final class ElementHelpList implements ElementHelp { @Override public ElementCollector createCollector() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpMap.java index 985ab4248..e00d2ef2f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpMap.java @@ -6,7 +6,7 @@ import io.ebean.common.BeanMap; import java.util.LinkedHashMap; import java.util.Map; -class ElementHelpMap implements ElementHelp { +final class ElementHelpMap implements ElementHelp { @Override public ElementCollector createCollector() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpSet.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpSet.java index 71c15aee3..e15e74e28 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ElementHelpSet.java @@ -6,7 +6,7 @@ import io.ebean.common.BeanSet; import java.util.LinkedHashSet; import java.util.Set; -class ElementHelpSet implements ElementHelp { +final class ElementHelpSet implements ElementHelp { @Override public ElementCollector createCollector() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java index 8c4b789ab..b8ec305a4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java @@ -9,12 +9,10 @@ import io.ebeaninternal.server.core.InternString; * Used to for Assoc Manys to create references etc. *

*/ -class ExportedProperty { +final class ExportedProperty { private final String foreignDbColumn; - private final BeanProperty property; - private final boolean embedded; ExportedProperty(boolean embedded, String foreignDbColumn, BeanProperty property) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IdentityMode.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IdentityMode.java index 0bea99393..9ffd2c2e5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IdentityMode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IdentityMode.java @@ -4,7 +4,7 @@ import io.ebean.annotation.IdentityGenerated; import io.ebean.config.dbplatform.IdType; import io.ebeaninternal.server.deploy.meta.DeployIdentityMode; -public class IdentityMode { +public final class IdentityMode { public static IdentityMode NONE = new IdentityMode(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java index 3fec7ecf4..032452574 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java @@ -5,7 +5,7 @@ import io.ebean.annotation.Platform; /** * Holds multiple column unique constraints defined for an entity. */ -public class IndexDefinition { +public final class IndexDefinition { private final String[] columns; private final String name; 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 a8a733a41..1f3e33797 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 @@ -17,43 +17,30 @@ import java.util.Set; /** * Represents a node in the Inheritance tree. Holds information regarding Super Subclass support. */ -public class InheritInfo { +public final class InheritInfo { private final String discriminatorStringValue; private final Object discriminatorValue; - private final String discriminatorColumn; - private final int discriminatorType; - private final int discriminatorLength; - private final String columnDefn; - private final String where; - private final Class type; - private final List children = new ArrayList<>(); - /** * Map of discriminator values to InheritInfo. */ private final HashMap discMap; - /** * Map of class types to InheritInfo (taking into account subclass proxy classes). */ private final HashMap typeMap; - private final InheritInfo parent; - private final InheritInfo root; - private BeanDescriptor descriptor; public InheritInfo(InheritInfo r, InheritInfo parent, DeployInheritInfo deploy) { - this.parent = parent; this.type = deploy.getType(); this.discriminatorColumn = InternString.intern(deploy.getColumnName(parent)); @@ -85,7 +72,6 @@ public class InheritInfo { * Visit all the children in the inheritance tree. */ public void visitChildren(InheritInfoVisitor visitor) { - for (InheritInfo child : children) { visitor.visit(child); child.visitChildren(visitor); @@ -96,7 +82,6 @@ public class InheritInfo { * Append check constraint values for the entire inheritance hierarchy. */ public void appendCheckConstraintValues(final String propertyName, final Set checkConstraintValues) { - visitChildren(inheritInfo -> { BeanProperty prop = inheritInfo.desc().getBeanProperty(propertyName); if (prop != null) { @@ -190,9 +175,7 @@ public class InheritInfo { * Get the bean property additionally looking in the sub types. */ BeanProperty findSubTypeProperty(String propertyName) { - BeanProperty prop; - for (InheritInfo childInfo : children) { // recursively search this child bean descriptor prop = childInfo.desc().findProperty(propertyName); @@ -200,7 +183,6 @@ public class InheritInfo { return prop; } } - return null; } @@ -208,7 +190,6 @@ public class InheritInfo { * Add the local properties for each sub class below this one. */ public void addChildrenProperties(SqlTreeProperties selectProps) { - for (InheritInfo childInfo : children) { selectProps.add(childInfo.descriptor.propertiesLocal()); childInfo.addChildrenProperties(selectProps); @@ -226,11 +207,9 @@ public class InheritInfo { * Return the associated InheritInfo for this discriminator value. */ InheritInfo readType(String discValue) { - if (discValue == null) { return null; } - InheritInfo typeInfo = root.getType(discValue); if (typeInfo == null) { throw new PersistenceException("Inheritance type for discriminator value [" + discValue + "] was not found?"); @@ -242,7 +221,6 @@ public class InheritInfo { * Return the associated InheritInfo for this bean type. */ public InheritInfo readType(Class beanType) { - InheritInfo typeInfo = root.getTypeByClass(beanType); if (typeInfo == null) { throw new PersistenceException("Inheritance type for bean type [" + beanType.getName() + "] was not found?"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionBuilder.java index 764c2c700..bbe133838 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionBuilder.java @@ -6,7 +6,7 @@ import java.util.List; /** * Helper to build IntersectionTable. */ -public class IntersectionBuilder { +public final class IntersectionBuilder { private final String publishTable; private final String draftTable; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionRow.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionRow.java index 46d677ad8..3284032bb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionRow.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionRow.java @@ -12,14 +12,11 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -public class IntersectionRow { +public final class IntersectionRow { private final String tableName; - private final BeanDescriptor targetDescriptor; - private final LinkedHashMap values = new LinkedHashMap<>(); - private List excludeIds; private BeanDescriptor excludeDescriptor; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionTable.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionTable.java index 8f10e3a92..1a3553ed4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionTable.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/IntersectionTable.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.deploy; import io.ebean.Database; import io.ebean.SqlUpdate; -public class IntersectionTable { +public final class IntersectionTable { private final String insertSql; private final String deleteSql; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PartitionMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PartitionMeta.java index d041ae0a1..f146dc86f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PartitionMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PartitionMeta.java @@ -2,10 +2,9 @@ package io.ebeaninternal.server.deploy; import io.ebean.annotation.PartitionMode; -public class PartitionMeta { +public final class PartitionMeta { private final PartitionMode mode; - private String property; public PartitionMeta(PartitionMode mode, String property) { 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 f552fc77f..a6d45a12e 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Default implementation for creating BeanControllers. */ -class PersistControllerManager { +final class PersistControllerManager { private static final Logger logger = LoggerFactory.getLogger(PersistControllerManager.class); 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 0e9c261c7..13ca4e7a5 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 @@ -12,7 +12,7 @@ import java.util.List; * Manages the assignment/registration of BeanPersistListener with their * respective DeployBeanDescriptor's. */ -class PersistListenerManager { +final class PersistListenerManager { private static final Logger logger = LoggerFactory.getLogger(PersistListenerManager.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistenceContextUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistenceContextUtil.java index 69ad243e8..1a1c5651f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistenceContextUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PersistenceContextUtil.java @@ -5,7 +5,7 @@ import javax.persistence.Entity; /** * Utility to find the root bean type. */ -public class PersistenceContextUtil { +public final class PersistenceContextUtil { /** * Find and return the root bean type for the given class. 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 0ef7b7120..6e7bb97c5 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Default implementation for creating BeanControllers. */ -class PostConstructManager { +final class PostConstructManager { private static final Logger logger = LoggerFactory.getLogger(PostConstructManager.class); 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 0648d788f..f30826b90 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Default implementation for creating BeanControllers. */ -class PostLoadManager { +final class PostLoadManager { private static final Logger logger = LoggerFactory.getLogger(PostLoadManager.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PropertyForeignKey.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PropertyForeignKey.java index 480362e2a..6f66d3ed2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PropertyForeignKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/PropertyForeignKey.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.deploy; import io.ebean.annotation.ConstraintMode; import io.ebean.annotation.DbForeignKey; -public class PropertyForeignKey { +public final class PropertyForeignKey { private final boolean noIndex; private final boolean noConstraint; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoinColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoinColumn.java index a04d72ed6..4878557b2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoinColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/TableJoinColumn.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.deploy.meta.DeployTableJoinColumn; /** * A join pair of local and foreign properties. */ -public class TableJoinColumn { +public final class TableJoinColumn { /** * The local database column name. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/CounterFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/CounterFactory.java index 1bfd2542e..999deb121 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/CounterFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/CounterFactory.java @@ -13,14 +13,13 @@ import java.sql.Types; * Aka, Integer, Long, Short etc. *

*/ -class CounterFactory { +final class CounterFactory { private final GeneratedCounterInteger integerCounter = new GeneratedCounterInteger(); private final GeneratedCounterLong longCounter = new GeneratedCounterLong(); - public void setCounter(DeployBeanProperty property) { - + void setCounter(DeployBeanProperty property) { property.setGeneratedProperty(createCounter(property)); } @@ -28,7 +27,6 @@ class CounterFactory { * Create the GeneratedProperty based on the property type. */ private GeneratedProperty createCounter(DeployBeanProperty property) { - Class propType = property.getPropertyType(); if (propType.equals(Integer.class) || propType.equals(int.class)) { return integerCounter; @@ -36,7 +34,6 @@ class CounterFactory { if (propType.equals(Long.class) || propType.equals(long.class)) { return longCounter; } - int type = getType(propType); return new GeneratedCounter(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 319e6e40a..38f0085fb 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 @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * A general number counter for various number types. */ -public class GeneratedCounter implements GeneratedProperty { +final class GeneratedCounter implements GeneratedProperty { private final int numberType; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java index 88cd3a866..4031465e8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java @@ -6,11 +6,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Used to create a counter version column for Integer. */ -public class GeneratedCounterInteger implements GeneratedProperty { - - public GeneratedCounterInteger() { - - } +final class GeneratedCounterInteger implements GeneratedProperty { /** * Always returns a 1. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java index 310242465..5282bec11 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java @@ -6,11 +6,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Used to create a counter version column for Long. */ -public class GeneratedCounterLong implements GeneratedProperty { - - public GeneratedCounterLong() { - - } +final class GeneratedCounterLong implements GeneratedProperty { /** * Always returns a 1. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java index 2bb206e3d..57ff0c9bd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java @@ -8,7 +8,7 @@ import java.util.Date; /** * Used to generate a (java.util.Date) timestamp when a bean is inserted. */ -public class GeneratedInsertDate implements GeneratedProperty, GeneratedWhenCreated { +final class GeneratedInsertDate implements GeneratedProperty, GeneratedWhenCreated { /** * Return the current time as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java index 3b95b4e0d..f71aaccfd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java @@ -6,9 +6,9 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Support java.time types as GeneratedProperty. */ -public class GeneratedInsertJavaTime { +final class GeneratedInsertJavaTime { - public static abstract class Base implements GeneratedProperty, GeneratedWhenCreated { + static abstract class Base implements GeneratedProperty, GeneratedWhenCreated { @Override public boolean includeInUpdate() { @@ -39,7 +39,7 @@ public class GeneratedInsertJavaTime { /** * Instant support. */ - public static class InstantDT extends Base { + static final class InstantDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -50,7 +50,7 @@ public class GeneratedInsertJavaTime { /** * LocalDateTime support. */ - public static class LocalDT extends Base { + static final class LocalDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -61,7 +61,7 @@ public class GeneratedInsertJavaTime { /** * OffsetDateTime support. */ - public static class OffsetDT extends Base { + static final class OffsetDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -73,7 +73,7 @@ public class GeneratedInsertJavaTime { /** * ZonedDateTime support. */ - public static class ZonedDT extends Base { + static final class ZonedDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java index f346be035..5a4c11550 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java @@ -8,9 +8,9 @@ import org.joda.time.LocalDateTime; /** * Support joda time types as GeneratedProperty. */ -public class GeneratedInsertJodaTime { +final class GeneratedInsertJodaTime { - public static abstract class Base implements GeneratedProperty, GeneratedWhenCreated { + static abstract class Base implements GeneratedProperty, GeneratedWhenCreated { @Override public boolean includeInUpdate() { @@ -41,7 +41,7 @@ public class GeneratedInsertJodaTime { /** * LocalDateTime support. */ - public static class LocalDT extends Base { + static final class LocalDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -52,7 +52,7 @@ public class GeneratedInsertJodaTime { /** * DateTime support. */ - public static class DateTimeDT extends Base { + static final class DateTimeDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java index f56f97490..5e3e0d2f1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Used to generate a (Long) timestamp when a bean is inserted. */ -public class GeneratedInsertLong implements GeneratedProperty { +final class GeneratedInsertLong implements GeneratedProperty { /** * Return the current time as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java index abc7f963c..028f71a10 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java @@ -8,7 +8,7 @@ import java.sql.Timestamp; /** * Used to generate a timestamp when a bean is inserted. */ -public class GeneratedInsertTimestamp implements GeneratedProperty, GeneratedWhenCreated { +final class GeneratedInsertTimestamp implements GeneratedProperty, GeneratedWhenCreated { /** * Return the current time as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java index b395732b0..e876fb379 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java @@ -17,24 +17,16 @@ import java.util.Map; /** * Default implementation of GeneratedPropertyFactory. */ -public class GeneratedPropertyFactory { +public final class GeneratedPropertyFactory { private final CounterFactory counterFactory = new CounterFactory(); - private final InsertTimestampFactory insertFactory; - private final UpdateTimestampFactory updateFactory; - private final HashSet numberTypes = new HashSet<>(); - private final UuidGeneratedProperty generatedUuid = new UuidGeneratedProperty(); - private final GeneratedWhoModified generatedWhoModified; - private final GeneratedWhoCreated generatedWhoCreated; - private final ClassLoadConfig classLoadConfig; - private final Map idGeneratorMap = new HashMap<>(); public GeneratedPropertyFactory(boolean offlineMode, DatabaseConfig config, List idGenerators) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java index f9cd94659..f8ec8effe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java @@ -9,7 +9,7 @@ import java.util.Date; * Generate a (java.util.Date) Timestamp whenever the bean is inserted or * updated. */ -public class GeneratedUpdateDate implements GeneratedProperty { +final class GeneratedUpdateDate implements GeneratedProperty { /** * Return now as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java index 8592425df..6abbf2c6b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java @@ -6,9 +6,9 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Support java.time DateTime types as GeneratedProperty. */ -public class GeneratedUpdateJavaTime { +final class GeneratedUpdateJavaTime { - public static abstract class Base implements GeneratedProperty, GeneratedWhenModified { + static abstract class Base implements GeneratedProperty, GeneratedWhenModified { @Override public boolean includeInUpdate() { @@ -34,7 +34,7 @@ public class GeneratedUpdateJavaTime { /** * Instant support. */ - public static class InstantDT extends Base { + static final class InstantDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -50,7 +50,7 @@ public class GeneratedUpdateJavaTime { /** * LocalDateTime support. */ - public static class LocalDT extends Base { + static final class LocalDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -66,7 +66,7 @@ public class GeneratedUpdateJavaTime { /** * OffsetDateTime support. */ - public static class OffsetDT extends Base { + static final class OffsetDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -82,7 +82,7 @@ public class GeneratedUpdateJavaTime { /** * ZonedDateTime support. */ - public static class ZonedDT extends Base { + static final class ZonedDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java index de4cc1878..ab95ce24a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java @@ -8,9 +8,9 @@ import org.joda.time.LocalDateTime; /** * Support java.time DateTime types as GeneratedProperty. */ -public class GeneratedUpdateJodaTime { +final class GeneratedUpdateJodaTime { - public static abstract class Base implements GeneratedProperty, GeneratedWhenModified { + static abstract class Base implements GeneratedProperty, GeneratedWhenModified { @Override public boolean includeInUpdate() { @@ -36,7 +36,7 @@ public class GeneratedUpdateJodaTime { /** * LocalDateTime support. */ - public static class LocalDT extends Base { + static final class LocalDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { @@ -52,7 +52,7 @@ public class GeneratedUpdateJodaTime { /** * OffsetDateTime support. */ - public static class DateTimeDT extends Base { + static final class DateTimeDT extends Base { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java index 2d4c85192..72c2b9079 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Generate a (Long) Timestamp whenever the bean is inserted or updated. */ -public class GeneratedUpdateLong implements GeneratedProperty { +final class GeneratedUpdateLong implements GeneratedProperty { /** * Return now as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java index f493401d8..3ee658eb2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java @@ -8,7 +8,7 @@ import java.sql.Timestamp; /** * Generate a Timestamp whenever the bean is inserted or updated. */ -public class GeneratedUpdateTimestamp implements GeneratedProperty, GeneratedWhenModified { +final class GeneratedUpdateTimestamp implements GeneratedProperty, GeneratedWhenModified { /** * Return now as a Timestamp. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java index cdb719014..404f31049 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Used to populate @WhoCreated bean properties. */ -public class GeneratedWhoCreated implements GeneratedProperty { +final class GeneratedWhoCreated implements GeneratedProperty { private final CurrentUserProvider currentUserProvider; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java index e4e68a373..c9aa65537 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Used to populate @WhoModified bean properties. */ -public class GeneratedWhoModified implements GeneratedProperty { +final class GeneratedWhoModified implements GeneratedProperty { private final CurrentUserProvider currentUserProvider; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactory.java index ee2c88a66..f5083c632 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactory.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Helper for creating Insert timestamp GeneratedProperty objects. */ -class InsertTimestampFactory { +final class InsertTimestampFactory { private final Map, GeneratedProperty> map = new HashMap<>(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java index bf3f6db12..cea0a6e86 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java @@ -9,7 +9,7 @@ import java.time.ZonedDateTime; /** * Helper methods for Java time conversion. */ -class JavaTimeUtils { +final class JavaTimeUtils { /** * Return the system millis time as a LocalDateTime. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactory.java index d405f2ec7..d08b75cc6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactory.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Helper for creating Update timestamp GeneratedProperty objects. */ -class UpdateTimestampFactory { +final class UpdateTimestampFactory { private final Map, GeneratedProperty> map = new HashMap<>(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java index 2090fac13..6eff4c21a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java @@ -5,7 +5,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; import java.util.UUID; -public class UuidGeneratedProperty implements GeneratedProperty { +final class UuidGeneratedProperty implements GeneratedProperty { @Override public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { 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 cf2085fa6..2edc359fc 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 @@ -26,18 +26,16 @@ import java.util.Map; public final class IdBinderEmbedded implements IdBinder { private final BeanPropertyAssocOne embIdProperty; - private final boolean idInExpandedForm; - + private final boolean idClass; private BeanProperty[] props; - private BeanDescriptor idDesc; - private String idInValueSql; public IdBinderEmbedded(boolean idInExpandedForm, BeanPropertyAssocOne embIdProperty) { this.idInExpandedForm = idInExpandedForm; this.embIdProperty = embIdProperty; + this.idClass = "_idClass".equals(embIdProperty.getName()); } @Override @@ -59,10 +57,7 @@ public final class IdBinderEmbedded implements IdBinder { if (i > 0) { sb.append(" and "); } - sb.append(idDesc.getBaseTableAlias()); - sb.append("."); - sb.append(props[i].getDbColumn()); - sb.append("=?"); + sb.append(idDesc.getBaseTableAlias()).append(".").append(props[i].getDbColumn()).append("=?"); } sb.append(")"); return sb.toString(); @@ -95,7 +90,9 @@ public final class IdBinderEmbedded implements IdBinder { if (pathPrefix != null) { sb.append(pathPrefix).append("."); } - sb.append(embIdProperty.getName()).append("."); + if (!idClass) { + sb.append(embIdProperty.getName()).append("."); + } sb.append(props[i].getName()); if (!ascending) { sb.append(" desc"); @@ -115,7 +112,9 @@ public final class IdBinderEmbedded implements IdBinder { @Override public void buildRawSqlSelectChain(String prefix, List selectChain) { - prefix = SplitName.add(prefix, embIdProperty.getName()); + if (!idClass) { + prefix = SplitName.add(prefix, embIdProperty.getName()); + } for (BeanProperty prop : props) { prop.buildRawSqlSelectChain(prefix, selectChain); } @@ -141,10 +140,11 @@ public final class IdBinderEmbedded implements IdBinder { StringBuilder sb = new StringBuilder(); for (int i = 0; i < props.length; i++) { if (i > 0) { - sb.append(","); + sb.append(", "); + } + if (!idClass) { + sb.append(embIdProperty.getName()).append("."); } - sb.append(embIdProperty.getName()); - sb.append("."); sb.append(props[i].getName()); } return sb.toString(); @@ -173,8 +173,7 @@ public final class IdBinderEmbedded implements IdBinder { if (i > 0) { sb.append(" and "); } - sb.append(props[i].getDbColumn()); - sb.append("=?"); + sb.append(props[i].getDbColumn()).append("=?"); } sb.append(")"); } @@ -200,7 +199,7 @@ public final class IdBinderEmbedded implements IdBinder { if (idInExpandedForm) { sb.append(" or "); } else { - sb.append(","); + sb.append(", "); } } sb.append(idInValueSql); @@ -212,11 +211,11 @@ public final class IdBinderEmbedded implements IdBinder { @Override public Object[] getIdValues(EntityBean bean) { Object val = embIdProperty.getValue(bean); - Object[] bindvalues = new Object[props.length]; + Object[] bindValues = new Object[props.length]; for (int i = 0; i < props.length; i++) { - bindvalues[i] = props[i].getValue((EntityBean) val); + bindValues[i] = props[i].getValue((EntityBean) val); } - return bindvalues; + return bindValues; } @Override @@ -354,11 +353,10 @@ public final class IdBinderEmbedded implements IdBinder { sb.append("("); for (int i = 0; i < props.length; i++) { if (i > 0) { - sb.append(","); + sb.append(", "); } if (prefix != null) { - sb.append(prefix); - sb.append("."); + sb.append(prefix).append("."); } sb.append(props[i].getName()); } @@ -374,13 +372,12 @@ public final class IdBinderEmbedded implements IdBinder { sb.append(" and "); } if (prefix != null) { - sb.append(prefix); - sb.append("."); + sb.append(prefix).append("."); } - sb.append(embIdProperty.getName()); - sb.append("."); - sb.append(props[i].getName()); - sb.append(operator); + if (!idClass) { + sb.append(embIdProperty.getName()).append("."); + } + sb.append(props[i].getName()).append(operator); } return sb.toString(); } @@ -393,11 +390,9 @@ public final class IdBinderEmbedded implements IdBinder { sb.append(" and "); } if (baseTableAlias != null) { - sb.append(baseTableAlias); - sb.append("."); + sb.append(baseTableAlias).append("."); } - sb.append(props[i].getDbColumn()); - sb.append(" = ? "); + sb.append(props[i].getDbColumn()).append("=?"); } return sb.toString(); } @@ -414,8 +409,7 @@ public final class IdBinderEmbedded implements IdBinder { sb.append(","); } if (baseTableAlias != null) { - sb.append(baseTableAlias); - sb.append("."); + sb.append(baseTableAlias).append("."); } sb.append(props[i].getDbColumn()); } @@ -427,9 +421,9 @@ public final class IdBinderEmbedded implements IdBinder { public Object convertId(Object idValue) { if (idValue instanceof String) { final EntityBean embId = idDesc.createEntityBean(); - final String[] rawVals = ((String)idValue).split("\\|"); + final String[] rawValues = ((String)idValue).split("\\|"); for (int i = 0; i < props.length; i++) { - props[i].setValue(embId, props[i].parse(rawVals[i])); + props[i].setValue(embId, props[i].parse(rawValues[i])); } return embId; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderFactory.java index 70f8a1175..b9bf6f6e6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderFactory.java @@ -7,12 +7,11 @@ import io.ebeaninternal.server.persist.platform.MultiValueBind; /** * Creates the appropriate IdConvertSet depending on the type of Id property(s). */ -public class IdBinderFactory { +public final class IdBinderFactory { private static final IdBinderEmpty EMPTY = new IdBinderEmpty(); private final boolean idInExpandedForm; - private final MultiValueBind multiValueBind; public IdBinderFactory(boolean idInExpandedForm, MultiValueBind multiValueBind) { 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 cb9e6f9aa..6541b3fa5 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 @@ -26,13 +26,9 @@ import java.util.List; public final class IdBinderSimple implements IdBinder { private final BeanProperty idProperty; - private final String bindIdSql; - private final Class expectedType; - private final MultiValueBind multiValueBind; - @SuppressWarnings("rawtypes") private final ScalarType scalarType; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java index 537575ae8..d0f888582 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java @@ -18,12 +18,10 @@ import java.sql.SQLException; /** * Imported Embedded id. */ -public class ImportedIdEmbedded implements ImportedId { +public final class ImportedIdEmbedded implements ImportedId { private final BeanPropertyAssoc owner; - private final BeanPropertyAssocOne foreignAssocOne; - private final ImportedIdSimple[] imported; public ImportedIdEmbedded(BeanPropertyAssoc owner, BeanPropertyAssocOne foreignAssocOne, ImportedIdSimple[] imported) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java index ea9844ec1..83f615994 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java @@ -36,23 +36,11 @@ public final class ImportedIdSimple implements ImportedId, Comparable owner; - final String localDbColumn; - private final String localSqlFormula; - final BeanProperty foreignProperty; - private final int position; - - /** - * If true include in insert. - */ private final boolean insertable; - - /** - * If true include in update. - */ private final boolean updateable; public ImportedIdSimple(BeanPropertyAssoc owner, String localDbColumn, String localSqlFormula, BeanProperty foreignProperty, int position, diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/BeanPropertyElementSetter.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/BeanPropertyElementSetter.java index f20ee47cf..c8a362b60 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/BeanPropertyElementSetter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/BeanPropertyElementSetter.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.properties.BeanPropertySetter; /** * Setter used for "element beans" with ElementCollection. */ -class BeanPropertyElementSetter implements BeanPropertySetter { +final class BeanPropertyElementSetter implements BeanPropertySetter { private final int pos; 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 79ca0beb1..f0184948e 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 @@ -702,13 +702,11 @@ public class DeployBeanDescriptor { } public void sortProperties() { - ArrayList list = new ArrayList<>(propMap.values()); list.sort(PROP_ORDER); - propMap = new LinkedHashMap<>(list.size()); - for (DeployBeanProperty aList : list) { - addBeanProperty(aList); + for (DeployBeanProperty property : list) { + addBeanProperty(property); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanEmbedded.java index 72b541cef..ad70b8d30 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanEmbedded.java @@ -10,7 +10,7 @@ import java.util.Map; * Typically collects the overridden column names mapped * to the Embedded bean. */ -public class DeployBeanEmbedded { +public final class DeployBeanEmbedded { /** * A map of property names to dbColumns. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanObtainJackson.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanObtainJackson.java index 20beef7eb..9bbfb6007 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanObtainJackson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanObtainJackson.java @@ -8,7 +8,7 @@ import io.ebean.config.DatabaseConfig; /** * Used to obtain the Jackson AnnotatedClass for a given bean type utlimately to obtain field level Jackson annotations. */ -class DeployBeanObtainJackson { +final class DeployBeanObtainJackson { private final DatabaseConfig config; private final Class beanType; 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 e20c898ce..5e5455b2f 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 @@ -1,18 +1,6 @@ package io.ebeaninternal.server.deploy.meta; -import io.ebean.annotation.CreatedTimestamp; -import io.ebean.annotation.DocCode; -import io.ebean.annotation.DocProperty; -import io.ebean.annotation.DocSortable; -import io.ebean.annotation.Formula; -import io.ebean.annotation.Platform; -import io.ebean.annotation.SoftDelete; -import io.ebean.annotation.UpdatedTimestamp; -import io.ebean.annotation.WhenCreated; -import io.ebean.annotation.WhenModified; -import io.ebean.annotation.Where; -import io.ebean.annotation.WhoCreated; -import io.ebean.annotation.WhoModified; +import io.ebean.annotation.*; import io.ebean.config.ScalarTypeConverter; import io.ebean.config.dbplatform.DbDefaultValue; import io.ebean.config.dbplatform.DbEncrypt; @@ -39,7 +27,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Type; import java.sql.Types; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -109,6 +96,7 @@ public class DeployBeanProperty { private boolean jsonSerialize = true; private boolean jsonDeserialize = true; + private MutationDetection mutationDetection; private boolean dbEncrypted; private DbEncryptFunction dbEncryptFunction; @@ -327,6 +315,14 @@ public class DeployBeanProperty { this.jsonDeserialize = jsonDeserialize; } + public MutationDetection getMutationDetection() { + return mutationDetection; + } + + public void setMutationDetection(MutationDetection dirtyDetection) { + this.mutationDetection = dirtyDetection; + } + /** * Return the sortOrder for the properties. */ @@ -1201,4 +1197,11 @@ public class DeployBeanProperty { return false; } + boolean isJsonMapper() { + return scalarType != null && scalarType.isJsonMapper(); + } + + boolean isJsonType() { + return mutationDetection != null; + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocOne.java index 79f253b86..1444c69de 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocOne.java @@ -7,7 +7,7 @@ import javax.persistence.CascadeType; /** * Property mapped to a joined bean. */ -public class DeployBeanPropertyAssocOne extends DeployBeanPropertyAssoc { +public final class DeployBeanPropertyAssocOne extends DeployBeanPropertyAssoc { private boolean oneToOne; 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 f6280b260..a6ed9c330 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 @@ -1,15 +1,7 @@ package io.ebeaninternal.server.deploy.meta; import io.ebean.bean.EntityBean; -import io.ebeaninternal.server.deploy.BeanDescriptor; -import io.ebeaninternal.server.deploy.BeanDescriptorMap; -import io.ebeaninternal.server.deploy.BeanProperty; -import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; -import io.ebeaninternal.server.deploy.BeanPropertyIdClass; -import io.ebeaninternal.server.deploy.BeanPropertyOrderColumn; -import io.ebeaninternal.server.deploy.BeanPropertySimpleCollection; -import io.ebeaninternal.server.deploy.InheritInfo; +import io.ebeaninternal.server.deploy.*; import io.ebeaninternal.server.deploy.generatedproperty.GeneratedProperty; import io.ebeaninternal.server.properties.BeanPropertySetter; import io.ebeaninternal.server.type.ScalarTypeString; @@ -23,54 +15,35 @@ import java.util.List; /** * Helper object to classify BeanProperties into appropriate lists. */ -public class DeployBeanPropertyLists { +public final class DeployBeanPropertyLists { private static final Logger logger = LoggerFactory.getLogger(DeployBeanPropertyLists.class); private static final NoopSetter NOOP_SETTER = new NoopSetter(); private BeanProperty versionProperty; - private BeanProperty unmappedJson; - private BeanProperty draft; - private BeanProperty draftDirty; - private BeanProperty tenant; - private final BeanDescriptor desc; - private final LinkedHashMap propertyMap; - private BeanProperty id; private final List local = new ArrayList<>(); - private final List mutable = new ArrayList<>(); - private final List> manys = new ArrayList<>(); - private final List nonManys = new ArrayList<>(); - private final List aggs = new ArrayList<>(); - private final List> ones = new ArrayList<>(); - private final List> onesImported = new ArrayList<>(); - private final List> embedded = new ArrayList<>(); - private final List baseScalar = new ArrayList<>(); - private final List transients = new ArrayList<>(); - private final List nonTransients = new ArrayList<>(); - private final BeanPropertyAssocOne unidirectional; private final BeanProperty orderColumn; - @SuppressWarnings({"unchecked"}) public DeployBeanPropertyLists(BeanDescriptorMap owner, BeanDescriptor desc, DeployBeanDescriptor deploy) { this.desc = desc; @@ -86,7 +59,7 @@ public class DeployBeanPropertyLists { this.orderColumn = deployOrderColumn != null ? new BeanPropertyOrderColumn(desc, deployOrderColumn) : null; DeployBeanPropertyAssocOne deployUnidirectional = deploy.getUnidirectional(); - this.unidirectional = deployUnidirectional == null ? null : new BeanPropertyAssocOne(owner, desc, deployUnidirectional); + this.unidirectional = deployUnidirectional == null ? null : new BeanPropertyAssocOne<>(owner, desc, deployUnidirectional); this.propertyMap = new LinkedHashMap<>(); @@ -127,7 +100,7 @@ public class DeployBeanPropertyLists { } if (orderColumn != null) { - orderColumn.setDeployOrder(order++); + orderColumn.setDeployOrder(order); allocateToList(orderColumn); propertyMap.put(orderColumn.getName(), orderColumn); } @@ -154,7 +127,6 @@ public class DeployBeanPropertyLists { } private void setImportedPrimaryKeysFor(DeployBeanDescriptor deploy, DeployBeanPropertyAssocOne id) { - for (DeployBeanProperty prop : id.getTargetDeploy().properties()) { DeployBeanProperty match = findImported(deploy, prop); if (match != null) { @@ -164,7 +136,6 @@ public class DeployBeanPropertyLists { } private DeployBeanProperty findImported(DeployBeanDescriptor deploy, DeployBeanProperty embeddedScalar) { - // the logical name and db column we are looking for a match on String name = embeddedScalar.getName(); String dbColumn = embeddedScalar.getDbColumn(); @@ -180,7 +151,6 @@ public class DeployBeanPropertyLists { return assocOne; } } - return null; } @@ -368,7 +338,6 @@ public class DeployBeanPropertyLists { } public BeanProperty getSoftDeleteProperty() { - for (BeanProperty prop : nonManys) { if (prop.isSoftDelete()) { return prop; @@ -385,7 +354,6 @@ public class DeployBeanPropertyLists { * Return the properties set via generated values on insert. */ public BeanProperty[] getGeneratedInsert() { - List list = new ArrayList<>(); for (BeanProperty prop : nonTransients) { GeneratedProperty gen = prop.getGeneratedProperty(); @@ -400,7 +368,6 @@ public class DeployBeanPropertyLists { * Return the properties set via generated values on update. */ public BeanProperty[] getGeneratedUpdate() { - List list = new ArrayList<>(); for (BeanProperty prop : nonTransients) { GeneratedProperty gen = prop.getGeneratedProperty(); @@ -438,8 +405,7 @@ public class DeployBeanPropertyLists { } } } - - return (BeanPropertyAssocOne[]) list.toArray(new BeanPropertyAssocOne[0]); + return list.toArray(new BeanPropertyAssocOne[0]); } private BeanPropertyAssocMany[] getMany2Many() { @@ -449,8 +415,7 @@ public class DeployBeanPropertyLists { list.add(prop); } } - - return (BeanPropertyAssocMany[]) list.toArray(new BeanPropertyAssocMany[0]); + return list.toArray(new BeanPropertyAssocMany[0]); } private BeanPropertyAssocMany[] getMany(Mode mode) { @@ -471,25 +436,26 @@ public class DeployBeanPropertyLists { break; } } - - return (BeanPropertyAssocMany[]) list.toArray(new BeanPropertyAssocMany[0]); + return list.toArray(new BeanPropertyAssocMany[0]); } @SuppressWarnings({"unchecked", "rawtypes"}) private BeanProperty createBeanProperty(BeanDescriptorMap owner, DeployBeanProperty deployProp) { - if (deployProp instanceof DeployBeanPropertyAssocOne) { return new BeanPropertyAssocOne(owner, desc, (DeployBeanPropertyAssocOne) deployProp); } - if (deployProp instanceof DeployBeanPropertySimpleCollection) { return new BeanPropertySimpleCollection(desc, (DeployBeanPropertySimpleCollection) deployProp); } - if (deployProp instanceof DeployBeanPropertyAssocMany) { return new BeanPropertyAssocMany(desc, (DeployBeanPropertyAssocMany) deployProp); } - + if (deployProp.isJsonMapper()) { + return new BeanPropertyJsonMapper(desc, deployProp); + } + if (deployProp.isJsonType()) { + return new BeanPropertyJsonBasic(desc, deployProp); + } return new BeanProperty(desc, deployProp); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertySimpleCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertySimpleCollection.java index 6777dcc4c..870bae89f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertySimpleCollection.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertySimpleCollection.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.deploy.meta; import io.ebean.bean.BeanCollection.ModifyListenMode; import io.ebeaninternal.server.deploy.ManyType; -public class DeployBeanPropertySimpleCollection extends DeployBeanPropertyAssocMany { +public final class DeployBeanPropertySimpleCollection extends DeployBeanPropertyAssocMany { public DeployBeanPropertySimpleCollection(DeployBeanDescriptor desc, Class targetType, ManyType manyType) { super(desc, targetType, manyType); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanTable.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanTable.java index de0166876..960205e0f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanTable.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanTable.java @@ -13,7 +13,7 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; * in a BeanDescriptor. *

*/ -public class DeployBeanTable { +public final class DeployBeanTable { private final Class beanType; 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 5915dc873..6a20d9145 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 @@ -5,7 +5,7 @@ import io.ebean.annotation.IdentityGenerated; import io.ebean.annotation.IdentityType; import io.ebean.config.dbplatform.IdType; -public class DeployIdentityMode { +public final class DeployIdentityMode { public static DeployIdentityMode auto() { return new DeployIdentityMode(IdType.AUTO); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployOrderColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployOrderColumn.java index 26a8402b6..4a8943a8e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployOrderColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployOrderColumn.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.deploy.meta; import javax.persistence.OrderColumn; -public class DeployOrderColumn { +public final class DeployOrderColumn { /** * Logical property name used for order by and available for expression language. 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 c3451f9f4..2a4608358 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 @@ -15,7 +15,7 @@ import java.util.Set; * This gets converted into a immutable TableJoin when complete. *

*/ -public class DeployTableJoin { +public final class DeployTableJoin { /** * The joined table. @@ -33,7 +33,7 @@ public class DeployTableJoin { private ArrayList columns = new ArrayList<>(4); private InheritInfo inheritInfo; - + private String extraWhere; /** @@ -146,11 +146,11 @@ public class DeployTableJoin { public String getExtraWhere() { return extraWhere; } - + public void setExtraWhere(String extraWhere) { this.extraWhere = extraWhere; } - + public DeployTableJoin createInverse(String tableName) { DeployTableJoin inverse = new DeployTableJoin(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoinColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoinColumn.java index da4bf0339..df5c4e0d5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoinColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployTableJoinColumn.java @@ -8,7 +8,7 @@ import javax.persistence.JoinColumn; /** * A join pair of local and foreign properties. */ -public class DeployTableJoinColumn { +public final class DeployTableJoinColumn { /** * The local database column name. 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 1ca59dbc8..a98867a54 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 @@ -41,7 +41,7 @@ import java.util.Set; /** * Read the deployment annotation for Assoc Many beans. */ -class AnnotationAssocManys extends AnnotationAssoc { +final class AnnotationAssocManys extends AnnotationAssoc { AnnotationAssocManys(DeployBeanInfo info, ReadAnnotationConfig readConfig, BeanDescriptorManager factory) { super(info, readConfig, factory); 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 36fa99b57..727fe7c83 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 @@ -30,7 +30,7 @@ import javax.persistence.PrimaryKeyJoinColumn; /** * Read the deployment annotations for Associated One beans. */ -public class AnnotationAssocOnes extends AnnotationAssoc { +final class AnnotationAssocOnes extends AnnotationAssoc { private static final Logger log = LoggerFactory.getLogger(AnnotationAssocOnes.class); 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 8985fb4ac..44a9d2113 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 @@ -36,7 +36,7 @@ import static io.ebean.util.AnnotationUtil.typeGet; /** * Read the class level deployment annotations. */ -public class AnnotationClass extends AnnotationParser { +final class AnnotationClass extends AnnotationParser { private static final Logger logger = LoggerFactory.getLogger(AnnotationClass.class); 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 5a0caa287..571e1d3ca 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 @@ -76,15 +76,13 @@ import java.util.UUID; /** * Read the field level deployment annotations. */ -public class AnnotationFields extends AnnotationParser { +final class AnnotationFields extends AnnotationParser { /** * If present read Jackson JsonIgnore. */ private final boolean jacksonAnnotationsPresent; - private final GeneratedPropertyFactory generatedPropFactory; - /** * By default we lazy load Lob properties. */ @@ -118,20 +116,16 @@ public class AnnotationFields extends AnnotationParser { * Read the Id marker annotations on EmbeddedId properties. */ private void readAssocOne(DeployBeanPropertyAssoc prop) { - readJsonAnnotations(prop); - if (has(prop, Id.class)) { readIdAssocOne(prop); } - if (has(prop, EmbeddedId.class)) { prop.setId(); prop.setNullable(false); prop.setEmbedded(); info.setEmbeddedId(prop); } - DocEmbedded docEmbedded = get(prop, DocEmbedded.class); if (docEmbedded != null) { prop.setDocStoreEmbedded(docEmbedded.doc()); @@ -143,19 +137,16 @@ public class AnnotationFields extends AnnotationParser { } } } - if (prop instanceof DeployBeanPropertyAssocOne) { if (prop.isId() && !prop.isEmbedded()) { prop.setEmbedded(); } readEmbeddedAttributeOverrides((DeployBeanPropertyAssocOne) prop); } - Formula formula = prop.getMetaAnnotationFormula(platform); if (formula != null) { prop.setSqlFormula(processFormula(formula.select()), processFormula(formula.join())); } - initWhoProperties(prop); initDbMigration(prop); } @@ -170,32 +161,26 @@ public class AnnotationFields extends AnnotationParser { } private void readField(DeployBeanProperty prop) { - // all Enums will have a ScalarType assigned... boolean isEnum = prop.getPropertyType().isEnum(); Enumerated enumerated = get(prop, Enumerated.class); if (isEnum || enumerated != null) { util.setEnumScalarType(enumerated, prop); } - // its persistent and assumed to be on the base table // rather than on a secondary table prop.setDbRead(true); prop.setDbInsertable(true); prop.setDbUpdateable(true); - Column column = prop.getMetaAnnotation(Column.class); if (column != null) { readColumn(column, prop); } - readJsonAnnotations(prop); - if (prop.getDbColumn() == null) { // No @Column or @Column.name() so use NamingConvention prop.setDbColumn(namingConvention.getColumnFromProperty(beanType, prop.getName())); } - initIdentity(prop); initTenantId(prop); initDbJson(prop); @@ -204,7 +189,6 @@ public class AnnotationFields extends AnnotationParser { initWhen(prop); initWhoProperties(prop); initDbMigration(prop); - // Want to process last so we can use with @Formula if (has(prop, Transient.class)) { // it is not a persistent property. @@ -213,9 +197,7 @@ public class AnnotationFields extends AnnotationParser { prop.setDbUpdateable(false); prop.setTransient(); } - initEncrypt(prop); - for (Index index : annotationIndexes(prop)) { addIndex(prop, index); } @@ -234,22 +216,18 @@ public class AnnotationFields extends AnnotationParser { if (identity != null) { readIdentity(identity); } - // determine the JDBC type using Lob/Temporal // otherwise based on the property Class Temporal temporal = get(prop, Temporal.class); if (temporal != null) { readTemporal(temporal, prop); - } else if (has(prop, Lob.class)) { util.setLobType(prop); } - Length length = get(prop, Length.class); if (length != null) { prop.setDbLength(length.value()); } - if (has(prop, io.ebean.annotation.NotNull.class)) { prop.setNullable(false); } @@ -336,7 +314,6 @@ public class AnnotationFields extends AnnotationParser { if (formula != null) { prop.setSqlFormula(processFormula(formula.select()), processFormula(formula.join())); } - final Aggregation aggregation = prop.getMetaAnnotation(Aggregation.class); if (aggregation != null) { prop.setAggregation(aggregation.value().replace("$1", prop.getName())); @@ -349,7 +326,6 @@ public class AnnotationFields extends AnnotationParser { prop.setVersionColumn(); generatedPropFactory.setVersion(prop); } - Basic basic = get(prop, Basic.class); if (basic != null) { prop.setFetchType(basic.fetch()); @@ -397,7 +373,6 @@ public class AnnotationFields extends AnnotationParser { if (dbDefault != null) { prop.setDbColumnDefault(dbDefault.value()); } - Set dbMigration = annotationDbMigrations(prop); dbMigration.forEach(ann -> prop.addDbMigrationInfo( new DbMigrationInfo(ann.preAdd(), ann.postAdd(), ann.preAlter(), ann.postAlter(), ann.platforms()))); @@ -423,7 +398,6 @@ public class AnnotationFields extends AnnotationParser { throw new RuntimeException("DB-columname has to be specified exactly one time in columnNames."); } } - if (columnNames.length == 1 && hasRelationshipItem(prop)) { throw new RuntimeException("Can't use Index on foreign key relationships."); } @@ -438,13 +412,11 @@ public class AnnotationFields extends AnnotationParser { prop.setJsonDeserialize(!jsonIgnore.value()); } } - Expose expose = get(prop, Expose.class); if (expose != null) { prop.setJsonSerialize(expose.serialize()); prop.setJsonDeserialize(expose.deserialize()); } - JsonIgnore jsonIgnore = get(prop, JsonIgnore.class); if (jsonIgnore != null) { prop.setJsonSerialize(jsonIgnore.serialize()); @@ -460,9 +432,7 @@ public 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())) { // Always using Java client encryption rather than DB for encryption @@ -474,12 +444,9 @@ public class AnnotationFields extends AnnotationParser { prop.setScalarType(encryptedScalarType); prop.setLocalEncrypted(); return; - } if (dbEncString) { - DbEncrypt dbEncrypt = util.getDbPlatform().getDbEncrypt(); - if (dbEncrypt != null) { // check if we have a DB encryption function for this type int jdbcType = prop.getScalarType().getJdbcType(); @@ -491,7 +458,6 @@ public class AnnotationFields extends AnnotationParser { } } } - prop.setScalarType(createScalarType(prop, st)); prop.setLocalEncrypted(); if (dbLen > 0) { @@ -501,11 +467,9 @@ public class AnnotationFields extends AnnotationParser { @SuppressWarnings({"unchecked"}) private ScalarTypeEncryptedWrapper createScalarType(DeployBeanProperty prop, ScalarType st) { - // Use Java Encryptor wrapping the logical scalar type DataEncryptSupport support = createDataEncryptSupport(prop); ScalarTypeBytesBase byteType = getDbEncryptType(prop); - return new ScalarTypeEncryptedWrapper(st, byteType, support); } @@ -515,10 +479,8 @@ public class AnnotationFields extends AnnotationParser { } private DataEncryptSupport createDataEncryptSupport(DeployBeanProperty prop) { - String table = info.getDescriptor().getBaseTable(); String column = prop.getDbColumn(); - return util.createDataEncryptSupport(table, column); } @@ -530,7 +492,6 @@ public class AnnotationFields extends AnnotationParser { } } descriptor.setIdGeneratedValue(); - SequenceGenerator seq = get(prop, SequenceGenerator.class); if (seq != null) { String seqName = seq.sequenceName(); @@ -543,13 +504,11 @@ public class AnnotationFields extends AnnotationParser { GenerationType strategy = gen.strategy(); if (strategy == GenerationType.IDENTITY) { descriptor.setIdentityType(IdType.IDENTITY); - } else if (strategy == GenerationType.SEQUENCE) { descriptor.setIdentityType(IdType.SEQUENCE); if (!gen.generator().isEmpty()) { descriptor.setIdentitySequenceGenerator(gen.generator()); } - } else if (strategy == GenerationType.AUTO) { if (!gen.generator().isEmpty()) { // use a custom IdGenerator @@ -565,21 +524,16 @@ public class AnnotationFields extends AnnotationParser { } private void readTemporal(Temporal temporal, DeployBeanProperty prop) { - TemporalType type = temporal.value(); if (type == TemporalType.DATE) { prop.setDbType(Types.DATE); - } else if (type == TemporalType.TIMESTAMP) { prop.setDbType(Types.TIMESTAMP); - } else if (type == TemporalType.TIME) { prop.setDbType(Types.TIME); - } else { throw new PersistenceException("Unhandled type " + type); } } - } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFind.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFind.java index 0faf59837..386e08e64 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFind.java @@ -15,7 +15,7 @@ import java.util.Set; import static io.ebean.util.AnnotationUtil.get; -public class AnnotationFind { +final class AnnotationFind { public static Set joinColumns(Field field) { final JoinColumn col = get(field, JoinColumn.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationSql.java index 5001f2f70..955c119db 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationSql.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; /** * Read the class level deployment annotations. */ -class AnnotationSql extends AnnotationParser { +final class AnnotationSql extends AnnotationParser { AnnotationSql(DeployBeanInfo info, ReadAnnotationConfig readConfig) { super(info, readConfig); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployBeanInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployBeanInfo.java index 002cb5e0e..e87ff7754 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployBeanInfo.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployBeanInfo.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.rawsql.SpiRawSql; /** * Wraps information about a bean during deployment parsing. */ -public class DeployBeanInfo { +public final class DeployBeanInfo { private final DeployUtil util; 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 6fb54b46d..d3d7ddb7d 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 @@ -35,7 +35,7 @@ import java.lang.reflect.WildcardType; * one or normal scalar property. *

*/ -public class DeployCreateProperties { +public final class DeployCreateProperties { private static final Logger logger = LoggerFactory.getLogger(DeployCreateProperties.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java index fd9e4641b..7bc0ebd1b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Builds the InheritInfo deployment information. */ -public class DeployInherit { +public final class DeployInherit { private final Map, DeployInheritInfo> deployMap = new LinkedHashMap<>(); 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 fb1a65a54..d1af77c8c 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 @@ -12,7 +12,7 @@ import java.util.List; * Represents a node in the Inheritance tree. * Holds information regarding Super Subclass support. */ -public class DeployInheritInfo { +public final class DeployInheritInfo { /** * the default discriminator column according to the JPA 1.0 spec. 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 65c7cf45e..276ff8d33 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 @@ -1,10 +1,6 @@ package io.ebeaninternal.server.deploy.parse; -import io.ebean.annotation.DbArray; -import io.ebean.annotation.DbJson; -import io.ebean.annotation.DbJsonB; -import io.ebean.annotation.DbJsonType; -import io.ebean.annotation.DbMap; +import io.ebean.annotation.*; import io.ebean.config.DatabaseConfig; import io.ebean.config.EncryptDeploy; import io.ebean.config.EncryptDeployManager; @@ -30,7 +26,7 @@ import java.sql.Types; /** * Utility object to help processing deployment information. */ -public class DeployUtil { +public final class DeployUtil { /** * Assumes CLOB rather than LONGVARCHAR. @@ -209,26 +205,22 @@ public class DeployUtil { } } - /** - * This property is marked as a Lob object. - */ void setDbJsonType(DeployBeanProperty prop, DbJson dbJsonType) { - int dbType = getDbJsonStorage(dbJsonType.storage()); - setDbJsonType(prop, dbType, dbJsonType.length()); + setDbJsonType(prop, dbType, dbJsonType.length(), dbJsonType.mutationDetection()); } void setDbJsonBType(DeployBeanProperty prop, DbJsonB dbJsonB) { - setDbJsonType(prop, DbPlatformType.JSONB, dbJsonB.length()); + setDbJsonType(prop, DbPlatformType.JSONB, dbJsonB.length(), dbJsonB.mutationDetection()); } - private void setDbJsonType(DeployBeanProperty prop, int dbType, int dbLength) { - + private void setDbJsonType(DeployBeanProperty prop, int dbType, int dbLength, MutationDetection mutationDetection) { + prop.setDbType(dbType); + prop.setMutationDetection(mutationDetection); ScalarType scalarType = typeManager.getJsonScalarType(prop, dbType, dbLength); if (scalarType == null) { throw new RuntimeException("No ScalarType for JSON property [" + prop + "] [" + dbType + "]"); } - prop.setDbType(dbType); prop.setScalarType(scalarType); if (dbType == Types.VARCHAR || dbLength > 0) { // determine the db column size diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/InitMetaJacksonAnnotation.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/InitMetaJacksonAnnotation.java index 08435de62..f283055ae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/InitMetaJacksonAnnotation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/InitMetaJacksonAnnotation.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.deploy.parse; -class InitMetaJacksonAnnotation { +final class InitMetaJacksonAnnotation { static void init(ReadAnnotationConfig readConfig) { readConfig.addMetaAnnotation(com.fasterxml.jackson.annotation.JacksonAnnotation.class); 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 1daf37564..81b5576e9 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 @@ -15,7 +15,7 @@ import java.util.Set; /** * Configuration used when reading the deployment annotations. */ -class ReadAnnotationConfig { +final class ReadAnnotationConfig { private final GeneratedPropertyFactory generatedPropFactory; private final String asOfViewSuffix; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotations.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotations.java index da2bc6030..c4ab55a1b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotations.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadAnnotations.java @@ -8,7 +8,7 @@ import io.ebeaninternal.server.deploy.generatedproperty.GeneratedPropertyFactory /** * Read the deployment annotations for the bean. */ -public class ReadAnnotations { +public final class ReadAnnotations { private final ReadAnnotationConfig readConfig; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJakarta.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJakarta.java index 016e9f13a..95046f25d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJakarta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJakarta.java @@ -12,7 +12,7 @@ import java.util.List; /** * Jakarta validation annotations reader. */ -class ReadValidationAnnotationsJakarta implements ReadValidationAnnotations { +final class ReadValidationAnnotationsJakarta implements ReadValidationAnnotations { ReadValidationAnnotationsJakarta(ReadAnnotationConfig readConfig) { readConfig.addMetaAnnotation(Size.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJavax.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJavax.java index a690e69de..4704bf766 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJavax.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/ReadValidationAnnotationsJavax.java @@ -12,7 +12,7 @@ import java.util.List; /** * Javax validation annotations reader. */ -class ReadValidationAnnotationsJavax implements ReadValidationAnnotations { +final class ReadValidationAnnotationsJavax implements ReadValidationAnnotations { ReadValidationAnnotationsJavax(ReadAnnotationConfig readConfig) { readConfig.addMetaAnnotation(Size.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/TransientProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/TransientProperties.java index e7896b96a..be5b10aee 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/TransientProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/TransientProperties.java @@ -8,28 +8,22 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne; /** * Mark transient properties. */ -public class TransientProperties { - - public TransientProperties() { - } +public final class TransientProperties { /** * Mark any additional properties as transient. */ public void process(DeployBeanDescriptor desc) { - for (DeployBeanProperty prop : desc.propertiesBase()) { if (!prop.isDbRead() && !prop.isDbInsertable() && !prop.isDbUpdateable()) { prop.setTransient(); } } - for (DeployBeanPropertyAssocOne prop : desc.propertiesAssocOne()) { if (prop.getBeanTable() == null && !prop.isEmbedded()) { prop.setTransient(); } } - for (DeployBeanPropertyAssocMany prop : desc.propertiesAssocMany()) { if (prop.getBeanTable() == null) { prop.setTransient(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java index 10f2a2cdc..041ac7d45 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java @@ -8,14 +8,11 @@ import java.util.concurrent.ConcurrentHashMap; /** * Manages the query plans for a given DTO bean type. */ -public class DtoBeanDescriptor { +public final class DtoBeanDescriptor { private final Map plans = new ConcurrentHashMap<>(); - private final Class dtoType; - private final DtoMeta meta; - private final Map namedQueries; DtoBeanDescriptor(Class dtoType, DtoMeta meta, Map namedQueries) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java index 4388a180d..c11f79843 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java @@ -10,14 +10,13 @@ import java.util.concurrent.ConcurrentHashMap; /** * Manages all the DTO bean descriptors. */ -public class DtoBeanManager { +@SuppressWarnings("rawtypes") +public final class DtoBeanManager { private static final Map EMPTY_NAMED_QUERIES = new HashMap<>(); private final TypeManager typeManager; - private final Map, DtoNamedQueries> namedQueries; - private final Map descriptorMap = new ConcurrentHashMap<>(); public DtoBeanManager(TypeManager typeManager, Map, DtoNamedQueries> namedQueries) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java index 187caf97f..9f42f2d0f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.dto; /** * A column in the resultSet that we want to map to a bean property. */ -public class DtoColumn { +public final class DtoColumn { private final String label; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java index b2a72db61..8c882599c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java @@ -8,18 +8,13 @@ import io.ebeaninternal.api.SpiDtoQuery; /** * Request to map a resultSet columns for a query into a DTO bean. */ -public class DtoMappingRequest { +public final class DtoMappingRequest { private final Class type; - private final String label; - private final ProfileLocation profileLocation; - private final String sql; - private final boolean relaxedMode; - private final DtoColumn[] columnMeta; public DtoMappingRequest(SpiDtoQuery query, String sql, DtoColumn[] columnMeta) { 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 09bc441e9..9582c160e 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 @@ -10,23 +10,19 @@ import java.util.Map; * * Uses this to map a mapping request (columns) to a 'query plan' (constructor and setters). */ -class DtoMeta { +final class DtoMeta { private final Class dtoType; private final Map propMap = new LinkedHashMap<>(); - private final Map constructorMap = new LinkedHashMap<>(); - private final DtoMetaConstructor defaultConstructor; private final DtoMetaConstructor maxArgConstructor; DtoMeta(Class dtoType, List constructors, List properties) { this.dtoType = dtoType; - for (DtoMetaProperty property : properties) { propMap.put(property.getName().toUpperCase(), property); } - int maxArg = 0; DtoMetaConstructor defaultConstructor = null; @@ -47,9 +43,7 @@ class DtoMeta { } public DtoQueryPlan match(DtoMappingRequest request) { - DtoColumn[] cols = request.getColumnMeta(); - int colLen = cols.length; DtoMetaConstructor constructor = constructorMap.get(colLen); if (constructor != null) { 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 bc5f900ed..0241c2747 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 @@ -15,16 +15,13 @@ import java.util.List; *

* Use TypeManager to map bean property types to ScalarTypes. */ -class DtoMetaBuilder { +final class DtoMetaBuilder { private static final Logger log = LoggerFactory.getLogger(DtoMetaBuilder.class); private final TypeManager typeManager; - private final Class dtoType; - private final List properties = new ArrayList<>(); - private final List constructorList = new ArrayList<>(); DtoMetaBuilder(Class dtoType, TypeManager typeManager) { 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 35a736346..efd7c97d2 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 @@ -10,22 +10,19 @@ import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.sql.SQLException; -class DtoMetaConstructor { +final class DtoMetaConstructor { private final Class[] types; private final MethodHandle handle; - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); private final ScalarType[] scalarTypes; DtoMetaConstructor(TypeManager typeManager, Constructor constructor, Class someClass) throws NoSuchMethodException, IllegalAccessException { - this.types = constructor.getParameterTypes(); this.scalarTypes = new ScalarType[types.length]; for (int i = 0; i < types.length; i++) { scalarTypes[i] = typeManager.getScalarType(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 c4beae172..fe7d794a1 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 @@ -10,7 +10,7 @@ import java.lang.invoke.MethodType; import java.lang.reflect.Method; import java.sql.SQLException; -class DtoMetaProperty implements DtoReadSet { +final class DtoMetaProperty implements DtoReadSet { private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoNamedQueries.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoNamedQueries.java index 7b455de3d..6e92b010a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoNamedQueries.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoNamedQueries.java @@ -6,9 +6,9 @@ import java.util.Map; /** * Collection of named queries for a single Dto bean type. */ -public class DtoNamedQueries { +public final class DtoNamedQueries { - private Map namedRawSql = new HashMap<>(); + private final Map namedRawSql = new HashMap<>(); /** * Add the named query from deployment XML. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConPlus.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConPlus.java index 1bc530b78..3ea144604 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConPlus.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConPlus.java @@ -7,10 +7,9 @@ import java.sql.SQLException; /** * Plan based on Constructor plus some setter methods. */ -class DtoQueryPlanConPlus extends DtoQueryPlanBase { +final class DtoQueryPlanConPlus extends DtoQueryPlanBase { private final DtoMetaConstructor maxArgConstructor; - private final DtoReadSet[] setterProps; DtoQueryPlanConPlus(DtoMappingRequest request, DtoMetaConstructor maxArgConstructor, DtoReadSet[] setterProps) { @@ -21,7 +20,6 @@ class DtoQueryPlanConPlus extends DtoQueryPlanBase { @Override public Object readRow(DataReader dataReader) throws SQLException { - Object bean = maxArgConstructor.process(dataReader); for (DtoReadSet setterProp : setterProps) { setterProp.readSet(bean, dataReader); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConSetter.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConSetter.java index 70629e8da..a5aa905a9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConSetter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConSetter.java @@ -7,10 +7,9 @@ import java.sql.SQLException; /** * Plan based on default constructor and setter methods. */ -class DtoQueryPlanConSetter extends DtoQueryPlanBase { +final class DtoQueryPlanConSetter extends DtoQueryPlanBase { private final DtoMetaConstructor defaultConstructor; - private final DtoReadSet[] setterProps; DtoQueryPlanConSetter(DtoMappingRequest request, DtoMetaConstructor defaultConstructor, DtoReadSet[] setterProps) { @@ -21,7 +20,6 @@ class DtoQueryPlanConSetter extends DtoQueryPlanBase { @Override public Object readRow(DataReader dataReader) throws SQLException { - Object bean = defaultConstructor.defaultConstructor(); for (DtoReadSet setterProp : setterProps) { setterProp.readSet(bean, dataReader); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConstructor.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConstructor.java index 912b41cd2..e0d39faa7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConstructor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanConstructor.java @@ -7,7 +7,7 @@ import java.sql.SQLException; /** * Plan based on mapping via single constructor only. */ -class DtoQueryPlanConstructor extends DtoQueryPlanBase { +final class DtoQueryPlanConstructor extends DtoQueryPlanBase { private final DtoMetaConstructor constructor; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoReadSetColumnSkip.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoReadSetColumnSkip.java index 9fda8b81f..d2743e59d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoReadSetColumnSkip.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoReadSetColumnSkip.java @@ -5,7 +5,7 @@ import io.ebean.core.type.DataReader; /** * Placeholder to skip reading a column that isn't mapped to a bean property. */ -class DtoReadSetColumnSkip implements DtoReadSet { +final class DtoReadSetColumnSkip implements DtoReadSet { static final DtoReadSet INSTANCE = new DtoReadSetColumnSkip(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorNoop.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorNoop.java index 9377aa91c..9fa68b481 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorNoop.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorNoop.java @@ -6,7 +6,7 @@ package io.ebeaninternal.server.el; * @author Roland Praml, FOCONIS AG * */ -public class ElComparatorNoop implements ElComparator { +public final class ElComparatorNoop implements ElComparator { private static final long serialVersionUID = -9060871822183687180L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorProperty.java index a1093473f..56576d947 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElComparatorProperty.java @@ -12,9 +12,7 @@ public final class ElComparatorProperty implements Comparator, ElComparato private static final long serialVersionUID = -2735738237263956073L; private final ElPropertyValue elGetValue; - private final int nullOrder; - private final int asc; public ElComparatorProperty(ElPropertyValue elGetValue, boolean ascending, boolean nullsHigh) { 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 4b205fb19..470345a31 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 @@ -14,11 +14,8 @@ import java.util.regex.Pattern; public final class ElFilter implements Filter { private final BeanDescriptor beanDescriptor; - private final ArrayList> matches = new ArrayList<>(); - private int maxRows; - private String sortByClause; public ElFilter(BeanDescriptor beanDescriptor) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElMatchBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElMatchBuilder.java index 0cccfb9f4..66e966cfb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElMatchBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElMatchBuilder.java @@ -8,12 +8,12 @@ import java.util.regex.Pattern; /** * Contains the various ElMatcher implementations. */ -class ElMatchBuilder { +final class ElMatchBuilder { /** * Case insensitive equals. */ - static class RegularExpr implements ElMatcher { + static final class RegularExpr implements ElMatcher { final ElPropertyValue elGetValue; final String value; @@ -49,7 +49,7 @@ class ElMatchBuilder { public abstract boolean isMatch(T bean); } - static class Ieq extends BaseString { + static final class Ieq extends BaseString { Ieq(ElPropertyValue elGetValue, String value) { super(elGetValue, value); } @@ -64,7 +64,7 @@ class ElMatchBuilder { /** * Case insensitive starts with matcher. */ - static class IStartsWith implements ElMatcher { + static final class IStartsWith implements ElMatcher { final ElPropertyValue elGetValue; final CharMatch charMatch; @@ -85,7 +85,7 @@ class ElMatchBuilder { /** * Case insensitive ends with matcher. */ - static class IEndsWith implements ElMatcher { + static final class IEndsWith implements ElMatcher { final ElPropertyValue elGetValue; final CharMatch charMatch; @@ -103,7 +103,7 @@ class ElMatchBuilder { } } - static class StartsWith extends BaseString { + static final class StartsWith extends BaseString { StartsWith(ElPropertyValue elGetValue, String value) { super(elGetValue, value); } @@ -115,7 +115,7 @@ class ElMatchBuilder { } } - static class EndsWith extends BaseString { + static final class EndsWith extends BaseString { EndsWith(ElPropertyValue elGetValue, String value) { super(elGetValue, value); } @@ -127,7 +127,7 @@ class ElMatchBuilder { } } - static class IsNull implements ElMatcher { + static final class IsNull implements ElMatcher { final ElPropertyValue elGetValue; @@ -141,7 +141,7 @@ class ElMatchBuilder { } } - static class IsNotNull implements ElMatcher { + static final class IsNotNull implements ElMatcher { final ElPropertyValue elGetValue; @@ -170,7 +170,7 @@ class ElMatchBuilder { public abstract boolean isMatch(T value); } - static class InSet implements ElMatcher { + static final class InSet implements ElMatcher { final Set set; final ElPropertyValue elGetValue; @@ -183,7 +183,6 @@ class ElMatchBuilder { @Override public boolean isMatch(T bean) { - Object value = elGetValue.pathGet(bean); return value != null && set.contains(value); } @@ -192,7 +191,7 @@ class ElMatchBuilder { /** * Equal To. */ - static class Eq extends Base { + static final class Eq extends Base { public Eq(Object filterValue, ElComparator comparator) { super(filterValue, comparator); @@ -207,7 +206,7 @@ class ElMatchBuilder { /** * Not Equal To. */ - static class Ne extends Base { + static final class Ne extends Base { public Ne(Object filterValue, ElComparator comparator) { super(filterValue, comparator); @@ -222,7 +221,7 @@ class ElMatchBuilder { /** * Between. */ - static class Between implements ElMatcher { + static final class Between implements ElMatcher { final Object min; final Object max; @@ -236,7 +235,6 @@ class ElMatchBuilder { @Override public boolean isMatch(T value) { - return (comparator.compareValue(min, value) <= 0 && comparator.compareValue(max, value) >= 0); } @@ -245,7 +243,7 @@ class ElMatchBuilder { /** * Greater Than. */ - static class Gt extends Base { + static final class Gt extends Base { Gt(Object filterValue, ElComparator comparator) { super(filterValue, comparator); } @@ -259,7 +257,7 @@ class ElMatchBuilder { /** * Greater Than or Equal To. */ - static class Ge extends Base { + static final class Ge extends Base { Ge(Object filterValue, ElComparator comparator) { super(filterValue, comparator); } @@ -273,7 +271,7 @@ class ElMatchBuilder { /** * Less Than or Equal To. */ - static class Le extends Base { + static final class Le extends Base { Le(Object filterValue, ElComparator comparator) { super(filterValue, comparator); } @@ -287,7 +285,7 @@ class ElMatchBuilder { /** * Less Than. */ - static class Lt extends Base { + static final class Lt extends Base { Lt(Object filterValue, ElComparator comparator) { super(filterValue, comparator); } 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 2effb1703..16d0e3808 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 @@ -22,30 +22,22 @@ import java.util.Arrays; * no further processing of the chain occurs. *

*/ -public class ElPropertyChain implements ElPropertyValue { +public final class ElPropertyChain implements ElPropertyValue { private final String prefix; - private final String placeHolder; private final String placeHolderEncrypted; - private final String name; - private final String expression; - private final boolean containsMany; - private final ElPropertyValue[] chain; - private final boolean assocId; private final int last; private final BeanProperty lastBeanProperty; private final ScalarType scalarType; - private final ElPropertyValue lastElPropertyValue; public ElPropertyChain(boolean containsMany, boolean embedded, String expression, ElPropertyValue[] chain) { - this.containsMany = containsMany; this.chain = chain; this.expression = expression; @@ -119,15 +111,12 @@ public class ElPropertyChain implements ElPropertyValue { if (!expression.startsWith(sinceProperty)) { return containsMany; } - int i = 1 + SplitName.count(sinceProperty); - for (; i < chain.length; i++) { if (chain[i].getBeanProperty().containsMany()) { return true; } } - return false; } @@ -281,7 +270,6 @@ public class ElPropertyChain implements ElPropertyValue { @Override public Object pathGetNested(Object bean) { - Object prevBean = bean; for (int i = 0; i < last; i++) { // always return non null prevBean @@ -293,7 +281,6 @@ public class ElPropertyChain implements ElPropertyValue { @Override public void pathSet(Object bean, Object value) { - Object prevBean = bean; for (int i = 0; i < last; i++) { prevBean = chain[i].pathGetNested(prevBean); @@ -310,5 +297,4 @@ public class ElPropertyChain implements ElPropertyValue { } } - } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java index 93b17b708..fd69bdd9c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java @@ -13,14 +13,11 @@ import java.util.List; * order.customer.name. *

*/ -public class ElPropertyChainBuilder { +public final class ElPropertyChainBuilder { private final String expression; - private final List chain = new ArrayList<>(); - private boolean embedded; - private boolean containsMany; /** 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 3bdf15777..983800061 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 @@ -15,9 +15,7 @@ public final class DaemonScheduleThreadPool extends ScheduledThreadPoolExecutor private static final Logger logger = LoggerFactory.getLogger(DaemonScheduleThreadPool.class); private final ReentrantLock lock = new ReentrantLock(); - private final String namePrefix; - private final int shutdownWaitSeconds; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonThreadFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonThreadFactory.java index d1bbf3ee1..c2e14195b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonThreadFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/executor/DaemonThreadFactory.java @@ -13,10 +13,9 @@ import java.util.concurrent.atomic.AtomicInteger; * on shutdown or register with the JVM shutdown hook to perform a nice shutdown * of the daemon threads etc. */ -public class DaemonThreadFactory implements ThreadFactory { +public final class DaemonThreadFactory implements ThreadFactory { private final AtomicInteger threadNumber = new AtomicInteger(1); - private final String namePrefix; public DaemonThreadFactory(String namePrefix) { 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 28bb50765..305da21ca 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 @@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit; /** * The default implementation of the BackgroundExecutor. */ -public class DefaultBackgroundExecutor implements SpiBackgroundExecutor { +public final class DefaultBackgroundExecutor implements SpiBackgroundExecutor { private final ScheduledExecutorService executor; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractExpression.java index c3090e38f..f3c9d5aae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractExpression.java @@ -14,7 +14,7 @@ import io.ebeaninternal.api.NaturalKeyQueryData; /** * Base class for simple expressions. */ -public abstract class AbstractExpression implements SpiExpression { +abstract class AbstractExpression implements SpiExpression { protected String propName; @@ -66,7 +66,6 @@ public abstract class AbstractExpression implements SpiExpression { @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - propertyContainsMany(propName, desc, manyWhereJoin); } @@ -103,7 +102,6 @@ public abstract class AbstractExpression implements SpiExpression { } protected final ElPropertyValue getElProp(SpiExpressionRequest request) { - return request.getBeanDescriptor().getElGetValue(propName); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java index d30649149..272e557d7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -9,7 +10,7 @@ import io.ebeaninternal.api.SpiExpressionRequest; * This means they can not be part of a SQL query nor do they use the built in query plan cache etc. *

*/ -public abstract class AbstractTextExpression extends AbstractExpression { +abstract class AbstractTextExpression extends AbstractExpression { AbstractTextExpression(String propName) { super(propName); @@ -37,9 +38,9 @@ public abstract class AbstractTextExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return 0; - } + public void queryBindKey(BindValuesKey key) { + // do nothing, only execute against document store + }; @Override public boolean isSameByBind(SpiExpression other) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java index 7adb2729b..a758dcd10 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression; /** * Abstract expression that helps with named parameter use. */ -public abstract class AbstractValueExpression extends AbstractExpression { +abstract class AbstractValueExpression extends AbstractExpression { protected final Object bindValue; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java index 5a931ec5a..fafb3bc96 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -12,7 +13,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -class AllEqualsExpression extends NonPrepareExpression { +final class AllEqualsExpression extends NonPrepareExpression { private final Map propMap; @@ -20,7 +21,7 @@ class AllEqualsExpression extends NonPrepareExpression { this.propMap = propMap; } - protected String name(String propName) { + String name(String propName) { return propName; } @@ -55,7 +56,6 @@ class AllEqualsExpression extends NonPrepareExpression { @Override public void addBindValues(SpiExpressionRequest request) { - if (propMap.isEmpty()) { return; } @@ -69,23 +69,17 @@ class AllEqualsExpression extends NonPrepareExpression { @Override public void addSql(SpiExpressionRequest request) { - if (propMap.isEmpty()) { return; } - request.append("("); - int count = 0; for (Map.Entry entry : propMap.entrySet()) { - Object value = entry.getValue(); String propName = entry.getKey(); - if (count > 0) { request.append("and "); } - request.append(name(propName)); if (value == null) { request.append(" is null "); @@ -105,7 +99,6 @@ class AllEqualsExpression extends NonPrepareExpression { */ @Override public void queryPlanHash(StringBuilder builder) { - builder.append("AllEquals["); for (Entry entry : propMap.entrySet()) { Object value = entry.getValue(); @@ -122,14 +115,11 @@ class AllEqualsExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - - int hc = 92821; + public void queryBindKey(BindValuesKey key) { + key.add(propMap.size()); for (Object value : propMap.values()) { - hc = hc * 92821 + (value == null ? 0 : value.hashCode()); + key.add(value); } - - return hc; } @Override @@ -137,20 +127,16 @@ class AllEqualsExpression extends NonPrepareExpression { if (!(other instanceof AllEqualsExpression)) { return false; } - AllEqualsExpression that = (AllEqualsExpression) other; return isSameByValue(that, true); } private boolean isSameByValue(AllEqualsExpression that, boolean byValue) { - if (propMap.size() != that.propMap.size()) { return false; } - Iterator> thisIt = propMap.entrySet().iterator(); Iterator> thatIt = that.propMap.entrySet().iterator(); - while (thisIt.hasNext() && thatIt.hasNext()) { Entry thisNext = thisIt.next(); Entry thatNext = thatIt.next(); @@ -162,7 +148,6 @@ class AllEqualsExpression extends NonPrepareExpression { return false; } } - return true; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java index 8c12bec60..34fec6037 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -8,10 +9,9 @@ import java.io.IOException; /** * Contains expression for ARRAY type. */ -public class ArrayContainsExpression extends AbstractExpression { +final class ArrayContainsExpression extends AbstractExpression { private final boolean contains; - private final Object[] values; ArrayContainsExpression(String propName, boolean contains, Object... values) { @@ -25,7 +25,6 @@ public class ArrayContainsExpression extends AbstractExpression { @Override public void writeDocQuery(DocQueryContext context) throws IOException { - if (values.length == 1) { context.writeEqualTo(propName, values[0]); } else { @@ -49,12 +48,11 @@ public class ArrayContainsExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = values[0].hashCode(); - for (int i = 1; i < values.length; i++) { - hc = hc * 92821 + values[i].hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(values.length); + for (Object value : values) { + key.add(value); } - return hc; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java index 815223dfe..2234f9500 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -8,7 +9,7 @@ import java.io.IOException; /** * IsEmpty expression for ARRAY type. */ -public class ArrayIsEmptyExpression extends AbstractExpression { +final class ArrayIsEmptyExpression extends AbstractExpression { private final boolean empty; @@ -33,8 +34,8 @@ public class ArrayIsEmptyExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return empty ? 0 : 92821; + public void queryBindKey(BindValuesKey key) { + key.add(empty); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java index bfdfa1d52..be113e7a5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java @@ -1,16 +1,16 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import java.io.IOException; -class BetweenExpression extends AbstractExpression { +final class BetweenExpression extends AbstractExpression { private static final String _BETWEEN = " between ? and ?"; private final Object valueHigh; - private final Object valueLow; BetweenExpression(String propertyName, Object valueLow, Object valueHigh) { @@ -49,10 +49,8 @@ class BetweenExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = low().hashCode(); - hc = hc * 92821 + high().hashCode(); - return hc; + public void queryBindKey(BindValuesKey key) { + key.add(low()).add(high()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java index a50ec888f..74129849d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -13,7 +14,7 @@ import java.io.IOException; /** * Between expression where a value is between two properties. */ -class BetweenPropertyExpression extends NonPrepareExpression { +final class BetweenPropertyExpression extends NonPrepareExpression { private static final String BETWEEN = " between "; @@ -33,7 +34,7 @@ class BetweenPropertyExpression extends NonPrepareExpression { this.highProperty = path + "." + highProperty; } - protected String name(String propName) { + String name(String propName) { return propName; } @@ -61,12 +62,10 @@ class BetweenPropertyExpression extends NonPrepareExpression { @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - ElPropertyDeploy elProp = desc.getElPropertyDeploy(name(lowProperty)); if (elProp != null && elProp.containsMany()) { manyWhereJoin.add(elProp); } - elProp = desc.getElPropertyDeploy(name(highProperty)); if (elProp != null && elProp.containsMany()) { manyWhereJoin.add(elProp); @@ -95,8 +94,8 @@ class BetweenPropertyExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - return val().hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(val()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java index 073ee51df..aa68f2662 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -8,14 +9,11 @@ import java.io.IOException; /** * Bitwise expression. */ -class BitwiseExpression extends AbstractExpression { - - protected final BitwiseOp operator; +final class BitwiseExpression extends AbstractExpression { + private final BitwiseOp operator; private final String compare; - - protected final long flags; - + private final long flags; private final long match; BitwiseExpression(String propertyName, BitwiseOp operator, long flags, String compare, long match) { @@ -39,8 +37,8 @@ class BitwiseExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return Long.hashCode(flags); + public void queryBindKey(BindValuesKey key) { + key.add(flags).add(match); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java index 52e39fbfa..a8075090a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java @@ -1,12 +1,13 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class CaseInsensitiveEqualExpression extends AbstractValueExpression { +final class CaseInsensitiveEqualExpression extends AbstractValueExpression { private final boolean not; @@ -33,7 +34,6 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { @Override public void addBindValues(SpiExpressionRequest request) { - ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { // bind the key as well as the value @@ -46,7 +46,6 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { @Override public void addSql(SpiExpressionRequest request) { - String pname = propName; ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { @@ -69,8 +68,8 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return val().hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(val()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java index aade99f5a..ca97b5408 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java @@ -5,6 +5,7 @@ import io.ebean.LikeType; import io.ebean.bean.EntityBean; import io.ebean.event.BeanQueryRequest; import io.ebean.util.SplitName; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -38,7 +39,7 @@ import java.util.ArrayList; * * } */ -public class DefaultExampleExpression implements SpiExpression, ExampleExpression { +final class DefaultExampleExpression implements SpiExpression, ExampleExpression { /** * The example bean containing the properties. @@ -74,7 +75,7 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio * @param caseInsensitive if true use case insensitive expressions * @param likeType the type of Like wild card used */ - public DefaultExampleExpression(EntityBean entity, boolean caseInsensitive, LikeType likeType) { + DefaultExampleExpression(EntityBean entity, boolean caseInsensitive, LikeType likeType) { this.entity = entity; this.caseInsensitive = caseInsensitive; this.likeType = likeType; @@ -136,10 +137,8 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins whereManyJoins) { list = buildExpressions(desc); - if (list != null) { - for (SpiExpression aList : list) { - aList.containsMany(desc, whereManyJoins); - } + for (SpiExpression expr : list) { + expr.containsMany(desc, whereManyJoins); } } @@ -186,8 +185,8 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio @Override public void validate(SpiExpressionValidation validation) { - for (SpiExpression aList : list) { - aList.validate(validation); + for (SpiExpression expr : list) { + expr.validate(validation); } } @@ -228,25 +227,20 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio */ @Override public void queryPlanHash(StringBuilder builder) { - builder.append("Example["); - for (SpiExpression aList : list) { - aList.queryPlanHash(builder); + for (SpiExpression expr : list) { + expr.queryPlanHash(builder); builder.append(","); } builder.append("]"); } - /** - * Return a hash for the actual bind values used. - */ @Override - public int queryBindHash() { - int hc = DefaultExampleExpression.class.getName().hashCode(); - for (SpiExpression aList : list) { - hc = hc * 92821 + aList.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + key.add(list.size()); + for (SpiExpression expr : list) { + expr.queryBindKey(key); } - return hc; } @Override @@ -267,7 +261,6 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio * Build the List of expressions. */ private ArrayList buildExpressions(BeanDescriptor beanDescriptor) { - ArrayList list = new ArrayList<>(); addExpressions(list, beanDescriptor, entity, null); return list; 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 ab80ae9e5..b9693df6d 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 @@ -26,6 +26,7 @@ import io.ebean.search.MultiMatch; import io.ebean.search.TextCommonTerms; import io.ebean.search.TextQueryString; import io.ebean.search.TextSimple; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -55,15 +56,10 @@ public class DefaultExpressionList implements SpiExpressionList { private static final String AND = " and "; protected List list; - protected final Query query; - private final ExpressionList parentExprList; - protected final ExpressionFactory expr; - String allDocNestedPath; - /** * Set to true for the "Text" root expression list. */ @@ -109,10 +105,8 @@ public class DefaultExpressionList implements SpiExpressionList { * @return A single SpiExpression that has the nestedPath set */ SpiExpression wrap(List list, String nestedPath, Junction.Type type) { - DefaultExpressionList wrapper = new DefaultExpressionList<>(query, expr, null, list, false); wrapper.setAllDocNested(nestedPath); - if (type != null) { return new JunctionExpression<>(type, wrapper); } else { @@ -121,15 +115,15 @@ public class DefaultExpressionList implements SpiExpressionList { } void simplifyEntries() { - for (SpiExpression element : list) { - element.simplify(); + for (SpiExpression expr : list) { + expr.simplify(); } } @Override public void prefixProperty(String path) { - for (SpiExpression exp : list) { - exp.prefixProperty(path); + for (SpiExpression expr : list) { + expr.prefixProperty(path); } } @@ -174,7 +168,6 @@ public class DefaultExpressionList implements SpiExpressionList { context.startNested(allDocNestedPath); } int size = list.size(); - SpiExpression first = list.get(0); boolean explicitBool = first instanceof SpiJunction; boolean implicitBool = !explicitBool && size > 1; @@ -210,7 +203,6 @@ public class DefaultExpressionList implements SpiExpressionList { @Override public void writeDocQuery(DocQueryContext context, SpiExpression idEquals) throws IOException { - if (allDocNestedPath != null) { context.startNested(allDocNestedPath); } @@ -227,8 +219,8 @@ public class DefaultExpressionList implements SpiExpressionList { if (idEquals != null) { idEquals.writeDocQuery(context); } - for (SpiExpression aList : list) { - aList.writeDocQuery(context); + for (SpiExpression expr : list) { + expr.writeDocQuery(context); } context.endBool(); } @@ -278,16 +270,15 @@ public class DefaultExpressionList implements SpiExpressionList { */ @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins whereManyJoins) { - - for (SpiExpression aList : list) { - aList.containsMany(desc, whereManyJoins); + for (SpiExpression expr : list) { + expr.containsMany(desc, whereManyJoins); } } @Override public void validate(SpiExpressionValidation validation) { - for (SpiExpression aList : list) { - aList.validate(validation); + for (SpiExpression expr : list) { + expr.validate(validation); } } @@ -630,7 +621,6 @@ public class DefaultExpressionList implements SpiExpressionList { @Override public void addSql(SpiExpressionRequest request) { - for (int i = 0, size = list.size(); i < size; i++) { SpiExpression expression = list.get(i); if (i > 0) { @@ -642,15 +632,15 @@ public class DefaultExpressionList implements SpiExpressionList { @Override public void addBindValues(SpiExpressionRequest request) { - for (SpiExpression aList : list) { - aList.addBindValues(request); + for (SpiExpression expr : list) { + expr.addBindValues(request); } } @Override public void prepareExpression(BeanQueryRequest request) { - for (SpiExpression aList : list) { - aList.prepareExpression(request); + for (SpiExpression expr : list) { + expr.prepareExpression(request); } } @@ -667,23 +657,19 @@ public class DefaultExpressionList implements SpiExpressionList { if (allDocNestedPath != null) { builder.append("path:").append(allDocNestedPath).append(" "); } - for (SpiExpression aList : list) { - aList.queryPlanHash(builder); + for (SpiExpression expr : list) { + expr.queryPlanHash(builder); builder.append(","); } builder.append("]"); } - /** - * Calculate a hash based on the expressions. - */ @Override - public int queryBindHash() { - int hash = DefaultExpressionList.class.getName().hashCode(); - for (SpiExpression aList : list) { - hash = hash * 92821 + aList.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + key.add(list.size()); + for (SpiExpression expr : list) { + expr.queryBindKey(key); } - return hash; } @Override 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 557c53996..09ff401af 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 @@ -13,26 +13,17 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -public class DefaultExpressionRequest implements SpiExpressionRequest { +public final class DefaultExpressionRequest implements SpiExpressionRequest { private final SpiOrmQueryRequest queryRequest; - private final BeanDescriptor beanDescriptor; - private final StringBuilder sql = new StringBuilder(); - private final List bindValues = new ArrayList<>(); - private final DeployParser deployParser; - private final Binder binder; - private final SpiExpressionList expressionList; - private int paramIndex; - private final boolean enableBindLog; - private StringBuilder bindLog; public DefaultExpressionRequest(SpiOrmQueryRequest queryRequest, DeployParser deployParser, Binder binder, SpiExpressionList expressionList) { 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 32ae2bccc..438f1a2d5 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 @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiEbeanServer; @@ -8,21 +9,19 @@ import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.api.SpiExpressionValidation; import io.ebeaninternal.api.SpiQuery; +import io.ebeaninternal.api.SpiQuery.Type; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.query.CQuery; import java.io.IOException; import java.util.List; -class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpression { +final class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpression { - protected final boolean not; - - protected final SpiQuery subQuery; - - protected List bindParams; - - protected String sql; + private final boolean not; + private final SpiQuery subQuery; + private List bindParams; + private String sql; ExistsQueryExpression(SpiQuery subQuery, boolean not) { this.subQuery = subQuery; @@ -65,7 +64,6 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress @Override public void prepareExpression(BeanQueryRequest request) { - CQuery subQuery = compileSubQuery(request); this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); this.sql = subQuery.getGeneratedSql().replace('\n', ' '); @@ -81,7 +79,7 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress */ protected CQuery compileSubQuery(BeanQueryRequest queryRequest) { SpiEbeanServer ebeanServer = (SpiEbeanServer) queryRequest.getEbeanServer(); - return ebeanServer.compileQuery(subQuery, queryRequest.getTransaction()); + return ebeanServer.compileQuery(Type.SQ_EXISTS, subQuery, queryRequest.getTransaction()); } @Override @@ -91,13 +89,12 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress } @Override - public int queryBindHash() { - return subQuery.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + subQuery.queryBindKey(key); } @Override public void addSql(SpiExpressionRequest request) { - if (not) { request.append(" not"); } @@ -108,7 +105,6 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress @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/FilterExprPath.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java index d7b04de44..5765c7e43 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java @@ -9,7 +9,7 @@ import java.io.Serializable; * query that includes the filterMany. *

*/ -public class FilterExprPath implements Serializable { +public final class FilterExprPath implements Serializable { private static final long serialVersionUID = -6420905565372842018L; 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 b6b1874a8..0e8d4ba0b 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 @@ -18,14 +18,12 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -public class FilterExpressionList extends DefaultExpressionList { +public final class FilterExpressionList extends DefaultExpressionList { private static final String notAllowedMessage = "This method is not allowed on a filter"; private final Query rootQuery; - private final FilterExprPath pathPrefix; - private int firstRow; private int maxRows; private String orderByClause; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java index b5280b868..c61f884a4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -11,7 +12,7 @@ import java.io.IOException; /** * Slightly redundant as Query.setId() ultimately also does the same job. */ -class IdExpression extends NonPrepareExpression implements SpiExpression { +final class IdExpression extends NonPrepareExpression implements SpiExpression { private final Object value; @@ -77,8 +78,8 @@ class IdExpression extends NonPrepareExpression implements SpiExpression { } @Override - public int queryBindHash() { - return value.hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(value); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java index 4c08b24d2..c1bd76db0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -19,10 +20,9 @@ import java.util.Set; /** * In a collection of Id values. */ -public class IdInExpression extends NonPrepareExpression { +public final class IdInExpression extends NonPrepareExpression { private final List idCollection; - private boolean multiValueIdSupported; public IdInExpression(Collection idCollection) { @@ -133,8 +133,11 @@ public class IdInExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - return idCollection.hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(idCollection.size()); + for (Object elem : idCollection) { + key.add(elem); + } } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java index 7009a8b44..1a84d87eb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.bean.EntityBean; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -15,7 +16,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -class InExpression extends AbstractExpression { +final class InExpression extends AbstractExpression { private final boolean not; @@ -176,12 +177,11 @@ class InExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = 92821; + public void queryBindKey(BindValuesKey key) { + key.add(bindValues.size()); for (Object bindValue : bindValues) { - hc = 92821 * hc + bindValue.hashCode(); + key.add(bindValue); } - return hc; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java index 96cc7c182..b5533b7ad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Pairs; import io.ebean.Pairs.Entry; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -12,20 +13,14 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -class InPairsExpression extends AbstractExpression { +final class InPairsExpression extends AbstractExpression { private final boolean not; - private final String property0, property1; - private List entries; - private boolean multiValueSupported; - private final String separator; - private final String suffix; - private List concatBindValues; InPairsExpression(Pairs pairs, boolean not) { @@ -124,12 +119,11 @@ class InPairsExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = 92821; + public void queryBindKey(BindValuesKey key) { + key.add(entries.size()); for (Pairs.Entry entry : entries) { - hc = 92821 * hc + entry.hashCode(); + key.add(entry.getA()).add(entry.getB()); } - return hc; } @Override 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 83507af4b..e53792550 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 @@ -1,10 +1,12 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.api.SpiQuery; +import io.ebeaninternal.api.SpiQuery.Type; import io.ebeaninternal.server.query.CQuery; import java.io.IOException; @@ -13,14 +15,11 @@ import java.util.List; /** * In expression using a sub query. */ -class InQueryExpression extends AbstractExpression implements UnsupportedDocStoreExpression { +final class InQueryExpression extends AbstractExpression implements UnsupportedDocStoreExpression { private final boolean not; - private final SpiQuery subQuery; - private List bindParams; - private String sql; InQueryExpression(String propertyName, SpiQuery subQuery, boolean not) { @@ -68,12 +67,12 @@ class InQueryExpression extends AbstractExpression implements UnsupportedDocStor private CQuery compileSubQuery(BeanQueryRequest queryRequest) { SpiEbeanServer ebeanServer = (SpiEbeanServer) queryRequest.getEbeanServer(); - return ebeanServer.compileQuery(subQuery, queryRequest.getTransaction()); + return ebeanServer.compileQuery(Type.SQ_IN, subQuery, queryRequest.getTransaction()); } @Override - public int queryBindHash() { - return subQuery.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + subQuery.queryBindKey(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java index e1d170b43..8bcdb12a8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java @@ -1,14 +1,14 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import java.io.IOException; -class InRangeExpression extends AbstractExpression { +final class InRangeExpression extends AbstractExpression { private final Object valueHigh; - private final Object valueLow; InRangeExpression(String propertyName, Object valueLow, Object valueHigh) { @@ -47,10 +47,8 @@ class InRangeExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = low().hashCode(); - hc = hc * 92821 + high().hashCode(); - return hc; + public void queryBindKey(BindValuesKey key) { + key.add(low()).add(high()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java index d3a3a1da6..fc3be3e34 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -9,12 +10,10 @@ import io.ebean.util.SplitName; import java.io.IOException; -class IsEmptyExpression extends AbstractExpression { +final class IsEmptyExpression extends AbstractExpression { private final boolean empty; - private final String propertyPath; - private String nestedPath; IsEmptyExpression(String propertyName, boolean empty) { @@ -103,8 +102,8 @@ class IsEmptyExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return 1; + public void queryBindKey(BindValuesKey key) { + // no bind values } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java index f60b125cb..a6e8f128b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -15,27 +16,27 @@ import java.util.Objects; * The value passed in is expected to be a valid JSON type so string, number, boolean. *

*/ -class JsonPathExpression extends AbstractExpression { +final class JsonPathExpression extends AbstractExpression { /** * The path in the JSON document in dot notation form. */ - protected final String path; + private final String path; /** * The expression operator. */ - protected final Op operator; + private final Op operator; /** * The bind value used to compare against the document path value. */ - protected final Object value; + private final Object value; /** * For Between this is the upper bind value. */ - protected final Object upperValue; + private final Object upperValue; /** * Construct for Operator (not BETWEEN though). @@ -83,10 +84,8 @@ class JsonPathExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = (value == null) ? 0 : value.hashCode(); - hc = (upperValue == null) ? hc : hc * 92821 + upperValue.hashCode(); - return hc; + public void queryBindKey(BindValuesKey key) { + key.add(value).add(upperValue); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index 0aae30886..a408b5e74 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -25,6 +25,7 @@ import io.ebean.search.MultiMatch; import io.ebean.search.TextCommonTerms; import io.ebean.search.TextQueryString; import io.ebean.search.TextSimple; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -47,11 +48,10 @@ import java.util.function.Predicate; /** * Junction implementation. */ -class JunctionExpression implements SpiJunction, SpiExpression, ExpressionList { +final class JunctionExpression implements SpiJunction, SpiExpression, ExpressionList { - protected DefaultExpressionList exprList; - - protected Junction.Type type; + DefaultExpressionList exprList; + Junction.Type type; JunctionExpression(Junction.Type type, Query query, ExpressionList parent) { this.type = type; @@ -113,9 +113,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void writeDocQuery(DocQueryContext context) throws IOException { context.startBool(type); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.writeDocQuery(context); + for (SpiExpression expr : exprList.internalList()) { + expr.writeDocQuery(context); } context.endBool(); } @@ -123,9 +122,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void writeDocQueryJunction(DocQueryContext context) throws IOException { context.startBoolGroupList(type); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.writeDocQuery(context); + for (SpiExpression expr : exprList.internalList()) { + expr.writeDocQuery(context); } context.endBoolGroupList(); } @@ -138,18 +136,15 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - List list = exprList.internalList(); - // get the current state for 'require outer joins' boolean parentOuterJoins = manyWhereJoin.isRequireOuterJoins(); if (type == Type.OR) { // turn on outer joins required for disjunction expressions manyWhereJoin.setRequireOuterJoins(true); } - - for (SpiExpression aList : list) { - aList.containsMany(desc, manyWhereJoin); + for (SpiExpression expr : list) { + expr.containsMany(desc, manyWhereJoin); } if (type == Type.OR && !parentOuterJoins) { // restore state to not forcing outer joins @@ -176,18 +171,14 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void addBindValues(SpiExpressionRequest request) { - - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.addBindValues(request); + for (SpiExpression expr : exprList.internalList()) { + expr.addBindValues(request); } } @Override public void addSql(SpiExpressionRequest request) { - List list = exprList.internalList(); - if (!list.isEmpty()) { request.append(type.prefix()); request.append("("); @@ -204,9 +195,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void prepareExpression(BeanQueryRequest request) { - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.prepareExpression(request); + for (SpiExpression expr : exprList.internalList()) { + expr.prepareExpression(request); } } @@ -216,22 +206,18 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void queryPlanHash(StringBuilder builder) { builder.append(type).append("["); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.queryPlanHash(builder); + for (SpiExpression expr : exprList.internalList()) { + expr.queryPlanHash(builder); builder.append(","); } builder.append("]"); } @Override - public int queryBindHash() { - int hc = JunctionExpression.class.getName().hashCode(); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - hc = hc * 92821 + aList.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + for (SpiExpression expr : exprList.internalList()) { + expr.queryBindKey(key); } - return hc; } @Override @@ -275,7 +261,6 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.textCommonTerms(search, options); } - @Override public ExpressionList allEq(Map propertyMap) { return exprList.allEq(propertyMap); @@ -1025,7 +1010,6 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public String nestedPath(BeanDescriptor desc) { - PrepareDocNested.prepare(exprList, desc, type); String nestedPath = exprList.allDocNestedPath; if (nestedPath != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java index 6886203c4..bf3871c23 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java @@ -1,16 +1,16 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class LikeExpression extends AbstractValueExpression { +final class LikeExpression extends AbstractValueExpression { private final boolean caseInsensitive; - private final LikeType type; LikeExpression(String propertyName, Object value, boolean caseInsensitive, LikeType type) { @@ -26,7 +26,6 @@ class LikeExpression extends AbstractValueExpression { @Override public void addBindValues(SpiExpressionRequest request) { - ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { // bind the key as well as the value @@ -39,7 +38,6 @@ class LikeExpression extends AbstractValueExpression { @Override public void addSql(SpiExpressionRequest request) { - String pname = propName; ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { @@ -70,8 +68,8 @@ class LikeExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return strValue().hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(strValue()); } @Override @@ -97,7 +95,6 @@ class LikeExpression extends AbstractValueExpression { return "%" + value + "%"; case EQUAL_TO: return value; - default: throw new RuntimeException("LikeType " + type + " missed?"); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java index 482aac6e8..b0ef74f03 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Expression; import io.ebean.Junction; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -20,7 +21,7 @@ abstract class LogicExpression implements SpiExpression { static final String AND = " and "; static final String OR = " or "; - static class And extends LogicExpression { + static final class And extends LogicExpression { And(Expression expOne, Expression expTwo) { super(true, expOne, expTwo); @@ -33,7 +34,7 @@ abstract class LogicExpression implements SpiExpression { } - static class Or extends LogicExpression { + static final class Or extends LogicExpression { Or(Expression expOne, Expression expTwo) { super(false, expOne, expTwo); @@ -46,9 +47,7 @@ abstract class LogicExpression implements SpiExpression { } SpiExpression expOne; - SpiExpression expTwo; - private final boolean conjunction; LogicExpression(boolean conjunction, Expression expOne, Expression expTwo) { @@ -168,10 +167,8 @@ abstract class LogicExpression implements SpiExpression { } @Override - public int queryBindHash() { - int hc = expOne.queryBindHash(); - hc = hc * 92821 + expTwo.queryBindHash(); - return hc; + public void queryBindKey(BindValuesKey key) { + key.add(expOne).add(expTwo); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java index 5487cffbf..3a56ec7de 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java @@ -8,7 +8,7 @@ import java.util.List; /** * Helper for evaluating named parameters. */ -class NamedParamHelp { +final class NamedParamHelp { /** * Return the bind value taking into account named parameters. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java index c3376f656..110442365 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java @@ -1,13 +1,14 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class NativeILikeExpression extends AbstractExpression { +final class NativeILikeExpression extends AbstractExpression { private final String val; @@ -54,8 +55,8 @@ class NativeILikeExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return val.hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(val); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java index 77f46828b..0bb63f1ed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -13,11 +14,10 @@ import java.io.IOException; /** * Wraps a single expression with nestedPath for document queries. */ -class NestedPathWrapperExpression implements SpiExpression { +final class NestedPathWrapperExpression implements SpiExpression { - protected final String nestedPath; - - protected final SpiExpression delegate; + final String nestedPath; + final SpiExpression delegate; NestedPathWrapperExpression(String nestedPath, SpiExpression delegate) { this.nestedPath = nestedPath; @@ -79,8 +79,8 @@ class NestedPathWrapperExpression implements SpiExpression { } @Override - public int queryBindHash() { - return delegate.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + delegate.queryBindKey(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java index 28c9e3c78..079f26874 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -13,9 +14,9 @@ import java.io.IOException; /** * Effectively an expression that has no effect. */ -class NoopExpression implements SpiExpression { +final class NoopExpression implements SpiExpression { - protected static final NoopExpression INSTANCE = new NoopExpression(); + static final NoopExpression INSTANCE = new NoopExpression(); @Override public void prefixProperty(String path) { @@ -74,9 +75,8 @@ class NoopExpression implements SpiExpression { } @Override - public int queryBindHash() { + public void queryBindKey(BindValuesKey key) { // no bind values - return 0; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java index 60ade47b0..462e60d9e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -99,8 +100,8 @@ final class NotExpression implements SpiExpression { } @Override - public int queryBindHash() { - return exp.queryBindHash(); + public void queryBindKey(BindValuesKey key) { + exp.queryBindKey(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java index 90894dbde..4a4a81201 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -16,14 +17,11 @@ import java.io.IOException; * Note that for OneToMany/ManyToMany this effectively gets translated into isEmpty()/isNotEmpty(). *

*/ -class NullExpression extends AbstractExpression { +final class NullExpression extends AbstractExpression { private final boolean notNull; - private ElPropertyValue elProperty; - private boolean assocMany; - private String propertyPath; NullExpression(String propertyName, boolean notNull) { @@ -94,7 +92,7 @@ class NullExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return (notNull ? 1 : 0); + public void queryBindKey(BindValuesKey key) { + key.add(notNull); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/PrepareDocNested.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/PrepareDocNested.java index ebc2d794b..8f1f48d38 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/PrepareDocNested.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/PrepareDocNested.java @@ -13,7 +13,7 @@ import java.util.Map; /** * Prepare nested path expressions for */ -class PrepareDocNested { +final class PrepareDocNested { /** * Prepare the top level expressions for nested path handling. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java index 295ddc75b..53571cad7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -10,10 +11,9 @@ import io.ebeaninternal.server.persist.MultiValueWrapper; import java.io.IOException; import java.util.Collection; -class RawExpression extends NonPrepareExpression { +final class RawExpression extends NonPrepareExpression { final String sql; - final Object[] values; RawExpression(String sql, Object[] values) { @@ -73,12 +73,11 @@ class RawExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - int hc = sql.hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(values.length); for (Object value : values) { - hc = hc * 92821 + value.hashCode(); + key.add(value); } - return hc; } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpressionBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpressionBuilder.java index 73a4da911..40aa47271 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpressionBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpressionBuilder.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -class RawExpressionBuilder { +final class RawExpressionBuilder { private static final String BP_1 = "?1"; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/Same.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/Same.java index 931e3e3e3..104d27969 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/Same.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/Same.java @@ -7,26 +7,26 @@ import java.util.Objects; /** * Utility to help isSame methods. */ -public class Same { +final class Same { /** * Return true if both values are null or both an not null. */ - public static boolean sameByNull(Object v1, Object v2) { + static boolean sameByNull(Object v1, Object v2) { return (v1 == null) == (v2 == null); } /** * Null safe equals check. */ - public static boolean sameByValue(Object v1, Object v2) { + static boolean sameByValue(Object v1, Object v2) { return Objects.equals(v1, v2); } /** * Return true if both collections are the same by value and order is taken into account. */ - public static boolean sameByValue(Collection v1, Collection v2) { + static boolean sameByValue(Collection v1, Collection v2) { if (v1 == null) { return v2 == null; } @@ -46,8 +46,7 @@ public class Same { /** * Null safe check by sameByValue or sameByNull based on byValue. */ - public static boolean sameBy(boolean byValue, Object value, Object value1) { - + static boolean sameBy(boolean byValue, Object value, Object value1) { if (byValue) { return sameByValue(value, value1); } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java index 0f8de90ec..87b0ed3bf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java @@ -5,12 +5,13 @@ import io.ebean.plugin.ExpressionPath; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import java.io.IOException; import java.util.Arrays; -public class SimpleExpression extends AbstractValueExpression { +public final class SimpleExpression extends AbstractValueExpression { private final Op type; @@ -121,8 +122,8 @@ public class SimpleExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return value().hashCode(); + public void queryBindKey(BindValuesKey key) { + key.add(value()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextCommonTermsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextCommonTermsExpression.java index 8cc5fb5bb..3f289edb5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextCommonTermsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextCommonTermsExpression.java @@ -7,10 +7,9 @@ import java.io.IOException; /** * Full text common terms expression. */ -class TextCommonTermsExpression extends AbstractTextExpression { +final class TextCommonTermsExpression extends AbstractTextExpression { private final String search; - private final TextCommonTerms options; public TextCommonTermsExpression(String search, TextCommonTerms options) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMatchExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMatchExpression.java index d36f491b7..f7cb06e6a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMatchExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMatchExpression.java @@ -7,13 +7,12 @@ import java.io.IOException; /** * Full text MATCH expression. */ -public class TextMatchExpression extends AbstractTextExpression { +final class TextMatchExpression extends AbstractTextExpression { private final String search; - private final Match options; - public TextMatchExpression(String propertyName, String search, Match options) { + TextMatchExpression(String propertyName, String search, Match options) { super(propertyName); this.search = search; this.options = options; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMultiMatchExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMultiMatchExpression.java index e51538e9f..f9fe1e909 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMultiMatchExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextMultiMatchExpression.java @@ -7,13 +7,12 @@ import java.io.IOException; /** * Full text Multi-Match expression. */ -public class TextMultiMatchExpression extends AbstractTextExpression { +final class TextMultiMatchExpression extends AbstractTextExpression { private final String search; - private final MultiMatch options; - public TextMultiMatchExpression(String search, MultiMatch options) { + TextMultiMatchExpression(String search, MultiMatch options) { super(null); this.search = search; this.options = options; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextQueryStringExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextQueryStringExpression.java index 2a44e39d5..dcd46a240 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextQueryStringExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextQueryStringExpression.java @@ -7,13 +7,12 @@ import java.io.IOException; /** * Full text query string expression. */ -class TextQueryStringExpression extends AbstractTextExpression { +final class TextQueryStringExpression extends AbstractTextExpression { private final String search; - private final TextQueryString options; - public TextQueryStringExpression(String search, TextQueryString options) { + TextQueryStringExpression(String search, TextQueryString options) { super(null); this.search = search; this.options = options; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextSimpleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextSimpleExpression.java index 9faa7d1a7..ec6702c2a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextSimpleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/TextSimpleExpression.java @@ -7,13 +7,12 @@ import java.io.IOException; /** * Full text Multi-Match expression. */ -class TextSimpleExpression extends AbstractTextExpression { +final class TextSimpleExpression extends AbstractTextExpression { private final String search; - private final TextSimple options; - public TextSimpleExpression(String search, TextSimple options) { + TextSimpleExpression(String search, TextSimple options) { super(null); this.search = search; this.options = options; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java index 2c85e7963..a8d4d6adc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java @@ -10,7 +10,6 @@ abstract class BaseDbExpression implements DbExpressionHandler { @Override public void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match) { - String bitOp = bitOp(operator); request.append("(").append(propName).append(" ").append(bitOp).append(" ? ").append(compare).append(" ?)"); } @@ -30,7 +29,6 @@ abstract class BaseDbExpression implements DbExpressionHandler { * Common alternative where the bitwise operation is a function (specifically bitand is used - H2 and Oracle). */ protected void bitwiseFunction(SpiExpressionRequest request, String propName, BitwiseOp operator, String compare) { - String funcName = functionName(operator); request.append(funcName).append("(").append(propName).append(", ?) ").append(compare).append(" ?"); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java index 8b5ab8d70..edecf8230 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.Op; /** * Not supported JSON or ARRAY expression handler. */ -public class BasicDbExpression extends BaseDbExpression { +class BasicDbExpression extends BaseDbExpression { @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { 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 c4b24fc84..6f773b270 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 @@ -4,13 +4,12 @@ import io.ebean.annotation.Platform; import io.ebean.config.dbplatform.DatabasePlatform; -public class DbExpressionHandlerFactory { +public final class DbExpressionHandlerFactory { /** * Create and return the appropriate platform specific handing of expressions. */ public static DbExpressionHandler from(DatabasePlatform databasePlatform) { - Platform platform = databasePlatform.getPlatform(); switch (platform) { case H2: diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java index 0c7e43b65..5eddb5d11 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.BitwiseOp; /** * H2 handling of platform specific expressions. */ -class H2DbExpression extends BasicDbExpression { +final class H2DbExpression extends BasicDbExpression { @Override public void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/HanaDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/HanaDbExpression.java index a6633edfa..43919c1a0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/HanaDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/HanaDbExpression.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.expression.Op; /** * HANA handling of platform specific expressions. */ -public class HanaDbExpression extends BaseDbExpression { +final class HanaDbExpression extends BaseDbExpression { @Override public void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MariaDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MariaDbExpression.java index 8e4c0be1d..8116b2c4e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MariaDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MariaDbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.Op; /** * MariaDB specific handling of platform specific expressions. */ -class MariaDbExpression extends BasicDbExpression { +final class MariaDbExpression extends BasicDbExpression { @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java index 8ea2595fe..b0721a44e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.Op; /** * MySql specific handling of platform specific expressions. */ -class MySqlDbExpression extends BasicDbExpression { +final class MySqlDbExpression extends BasicDbExpression { @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java index 3ec4b4071..f1fbaef7a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.expression.Op; /** * Oracle handling of platform specific expressions. ARRAY expressions not supported. */ -public class OracleDbExpression extends BaseDbExpression { +final class OracleDbExpression extends BaseDbExpression { @Override public String concat(String property0, String separator, String property1, String suffix) { @@ -16,7 +16,6 @@ public class OracleDbExpression extends BaseDbExpression { @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { - if (operator == Op.EXISTS) { request.append("json_exists(").append(propName).append(", '$.").append(path).append("')"); } else if (operator == Op.NOT_EXISTS) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresCast.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresCast.java index 3e833cb12..595acb6cd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresCast.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresCast.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression.platform; /** * Helper for determining type casting for JSON and ARRAY expressions. */ -public class PostgresCast { +final class PostgresCast { /** * Postgres CAST the type if necessary. @@ -11,15 +11,14 @@ public class PostgresCast { * This is generally necessary for JSON expressions as text values always returned from the json operators used. *

*/ - protected static String cast(Object value) { + static String cast(Object value) { return cast(value, false); } /** * Postgres CAST the type if necessary additionally specify if DB ARRAY is used. */ - protected static String cast(Object value, boolean asArray) { - + static String cast(Object value, boolean asArray) { if (value == null) { // for exists and not-exists expressions return ""; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java index 54270ee5c..a3f044072 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.Op; /** * Postgres JSON and ARRAY expression handler */ -public class PostgresDbExpression extends BaseDbExpression { +final class PostgresDbExpression extends BaseDbExpression { @Override public String concat(String property0, String separator, String property1, String suffix) { @@ -15,7 +15,6 @@ public class PostgresDbExpression extends BaseDbExpression { @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { - StringBuilder sb = new StringBuilder(50); String[] paths = path.split("\\."); if (paths.length == 1) { @@ -41,7 +40,6 @@ public class PostgresDbExpression extends BaseDbExpression { @Override public void arrayContains(SpiExpressionRequest request, String propName, boolean contains, Object... values) { - if (!contains) { request.append("not ("); } @@ -58,7 +56,6 @@ public class PostgresDbExpression extends BaseDbExpression { @Override public void arrayIsEmpty(SpiExpressionRequest request, String propName, boolean empty) { - request.append("coalesce(cardinality(").append(propName).append("),0)"); if (empty) { request.append(" = 0"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java index 98d76ec43..78838a81e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.expression.Op; /** * Microsoft SQL Server JSON. ARRAY expressions not supported. */ -public class SqlServerDbExpression extends BaseDbExpression { +final class SqlServerDbExpression extends BaseDbExpression { @Override public void json(final SpiExpressionRequest request, final String propName, diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadBeanContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadBeanContext.java index 25fffe5b7..ac871e5eb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadBeanContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadBeanContext.java @@ -23,12 +23,10 @@ import java.util.concurrent.locks.ReentrantLock; /** * ToOne bean load context. */ -class DLoadBeanContext extends DLoadBaseContext implements LoadBeanContext { +final class DLoadBeanContext extends DLoadBaseContext implements LoadBeanContext { private final boolean cache; - private List bufferList; - private LoadBuffer currentBuffer; DLoadBeanContext(DLoadContext parent, BeanDescriptor desc, String path, OrmQueryProperties queryProps) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadContext.java index 060633073..a7ec0e0c8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadContext.java @@ -31,17 +31,13 @@ import java.util.Map; /** * Default implementation of LoadContext. */ -public class DLoadContext implements LoadContext { +public final class DLoadContext implements LoadContext { private final SpiEbeanServer ebeanServer; - private final BeanDescriptor rootDescriptor; - private final Map beanMap = new HashMap<>(); private final Map manyMap = new HashMap<>(); - private final DLoadBeanContext rootBeanContext; - private final boolean asDraft; private final Timestamp asOf; private final Boolean readOnly; @@ -60,13 +56,9 @@ public class DLoadContext implements LoadContext { private final String planLabel; private final ProfileLocation profileLocation; private final ProfilingListener profilingListener; - private final Map nodePathMap = new HashMap<>(); - private PersistenceContext persistenceContext; - private List secQuery; - private Object tenantId; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java index 5d2b781c7..b830dc96d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/loadcontext/DLoadManyContext.java @@ -21,14 +21,11 @@ import java.util.concurrent.locks.ReentrantLock; /** * ToMany bean load context. */ -class DLoadManyContext extends DLoadBaseContext implements LoadManyContext { - - protected final BeanPropertyAssocMany property; +final class DLoadManyContext extends DLoadBaseContext implements LoadManyContext { + private final BeanPropertyAssocMany property; private final boolean docStoreMapped; - private List bufferList; - private LoadBuffer currentBuffer; DLoadManyContext(DLoadContext parent, BeanPropertyAssocMany property, String path, OrmQueryProperties queryProps) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java index 79ece19fc..31c42f2fd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/logger/DLogManager.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.logger; import io.ebeaninternal.api.SpiLogManager; import io.ebeaninternal.api.SpiLogger; -public class DLogManager implements SpiLogManager { +public final class DLogManager implements SpiLogManager { private final SpiLogger sql; private final SpiLogger summary; 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 65dbef013..90f6cbafa 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 @@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory; /** * Default SpiLoggerFactory implementation. */ -public class DLoggerFactory implements SpiLoggerFactory { +public final class DLoggerFactory implements SpiLoggerFactory { /** * Just use a standard slf4j Logger. 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 87b78052f..e921d5aa3 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 @@ -3,7 +3,7 @@ package io.ebeaninternal.server.logger; import io.ebeaninternal.api.SpiLogger; import org.slf4j.Logger; -public class DSpiLogger implements SpiLogger { +public final class DSpiLogger implements SpiLogger { private final Logger logger; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthComparator.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthComparator.java index 7606599d9..66756b4a1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthComparator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthComparator.java @@ -12,7 +12,7 @@ import java.util.Comparator; * keys from inserts. These values are required to persist the 'detail' beans. *

*/ -class BatchDepthComparator implements Comparator, Serializable { +final class BatchDepthComparator implements Comparator, Serializable { private static final long serialVersionUID = 264611821665757991L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthOrder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthOrder.java index 3817f43bd..bb0b4bcfa 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthOrder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchDepthOrder.java @@ -6,7 +6,7 @@ import java.util.Map; /** * Helper to determine batch execution order for BatchedBeanHolders. */ -class BatchDepthOrder { +final class BatchDepthOrder { private final Map map = new HashMap<>(); @@ -22,7 +22,7 @@ class BatchDepthOrder { map.clear(); } - private static class Counter { + private static final class Counter { int count; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedBeanHolder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedBeanHolder.java index db43c32d0..db6d85a35 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedBeanHolder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedBeanHolder.java @@ -18,7 +18,7 @@ import java.util.ArrayList; * executed. The lowest depth is executed first. *

*/ -class BatchedBeanHolder { +final class BatchedBeanHolder { /** * The owning queue. 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 0a764e35b..9afd4d6e8 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 @@ -20,7 +20,7 @@ import java.util.List; * This can hold CallableStatements as well. *

*/ -public class BatchedPstmt implements SpiProfileTransactionEvent { +public final class BatchedPstmt implements SpiProfileTransactionEvent { private static final Logger log = LoggerFactory.getLogger(BatchedPstmt.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java index 4bd892bd4..50ed43900 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java @@ -15,7 +15,7 @@ import java.util.Map; * statements of a single 'depth' at any given time. *

*/ -public class BatchedPstmtHolder { +public final class BatchedPstmtHolder { /** * A Map of the statements using a String key. This is used so that the same diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java deleted file mode 100644 index 6d71e8d79..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java +++ /dev/null @@ -1,81 +0,0 @@ -package io.ebeaninternal.server.persist; - -import java.util.ArrayList; - -/** - * Holds a list of bind values for binding to a PreparedStatement. - */ -class BindValues { - - private final ArrayList list = new ArrayList<>(); - - /** - * Create with a Binder. - */ - public BindValues() { - } - - /** - * Add a bind value with its JDBC datatype. - * - * @param value the bind value - * @param dbType the type as per java.sql.Types - */ - public void add(Object value, int dbType, String name) { - list.add(new Value(value, dbType, name)); - } - - /** - * List of bind values. - */ - public ArrayList values() { - return list; - } - - /** - * A Value has additionally the JDBC data type. - */ - public static class Value { - - private final Object value; - - private final int dbType; - - private final String name; - - /** - * Create the value. - */ - Value(Object value, int dbType, String name) { - this.value = value; - this.dbType = dbType; - this.name = name; - } - - /** - * Return the type as per java.sql.Types. - */ - public int getDbType() { - return dbType; - } - - /** - * Return the value. - */ - public Object getValue() { - return value; - } - - /** - * Return the property name. - */ - public String getName() { - return name; - } - - @Override - public String toString() { - return String.valueOf(value); - } - } -} 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 1d94d7a81..bec0223d0 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 @@ -31,7 +31,7 @@ import java.util.List; /** * Binds bean values to a PreparedStatement. */ -public class Binder { +public final class Binder { private static final Logger logger = LoggerFactory.getLogger(Binder.class); @@ -77,33 +77,6 @@ public class Binder { return asOfStandardsBased; } - /** - * Bind the values to the Prepared Statement. - */ - public void bind(BindValues bindValues, DataBind dataBind, StringBuilder bindBuf) throws SQLException { - String logPrefix = ""; - ArrayList list = bindValues.values(); - for (BindValues.Value bindValue : list) { - Object val = bindValue.getValue(); - int dt = bindValue.getDbType(); - bindObject(dataBind, val, dt); - - if (bindBuf != null) { - bindBuf.append(logPrefix); - if (logPrefix.isEmpty()) { - logPrefix = ", "; - } - bindBuf.append(bindValue.getName()); - bindBuf.append("="); - if (isLob(dt)) { - bindBuf.append("[LOB]"); - } else { - bindBuf.append(val); - } - } - } - } - /** * Bind the parameters to the preparedStatement returning the bind log. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java index e086e2630..760d9eda3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java @@ -5,7 +5,7 @@ import io.ebean.Transaction; import io.ebean.event.BeanDeleteIdRequest; import io.ebeaninternal.api.SpiEbeanServer; -class DeleteIdRequest implements BeanDeleteIdRequest { +final class DeleteIdRequest implements BeanDeleteIdRequest { private final EbeanServer server; private final Transaction transaction; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java index c3065b779..1c258b5bb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java @@ -21,7 +21,7 @@ import java.util.List; * helps fetch the foreign keys and delete the appropriate rows. *

*/ -class DeleteUnloadedForeignKeys { +final class DeleteUnloadedForeignKeys { private final List> propList = new ArrayList<>(4); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DmlUtil.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DmlUtil.java index 46ce61d33..c7693f6e8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DmlUtil.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DmlUtil.java @@ -4,7 +4,7 @@ package io.ebeaninternal.server.persist; /** * Utility object with helper methods for DML. */ -public class DmlUtil { +public final class DmlUtil { /** * Return true if the value is null or a Numeric 0 (for primitive int's and long's) or Option empty. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java index 2c01fcd31..fc2c1e0e5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java @@ -13,10 +13,9 @@ import java.sql.SQLException; /** * Handles the execution of CallableSql requests. */ -class ExeCallableSql { +final class ExeCallableSql { private final Binder binder; - private final PstmtFactory pstmtFactory; ExeCallableSql(Binder binder) { @@ -28,9 +27,7 @@ class ExeCallableSql { * execute the CallableSql requests. */ public int execute(PersistRequestCallableSql request) { - boolean batchThisRequest = request.isBatchThisRequest(); - CallableStatement cstmt = null; try { cstmt = bindStmt(request, batchThisRequest); @@ -58,18 +55,15 @@ class ExeCallableSql { private CallableStatement bindStmt(PersistRequestCallableSql request, boolean batchThisRequest) throws SQLException { - request.startBind(batchThisRequest); SpiCallableSql callableSql = request.getCallableSql(); SpiTransaction t = request.getTransaction(); String sql = callableSql.getSql(); - BindParams bindParams = callableSql.getBindParams(); // process named parameters if required sql = BindParamsParser.parse(bindParams, sql); - boolean logSql = request.isLogSql(); CallableStatement cstmt; @@ -90,9 +84,7 @@ class ExeCallableSql { if (!bindParams.isEmpty()) { bindLog = binder.bind(bindParams, cstmt, t.getInternalConnection()); } - request.setBindLog(bindLog); - // required to read OUT params later request.setBound(bindParams, cstmt); return cstmt; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java index d79a4d66f..ee9ffad23 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java @@ -15,15 +15,11 @@ import java.sql.SQLException; /** * Executes the UpdateSql requests. */ -class ExeOrmUpdate { +final class ExeOrmUpdate { private final Binder binder; - private final PstmtFactory pstmtFactory; - /** - * Create with a given binder. - */ ExeOrmUpdate(Binder binder) { this.pstmtFactory = new PstmtFactory(); this.binder = binder; @@ -33,9 +29,7 @@ class ExeOrmUpdate { * Execute the orm update request. */ public int execute(PersistRequestOrmUpdate request) { - boolean batchThisRequest = request.isBatchThisRequest(); - PreparedStatement pstmt = null; try { pstmt = bindStmt(request, batchThisRequest); @@ -68,13 +62,11 @@ class ExeOrmUpdate { * Convert bean and property names to db table and columns. */ private String translate(PersistRequestOrmUpdate request, String sql) { - BeanDescriptor descriptor = request.getBeanDescriptor(); return descriptor.convertOrmUpdateToSql(sql); } private PreparedStatement bindStmt(PersistRequestOrmUpdate request, boolean batchThisRequest) throws SQLException { - request.startBind(batchThisRequest); SpiUpdate ormUpdate = request.getOrmUpdate(); SpiTransaction t = request.getTransaction(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java index cea7560c9..75627671f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java @@ -16,15 +16,11 @@ import java.sql.SQLException; /** * Executes the UpdateSql requests. */ -class ExeUpdateSql { +final class ExeUpdateSql { private final Binder binder; - private final PstmtFactory pstmtFactory; - /** - * Create with a given binder. - */ ExeUpdateSql(Binder binder) { this.binder = binder; this.pstmtFactory = new PstmtFactory(); @@ -34,14 +30,10 @@ class ExeUpdateSql { * Execute the UpdateSql request. */ public int execute(PersistRequestUpdateSql request) { - boolean batchThisRequest = request.isBatchThisRequest(); - PreparedStatement pstmt = null; try { - pstmt = bindStmt(request, batchThisRequest); - if (batchThisRequest) { pstmt.addBatch(); // return -1 to indicate batch mode @@ -66,7 +58,6 @@ class ExeUpdateSql { } private void readGeneratedKeys(PreparedStatement stmt, PersistRequestUpdateSql request) { - ResultSet resultSet = null; try { resultSet = stmt.getGeneratedKeys(); @@ -82,7 +73,6 @@ class ExeUpdateSql { } private PreparedStatement bindStmt(PersistRequestUpdateSql request, boolean batchThisRequest) throws SQLException { - request.startBind(batchThisRequest); SpiSqlUpdate updateSql = request.getUpdateSql(); SpiTransaction t = request.getTransaction(); @@ -121,7 +111,6 @@ class ExeUpdateSql { private void determineType(String word1, String word2, String word3, PersistRequestUpdateSql request) { - if (word1.equalsIgnoreCase("UPDATE")) { request.setType(SqlType.SQL_UPDATE, word2); @@ -137,7 +126,6 @@ class ExeUpdateSql { } private void parseUpdate(String sql, PersistRequestUpdateSql request) { - int[] pos = new int[3]; int spaceCount = 0; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeContext.java index bdd6ce855..e3cb0d5e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeContext.java @@ -10,7 +10,7 @@ import java.util.List; /** * Context used for merge processing. */ -class MergeContext { +final class MergeContext { private final SpiEbeanServer server; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java index b2d53ba40..3e09a44f9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java @@ -24,7 +24,7 @@ import java.util.regex.Pattern; /** * Drives the merge processing. */ -class MergeHandler { +final class MergeHandler { private static final Pattern PATH_SPLIT = Pattern.compile("\\."); @@ -33,10 +33,8 @@ class MergeHandler { private final EntityBean bean; private final MergeOptions options; private final SpiTransaction transaction; - private final Map nodes = new LinkedHashMap<>(); - MergeHandler(SpiEbeanServer server, BeanDescriptor desc, EntityBean bean, MergeOptions options, SpiTransaction transaction) { this.server = server; this.desc = desc; @@ -49,7 +47,6 @@ class MergeHandler { * Fetch the Ids for the graph and use them to determine inserts, updates and deletes for the merge paths. */ List merge() { - Set paths = options.paths(); if (desc.isIdGeneratedValue() && paths.isEmpty() && !options.isClientGeneratedIds()) { // just do a single insert or update based on Id value present @@ -76,7 +73,6 @@ class MergeHandler { for (MergeNode value : nodes.values()) { value.merge(request); } - return context.getDeletedBeans(); } @@ -86,9 +82,7 @@ class MergeHandler { * We use the Id values to determine what are inserts, updates and deletes as part of the merge. */ private EntityBean fetchOutline(Set paths) { - Query query = server.find(desc.getBeanType()); - query.setBeanCacheMode(CacheMode.OFF); query.setPersistenceContextScope(PersistenceContextScope.QUERY); query.setId(desc.getId(bean)); @@ -126,14 +120,12 @@ class MergeHandler { } private MergeNode addRootLevelNode(String rootPath) { - MergeNode node = createMergeNode(rootPath, desc, rootPath); nodes.put(rootPath, node); return node; } static MergeNode createMergeNode(String fullPath, BeanDescriptor targetDesc, String path) { - BeanProperty prop = targetDesc.getBeanProperty(path); if (!(prop instanceof BeanPropertyAssoc)) { throw new PersistenceException("merge path [" + path + "] is not a ToMany or ToOne property of " + targetDesc.getFullName()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNode.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNode.java index fa2dc398e..cc5ebeaba 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNode.java @@ -33,7 +33,7 @@ abstract class MergeNode { /** * Add a child node given the fullPath and relative path. */ - MergeNode addChild(String fullPath, String path) { + final MergeNode addChild(String fullPath, String path) { MergeNode childNode = MergeHandler.createMergeNode(fullPath, targetDescriptor, path); if (children == null) { children = new LinkedHashMap<>(); @@ -45,7 +45,7 @@ abstract class MergeNode { /** * Return the node given the relative path. */ - MergeNode get(String path) { + final MergeNode get(String path) { if (children != null) { return children.get(path); } @@ -55,8 +55,7 @@ abstract class MergeNode { /** * Return the outline beans as a map keyed by Id values. */ - Map toMap(Collection outlines) { - + final Map toMap(Collection outlines) { Map outlineMap = new HashMap<>(); if (outlines != null) { for (Object out : outlines) { @@ -71,8 +70,7 @@ abstract class MergeNode { /** * Add to the query to fetch the Ids values for the foreign keys basically. */ - void addSelectId(Query query) { - + final void addSelectId(Query query) { BeanProperty idProperty = targetDescriptor.getIdProperty(); query.fetch(fullPath, idProperty.getName()); } @@ -80,8 +78,7 @@ abstract class MergeNode { /** * Cascade the merge processing if this has child nodes. */ - void cascade(EntityBean entityBean, EntityBean outlineBean, MergeRequest request) { - + final void cascade(EntityBean entityBean, EntityBean outlineBean, MergeRequest request) { if (children != null && !children.isEmpty()) { MergeRequest sub = request.sub(entityBean, outlineBean); for (MergeNode node : children.values()) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocManyToMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocManyToMany.java index 7fd74e8a9..02acdf3f9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocManyToMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocManyToMany.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Node for processing merge on ManyToMany properties. */ -class MergeNodeAssocManyToMany extends MergeNode { +final class MergeNodeAssocManyToMany extends MergeNode { private final BeanPropertyAssocMany many; @@ -26,14 +26,11 @@ class MergeNodeAssocManyToMany extends MergeNode { @Override public void merge(MergeRequest request) { - EntityBean parentBean = request.getBean(); - Collection beans = many.getRawCollection(parentBean); Collection outlines = many.getRawCollection(request.getOutline()); Map outlineIds = toMap(outlines); - List additions = new ArrayList<>(); if (beans != null) { for (Object bean : beans) { @@ -57,7 +54,6 @@ class MergeNodeAssocManyToMany extends MergeNode { if (!deletions.isEmpty()) { transaction.flush(); - SqlUpdate delete = intersectionTable.delete(server, false); for (EntityBean deletion : deletions) { many.intersectionBind(delete, parentBean, deletion); @@ -68,7 +64,6 @@ class MergeNodeAssocManyToMany extends MergeNode { if (!additions.isEmpty()) { transaction.flush(); - SqlUpdate insert = intersectionTable.insert(server, false); for (EntityBean addition : additions) { many.intersectionBind(insert, parentBean, addition); @@ -76,7 +71,6 @@ class MergeNodeAssocManyToMany extends MergeNode { } insert.execute(); } - many.resetMany(parentBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOne.java index 90f44e07f..68438bf40 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOne.java @@ -8,7 +8,7 @@ import java.util.Objects; /** * Node for processing merge on ToOne properties. */ -class MergeNodeAssocOne extends MergeNode { +final class MergeNodeAssocOne extends MergeNode { private final BeanPropertyAssocOne one; @@ -19,7 +19,6 @@ class MergeNodeAssocOne extends MergeNode { @Override public void merge(MergeRequest request) { - EntityBean entityBean = getEntityBean(request.getBean()); if (entityBean == null) { checkOrphanRemoval(request); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOneToMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOneToMany.java index a75ea26fb..8372c955d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOneToMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeNodeAssocOneToMany.java @@ -9,7 +9,7 @@ import java.util.Map; /** * Node for processing merge on ToMany properties. */ -class MergeNodeAssocOneToMany extends MergeNode { +final class MergeNodeAssocOneToMany extends MergeNode { private final BeanPropertyAssocMany many; @@ -20,12 +20,10 @@ class MergeNodeAssocOneToMany extends MergeNode { @Override public void merge(MergeRequest request) { - Collection beans = many.getRawCollection(request.getBean()); Collection outlines = many.getRawCollection(request.getOutline()); Map outlineIds = toMap(outlines); - if (beans != null) { for (Object bean : beans) { EntityBean entityBean = (EntityBean) bean; @@ -40,7 +38,6 @@ class MergeNodeAssocOneToMany extends MergeNode { } } } - // any remaining are considered deletes for (EntityBean outlineBean : outlineIds.values()) { request.addDelete(outlineBean); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeRequest.java index 1826e749e..d893fd999 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MergeRequest.java @@ -7,11 +7,10 @@ import io.ebeaninternal.api.SpiTransaction; /** * Request object used for processing the merge. */ -class MergeRequest { +final class MergeRequest { private final EntityBean bean; private final EntityBean outline; - private final MergeContext context; MergeRequest(MergeContext context, EntityBean bean, EntityBean outline) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MultiValueWrapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MultiValueWrapper.java index 36104822a..5e23a66cd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/MultiValueWrapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/MultiValueWrapper.java @@ -6,7 +6,7 @@ import java.util.Collection; * Wraps the multi values that are used for "property in (...)" queries * @author Roland Praml, FOCONIS AG */ -public class MultiValueWrapper { +public final class MultiValueWrapper { private final Collection values; private final Class type; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java index cf8b294df..fb47147da 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java @@ -15,10 +15,7 @@ import java.sql.Statement; * getGeneratedKeys. *

*/ -class PstmtFactory { - - PstmtFactory() { - } +final class PstmtFactory { /** * Get a callable statement without any batching. @@ -56,7 +53,6 @@ class PstmtFactory { if (t.isLogSql()) { t.logSql(TrimLogSql.trim(sql)); } - Connection conn = t.getInternalConnection(); PreparedStatement stmt = conn.prepareStatement(sql); BatchedPstmt bs = new BatchedPstmt(stmt, false, sql, t); @@ -68,10 +64,8 @@ class PstmtFactory { * Return a callable statement taking into account batch requirements. */ CallableStatement getCstmtBatch(SpiTransaction t, boolean logSql, String sql, BatchPostExecute batchExe) throws SQLException { - BatchedPstmtHolder batch = t.getBatchControl().getPstmtHolder(); CallableStatement stmt = (CallableStatement) batch.getStmt(sql, batchExe); - if (stmt != null) { return stmt; } @@ -79,10 +73,8 @@ class PstmtFactory { if (logSql) { t.logSql(sql); } - Connection conn = t.getInternalConnection(); stmt = conn.prepareCall(sql); - BatchedPstmt bs = new BatchedPstmt(stmt, false, sql, t); batch.addStmt(bs, batchExe); return stmt; 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 f305e3244..a31cee3f2 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 @@ -46,20 +46,20 @@ abstract class SaveManyBase implements SaveMany { */ abstract void save(); - void preElementCollectionUpdate() { + final void preElementCollectionUpdate() { if (!insertedParent) { request.preElementCollectionUpdate(); persister.addToFlushQueue(many.deleteByParentId(request.getBeanId(), null), transaction, 1); } } - void resetModifyState() { + final void resetModifyState() { if (value instanceof BeanCollection) { modifyListenReset((BeanCollection) value); } } - void modifyListenReset(BeanCollection c) { + final void modifyListenReset(BeanCollection c) { if (insertedParent) { // after insert set the modify listening mode for private owned etc c.setModifyListening(many.getModifyListenMode()); @@ -67,7 +67,7 @@ abstract class SaveManyBase implements SaveMany { c.modifyReset(); } - void postElementCollectionUpdate() { + final void postElementCollectionUpdate() { if (!insertedParent) { if (request.isNotifyCache()) { try { 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 1f1da9fc0..33edf8dd8 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 @@ -26,7 +26,7 @@ import static io.ebeaninternal.server.persist.DmlUtil.isNullOrZero; /** * Saves the details for a OneToMany or ManyToMany relationship (entity beans). */ -public class SaveManyBeans extends SaveManyBase { +public final class SaveManyBeans extends SaveManyBase { private static final Logger log = LoggerFactory.getLogger(SaveManyBeans.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java index 53f638114..8b577da93 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollection.java @@ -11,7 +11,7 @@ import java.util.Collection; /** * Save details for a simple scalar element collection. */ -class SaveManyElementCollection extends SaveManyBase { +final class SaveManyElementCollection extends SaveManyBase { private Collection collection; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java index 60dd2e01d..2941a1499 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyElementCollectionMap.java @@ -12,7 +12,7 @@ import java.util.Set; /** * Save details for a simple scalar map element collection. */ -class SaveManyElementCollectionMap extends SaveManyBase { +final class SaveManyElementCollectionMap extends SaveManyBase { private Set> entries; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java index 1ab6349a0..f38490420 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.persist; /** * Utility to improve logging of raw SQL that contains new line characters. */ -public class TrimLogSql { +public final class TrimLogSql { /** * Replace new line chars for nicer logging of multi-line sql strings. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/BaseMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/BaseMeta.java index d7ed5c90c..872119060 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/BaseMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/BaseMeta.java @@ -16,19 +16,17 @@ class BaseMeta { this.tenantId = tenantId; } - String appendWhere(GenerateDmlRequest request, ConcurrencyMode conMode) { + final String appendWhere(GenerateDmlRequest request, ConcurrencyMode conMode) { request.setWhereIdMode(); id.dmlAppend(request); if (tenantId != null) { tenantId.dmlAppend(request); } - if (ConcurrencyMode.VERSION == conMode) { if (version != null) { version.dmlAppend(request); } } - return request.toString(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteHandler.java index 7889e94af..846e88f80 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteHandler.java @@ -10,7 +10,7 @@ import java.sql.SQLException; /** * Delete bean handler. */ -public class DeleteHandler extends DmlHandler { +final class DeleteHandler extends DmlHandler { private final DeleteMeta meta; @@ -29,10 +29,8 @@ public class DeleteHandler extends DmlHandler { */ @Override public void bind() throws SQLException { - sql = meta.getSql(persistRequest); SpiTransaction t = persistRequest.getTransaction(); - PreparedStatement pstmt; if (persistRequest.isBatched()) { pstmt = getPstmtBatch(t, sql, persistRequest, false); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteMeta.java index c51a62531..7baac04ab 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DeleteMeta.java @@ -30,7 +30,6 @@ final class DeleteMeta extends BaseMeta { String draftTableName = desc.getDraftTable(); this.sqlDraftNone = genSql(ConcurrencyMode.NONE, draftTableName); this.sqlDraftVersion = genSql(ConcurrencyMode.VERSION, draftTableName); - } else { this.sqlDraftNone = sqlNone; this.sqlDraftVersion = sqlVersion; @@ -41,9 +40,7 @@ final class DeleteMeta extends BaseMeta { * Bind the request based on the concurrency mode. */ public void bind(PersistRequestBean persist, DmlHandler bind) throws SQLException { - EntityBean bean = persist.getEntityBean(); - id.dmlBind(bind, bean); if (tenantId != null) { tenantId.dmlBind(bind, bean); @@ -58,7 +55,6 @@ final class DeleteMeta extends BaseMeta { * get or generate the sql based on the concurrency mode. */ public String getSql(PersistRequestBean request) { - if (id.isEmpty()) { throw new IllegalStateException("Can not deleteById on " + request.getFullName() + " as no @Id property"); } @@ -77,10 +73,7 @@ final class DeleteMeta extends BaseMeta { } private String genSql(ConcurrencyMode conMode, String table) { - - GenerateDmlRequest request = new GenerateDmlRequest(); - request.append("delete from ").append(table); - request.append(" where "); + GenerateDmlRequest request = new GenerateDmlRequest().append("delete from ").append(table).append(" where "); return appendWhere(request, conMode); } 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 5c925e8d2..f9d592cf3 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 @@ -16,14 +16,11 @@ import java.sql.SQLException; * a flat list of Bindable objects. *

*/ -public final class DmlBeanPersister implements BeanPersister { +final class DmlBeanPersister implements BeanPersister { private final DatabasePlatform dbPlatform; - private final UpdateMeta updateMeta; - private final InsertMeta insertMeta; - private final DeleteMeta deleteMeta; DmlBeanPersister(DatabasePlatform dbPlatform, UpdateMeta updateMeta, InsertMeta insertMeta, DeleteMeta deleteMeta) { @@ -61,7 +58,6 @@ public final class DmlBeanPersister implements BeanPersister { * execute request taking batching into account. */ private int execute(PersistRequestBean request, PersistHandler handler) { - boolean batched = request.isBatched(); try { handler.bind(); @@ -72,7 +68,6 @@ public final class DmlBeanPersister implements BeanPersister { } else { return handler.executeNoBatch(); } - } catch (SQLException e) { // log the error to the transaction log String msg = "Error[" + StringHelper.removeNewLines(e.getMessage()) + "]"; @@ -80,7 +75,6 @@ public final class DmlBeanPersister implements BeanPersister { request.getTransaction().logSummary(msg); } throw dbPlatform.translate(msg, e); - } finally { if (!batched) { handler.close(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersisterFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersisterFactory.java index a06ac1505..c9b4cadea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersisterFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DmlBeanPersisterFactory.java @@ -8,10 +8,9 @@ import io.ebeaninternal.server.persist.BeanPersisterFactory; /** * Factory for creating a DmlBeanPersister for a bean type. */ -public class DmlBeanPersisterFactory implements BeanPersisterFactory { +public final class DmlBeanPersisterFactory implements BeanPersisterFactory { private final DatabasePlatform dbPlatform; - private final MetaFactory metaFactory; public DmlBeanPersisterFactory(DatabasePlatform dbPlatform) { @@ -24,11 +23,9 @@ public class DmlBeanPersisterFactory implements BeanPersisterFactory { */ @Override public BeanPersister create(BeanDescriptor desc) { - if (desc.isDocStoreOnly()) { return new DocStoreBeanPersister(GeneratedProperties.of(desc)); } - UpdateMeta updMeta = metaFactory.createUpdate(desc); DeleteMeta delMeta = metaFactory.createDelete(desc); InsertMeta insMeta = metaFactory.createInsert(desc); 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 189613808..3baeb6551 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 @@ -27,28 +27,14 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { private static final short BATCHED_FIRST = 1; private static final short BATCHED = 2; - /** - * The originating request. - */ final PersistRequestBean persistRequest; - private final StringBuilder bindLog; - final SpiTransaction transaction; - private final boolean logLevelSql; - private final long now; - - /** - * The PreparedStatement used for the dml. - */ DataBind dataBind; - BatchedPstmt batchedPstmt; - String sql; - private short batchedStatus; DmlHandler(PersistRequestBean persistRequest) { @@ -63,6 +49,11 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { } } + @Override + public void pushJson(String json) { + dataBind.pushJson(json); + } + @Override public long now() { return now; @@ -221,7 +212,6 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { } private void bindInternal(boolean log, Object value, BeanProperty prop) throws SQLException { - if (log) { if (bindLog.length() > 0) { bindLog.append(","); @@ -244,14 +234,12 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { * Check with useGeneratedKeys to get appropriate PreparedStatement. */ PreparedStatement getPstmt(SpiTransaction t, String sql, boolean genKeys) throws SQLException { - Connection conn = t.getInternalConnection(); if (genKeys) { // the Id generated is always the first column // Required to stop Oracle10 giving us Oracle rowId?? // Other jdbc drivers seem fine without this hint. return conn.prepareStatement(sql, GENERATED_KEY_COLUMNS); - } else { return conn.prepareStatement(sql); } @@ -267,7 +255,6 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { batchedStatus = batchedPstmt.isEmpty() ? BATCHED_FIRST : BATCHED; return batchedPstmt.getStatement(request); } - batchedStatus = BATCHED_FIRST; PreparedStatement stmt = getPstmt(t, sql, genKeys); batchedPstmt = new BatchedPstmt(stmt, genKeys, sql, t); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DocStoreBeanPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DocStoreBeanPersister.java index 9bbe7bfcd..9b9a9c2cf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DocStoreBeanPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/DocStoreBeanPersister.java @@ -8,7 +8,7 @@ import javax.persistence.PersistenceException; /** * Document store based BeanPersister. */ -class DocStoreBeanPersister implements BeanPersister { +final class DocStoreBeanPersister implements BeanPersister { private final GeneratedProperties generatedProperties; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GenerateDmlRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GenerateDmlRequest.java index 5093ae111..ab292163d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GenerateDmlRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GenerateDmlRequest.java @@ -3,26 +3,16 @@ package io.ebeaninternal.server.persist.dml; /** * Helper to support the generation of DML statements. */ -public class GenerateDmlRequest { +public final class GenerateDmlRequest { private final StringBuilder sb = new StringBuilder(100); - private StringBuilder insertBindBuffer; - private String prefix; private String prefix2; - private int insertMode; - private int bindColumnCount; - /** - * Create from a PersistRequestBean. - */ - public GenerateDmlRequest() { - } - - public GenerateDmlRequest append(String s) { + GenerateDmlRequest append(String s) { sb.append(s); return this; } @@ -33,9 +23,7 @@ public class GenerateDmlRequest { } public void appendColumn(String column, String bind) { - ++bindColumnCount; - sb.append(prefix); sb.append(column); //sb.append(expr); @@ -48,7 +36,6 @@ public class GenerateDmlRequest { sb.append("="); sb.append(bind); } - if (prefix2 != null) { prefix = prefix2; prefix2 = null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedProperties.java index 5f4090541..44a1d919b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedProperties.java @@ -10,7 +10,7 @@ import java.util.List; /** * Executes the generated property (like WhenCreated, WhoCreated etc) for doc store persisting. */ -class GeneratedProperties { +final class GeneratedProperties { /** * Create the GeneratedProperties for the given bean type. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedPropertyCollector.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedPropertyCollector.java index 08036e143..33b804a6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedPropertyCollector.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/GeneratedPropertyCollector.java @@ -10,7 +10,7 @@ import java.util.List; /** * Collects the generated properties for inserts and updates for a given bean type. */ -class GeneratedPropertyCollector { +final class GeneratedPropertyCollector { private final List preInsert = new ArrayList<>(); private final List preUpdate = new ArrayList<>(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertHandler.java index f1508bf50..113e6ff39 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/InsertHandler.java @@ -18,26 +18,13 @@ import static io.ebeaninternal.server.persist.DmlUtil.isNullOrZero; /** * Insert bean handler. */ -public class InsertHandler extends DmlHandler { +public final class InsertHandler extends DmlHandler { - /** - * The associated InsertMeta data. - */ private final InsertMeta meta; - - /** - * Set to true when the key is concatenated. - */ - private final boolean concatinatedKey; - - /** - * Flag set when using getGeneratedKeys. - */ + private final boolean concatenatedKey; private boolean useGeneratedKeys; - /** - * A SQL Select used to fetch back the Id where generatedKeys is not - * supported. + * SQL Select used to fetch back the Id where generatedKeys is not supported. */ private boolean useSelectLastInsertedId; @@ -47,7 +34,7 @@ public class InsertHandler extends DmlHandler { public InsertHandler(PersistRequestBean persist, InsertMeta meta) { super(persist); this.meta = meta; - this.concatinatedKey = meta.isConcatenatedKey(); + this.concatenatedKey = meta.isConcatenatedKey(); } @Override @@ -60,17 +47,14 @@ public class InsertHandler extends DmlHandler { */ @Override public void bind() throws SQLException { - BeanDescriptor desc = persistRequest.getBeanDescriptor(); EntityBean bean = persistRequest.getEntityBean(); - Object idValue = desc.getId(bean); - boolean withId = !isNullOrZero(idValue); // check to see if we are going to use generated keys if (!withId) { - if (concatinatedKey) { + if (concatenatedKey) { // expecting a concatenated key that can // be built from supplied AssocOne beans withId = meta.deriveConcatenatedId(persistRequest); @@ -84,10 +68,8 @@ public class InsertHandler extends DmlHandler { } SpiTransaction t = persistRequest.getTransaction(); - // get the appropriate sql sql = meta.getSql(withId, persistRequest.isPublish()); - PreparedStatement pstmt; if (persistRequest.isBatched()) { pstmt = getPstmtBatch(t, sql, persistRequest, useGeneratedKeys); @@ -139,7 +121,6 @@ public class InsertHandler extends DmlHandler { * For non batch insert with generated keys. */ private void getGeneratedKeys() throws SQLException { - ResultSet rset = dataBind.getPstmt().getGeneratedKeys(); try { setGeneratedKey(rset); @@ -164,7 +145,6 @@ public class InsertHandler extends DmlHandler { * SQL select to fetch back the Id value. */ private void fetchGeneratedKeyUsingSelect() throws SQLException { - PreparedStatement stmt = null; ResultSet rset = null; try { 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 abaefd095..588b778e7 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 @@ -26,28 +26,18 @@ final class InsertMeta { private final String sqlWithId; private final String sqlDraftNullId; private final String sqlDraftWithId; - private final BindableId id; - private final Bindable discriminator; - private final BindableList all; - private final BindableList allExcludeDraftOnly; - private final boolean supportsGetGeneratedKeys; - - private final boolean concatinatedKey; - + private final boolean concatenatedKey; /** * Used for DB that do not support getGeneratedKeys. */ private final boolean supportsSelectLastInsertedId; - private final Bindable shadowFKey; - private final String[] identityDbColumns; - private final Platform platform; InsertMeta(DatabasePlatform dbPlatform, BeanDescriptor desc, Bindable shadowFKey, BindableId id, BindableList all) { @@ -66,7 +56,7 @@ final class InsertMeta { // only available for single Id property if (id.isConcatenated()) { // concatenated key - this.concatinatedKey = true; + this.concatenatedKey = true; this.identityDbColumns = null; this.sqlNullId = null; this.sqlDraftNullId = null; @@ -75,7 +65,7 @@ final class InsertMeta { } else { // insert sql for db identity or sequence insert - this.concatinatedKey = false; + this.concatenatedKey = false; if (id.getIdentityColumn() == null) { this.identityDbColumns = new String[]{}; this.supportsGetGeneratedKeys = false; @@ -99,7 +89,7 @@ final class InsertMeta { * Return true if this is a concatenated key. */ boolean isConcatenatedKey() { - return concatinatedKey; + return concatenatedKey; } String[] getIdentityDbColumns() { @@ -133,7 +123,6 @@ final class InsertMeta { * Bind the request based on whether the id value(s) are null. */ public void bind(DmlHandler request, EntityBean bean, boolean withId, boolean publish) throws SQLException { - if (withId) { id.dmlBind(request, bean); } @@ -154,7 +143,6 @@ final class InsertMeta { * get the sql based whether the id value(s) are null. */ public String getSql(boolean withId, boolean publish) { - if (withId) { return publish ? sqlWithId : sqlDraftWithId; } else { @@ -163,7 +151,6 @@ final class InsertMeta { } private String genSql(boolean nullId, String table, boolean draftTable) { - GenerateDmlRequest request = new GenerateDmlRequest(); request.setInsertSetMode(); 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 6df6d088c..7ad52d87f 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 @@ -22,14 +22,7 @@ import java.util.List; /** * Factory for creating InsertMeta UpdateMeta and DeleteMeta. */ -class MetaFactory { - - private final FactoryBaseProperties baseFact; - private final FactoryEmbedded embeddedFact; - private final FactoryVersion versionFact = new FactoryVersion(); - private final FactoryAssocOnes assocOneFact = new FactoryAssocOnes(); - - private final FactoryId idFact = new FactoryId(); +final class MetaFactory { /** * Include Lobs in the base statement. Generally true. Oracle9 used to require @@ -37,6 +30,11 @@ class MetaFactory { */ private static final boolean includeLobs = true; + private final FactoryBaseProperties baseFact; + private final FactoryEmbedded embeddedFact; + private final FactoryVersion versionFact = new FactoryVersion(); + private final FactoryAssocOnes assocOneFact = new FactoryAssocOnes(); + private final FactoryId idFact = new FactoryId(); private final DatabasePlatform dbPlatform; MetaFactory(DatabasePlatform dbPlatform) { @@ -52,9 +50,7 @@ class MetaFactory { * Create the UpdateMeta for the given bean type. */ UpdateMeta createUpdate(BeanDescriptor desc) { - List setList = new ArrayList<>(); - baseFact.create(setList, desc, DmlMode.UPDATE, includeLobs); embeddedFact.create(setList, desc, DmlMode.UPDATE, includeLobs); assocOneFact.create(setList, desc, DmlMode.UPDATE); @@ -75,7 +71,6 @@ class MetaFactory { * Create the DeleteMeta for the given bean type. */ DeleteMeta createDelete(BeanDescriptor desc) { - BindableId id = idFact.createId(desc); Bindable version = versionFact.createForDelete(desc); Bindable tenantId = versionFact.createTenantId(desc); @@ -86,19 +81,15 @@ class MetaFactory { * Create the InsertMeta for the given bean type. */ InsertMeta createInsert(BeanDescriptor desc) { - BindableId id = idFact.createId(desc); List allList = new ArrayList<>(); - baseFact.create(allList, desc, DmlMode.INSERT, includeLobs); embeddedFact.create(allList, desc, DmlMode.INSERT, includeLobs); assocOneFact.create(allList, desc, DmlMode.INSERT); BindableList allBindable = new BindableList(allList); - BeanPropertyAssocOne unidirectional = desc.getUnidirectional(); - Bindable shadowFkey; if (unidirectional == null) { shadowFkey = null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateHandler.java index 85f96c192..49f6e1bfb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateHandler.java @@ -11,10 +11,9 @@ import java.sql.SQLException; /** * Update bean handler. */ -public class UpdateHandler extends DmlHandler { +public final class UpdateHandler extends DmlHandler { private final UpdateMeta meta; - private boolean emptySetClause; UpdateHandler(PersistRequestBean persist, UpdateMeta meta) { @@ -32,18 +31,14 @@ public class UpdateHandler extends DmlHandler { */ @Override public void bind() throws SQLException { - SpiUpdatePlan updatePlan = meta.getUpdatePlan(persistRequest); - if (updatePlan.isEmptySetClause()) { emptySetClause = true; return; } sql = updatePlan.getSql(); - SpiTransaction t = persistRequest.getTransaction(); - PreparedStatement pstmt; if (persistRequest.isBatched()) { pstmt = getPstmtBatch(t, sql, persistRequest, false); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateMeta.java index 49dbbaea4..4b667e521 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdateMeta.java @@ -30,16 +30,12 @@ final class UpdateMeta extends BaseMeta { * Bind the request based on the concurrency mode. */ public void bind(PersistRequestBean persist, DmlHandler bind, SpiUpdatePlan updatePlan) throws SQLException { - EntityBean bean = persist.getEntityBean(); - updatePlan.bindSet(bind, bean); - id.dmlBind(bind, bean); if (tenantId != null) { tenantId.dmlBind(bind, bean); } - if (persist.getConcurrencyMode() == ConcurrencyMode.VERSION) { version.dmlBind(bind, bean); } @@ -53,9 +49,7 @@ final class UpdateMeta extends BaseMeta { } private SpiUpdatePlan getDynamicUpdatePlan(PersistRequestBean persistRequest) { - String key = persistRequest.getUpdatePlanHash(); - // check if we can use a cached UpdatePlan BeanDescriptor beanDescriptor = persistRequest.getBeanDescriptor(); SpiUpdatePlan updatePlan = beanDescriptor.getUpdatePlan(key); @@ -71,20 +65,16 @@ final class UpdateMeta extends BaseMeta { BindableList bindableList = new BindableList(list); ConcurrencyMode mode = persistRequest.getConcurrencyMode(); - // build the SQL for this update statement String sql = genSql(mode, bindableList, persistRequest.getUpdateTable()); updatePlan = new UpdatePlan(key, mode, sql, bindableList); - // add the UpdatePlan to the cache beanDescriptor.putUpdatePlan(key, updatePlan); - return updatePlan; } private String genSql(ConcurrencyMode conMode, BindableList bindableList, String tableName) { - GenerateDmlRequest request = new GenerateDmlRequest(); request.append("update ").append(tableName).append(" set "); request.setUpdateSetMode(); @@ -95,7 +85,6 @@ final class UpdateMeta extends BaseMeta { // with the result that nothing is in the set clause return null; } - request.append(" where "); return appendWhere(request, conMode); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdatePlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdatePlan.java index 9422d83dd..69527de9b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdatePlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dml/UpdatePlan.java @@ -10,29 +10,16 @@ import java.sql.SQLException; /** * Plan for executing bean updates for a given set of changed properties. */ -class UpdatePlan implements SpiUpdatePlan { +final class UpdatePlan implements SpiUpdatePlan { private final String key; - private final ConcurrencyMode mode; - private final String sql; - private final Bindable set; - private final long timeCreated; - private final boolean emptySetClause; - private long timeLastUsed; - /** - * Create a non cached UpdatePlan. - */ - UpdatePlan(ConcurrencyMode mode, String sql, Bindable set) { - this(null, mode, sql, set); - } - /** * Create a UpdatePlan with a given key. */ @@ -50,9 +37,6 @@ class UpdatePlan implements SpiUpdatePlan { return emptySetClause; } - /** - * Run the prepared statement binding for the 'update set' properties. - */ @Override public void bindSet(DmlHandler bind, EntityBean bean) throws SQLException { set.dmlBind(bind, bean); @@ -60,49 +44,31 @@ class UpdatePlan implements SpiUpdatePlan { this.timeLastUsed = System.currentTimeMillis(); } - /** - * Return the time this plan was created. - */ @Override public long getTimeCreated() { return timeCreated; } - /** - * Return the time this plan was last used. - */ @Override public long getTimeLastUsed() { return timeLastUsed; } - /** - * Return the key. - */ @Override public String getKey() { return key; } - /** - * Return the concurrency mode for this plan. - */ @Override public ConcurrencyMode getMode() { return mode; } - /** - * Return the DML statement. - */ @Override public String getSql() { return sql; } - /** - * Return the Bindable properties for the update set. - */ @Override public Bindable getSet() { return set; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocOne.java index 9a9be58fc..8eaa091a0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocOne.java @@ -24,30 +24,29 @@ class BindableAssocOne implements Bindable { } @Override - public String toString() { + public final String toString() { return "BindableAssocOne " + assocOne; } @Override - public boolean isDraftOnly() { + public final boolean isDraftOnly() { return assocOne.isDraftOnly(); } @Override - public void addToUpdate(PersistRequestBean request, List list) { + public final void addToUpdate(PersistRequestBean request, List list) { if (request.isAddToUpdate(assocOne)) { list.add(this); } } @Override - public void dmlAppend(GenerateDmlRequest request) { + public final void dmlAppend(GenerateDmlRequest request) { importedId.dmlAppend(request); } @Override public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - EntityBean assocBean = (EntityBean) assocOne.getValue(bean); registerDeferred(request, bean, assocBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocTenant.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocTenant.java index eab3678a5..f3086783c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocTenant.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableAssocTenant.java @@ -5,7 +5,7 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; import java.sql.SQLException; -class BindableAssocTenant extends BindableAssocOne { +final class BindableAssocTenant extends BindableAssocOne { BindableAssocTenant(BeanPropertyAssocOne assocOne) { super(assocOne); @@ -13,7 +13,6 @@ class BindableAssocTenant extends BindableAssocOne { @Override public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - EntityBean assocBean = (EntityBean) assocOne.getValue(bean); importedId.bind(request, assocBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableDiscriminator.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableDiscriminator.java index 1079df8e0..565b85d27 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableDiscriminator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableDiscriminator.java @@ -12,7 +12,7 @@ import java.util.List; /** * Bindable for inserting a discriminator value. */ -public class BindableDiscriminator implements Bindable { +public final class BindableDiscriminator implements Bindable { private final String columnName; private final Object discValue; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEmbedded.java index 44b9a201e..cfda5ae6a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEmbedded.java @@ -10,15 +10,15 @@ import java.util.Arrays; import java.util.List; /** - * Bindable for a Embedded bean. + * Bindable for an Embedded bean. */ -public class BindableEmbedded implements Bindable { +final class BindableEmbedded implements Bindable { private final Bindable[] items; private final BeanPropertyAssocOne embProp; - public BindableEmbedded(BeanPropertyAssocOne embProp, List bindList) { + BindableEmbedded(BeanPropertyAssocOne embProp, List bindList) { this.embProp = embProp; this.items = bindList.toArray(new Bindable[0]); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEncryptedProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEncryptedProperty.java index b855fef00..3bfd2fa41 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEncryptedProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableEncryptedProperty.java @@ -12,13 +12,13 @@ import java.util.List; /** * Bindable for a DB encrypted BeanProperty. */ -public class BindableEncryptedProperty implements Bindable { +final class BindableEncryptedProperty implements Bindable { private final BeanProperty prop; private final boolean bindEncryptDataFirst; - public BindableEncryptedProperty(BeanProperty prop, boolean bindEncryptDataFirst) { + BindableEncryptedProperty(BeanProperty prop, boolean bindEncryptDataFirst) { this.prop = prop; this.bindEncryptDataFirst = bindEncryptDataFirst; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdEmpty.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdEmpty.java index 1f970ee25..fa9c73b0b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdEmpty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdEmpty.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.persist.dml.GenerateDmlRequest; import java.util.List; -public class BindableIdEmpty implements BindableId { +final class BindableIdEmpty implements BindableId { @Override public boolean isEmpty() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdScalar.java index 4d0538f4a..518a236b7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableIdScalar.java @@ -12,11 +12,11 @@ import java.util.List; /** * Bindable for a single scalar id property. */ -public final class BindableIdScalar implements BindableId { +final class BindableIdScalar implements BindableId { private final BeanProperty uidProp; - public BindableIdScalar(BeanProperty uidProp) { + BindableIdScalar(BeanProperty uidProp) { this.uidProp = uidProp; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java index de6957ad1..85894ee53 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableList.java @@ -12,7 +12,7 @@ import java.util.List; /** * List of Bindable items. */ -public class BindableList implements Bindable { +public final class BindableList implements Bindable { private final Bindable[] items; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableOrderColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableOrderColumn.java index ef7046634..7879d192c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableOrderColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableOrderColumn.java @@ -10,7 +10,7 @@ import java.util.List; /** * Bindable for the synthetic order column. */ -public class BindableOrderColumn extends BindableProperty { +public final class BindableOrderColumn extends BindableProperty { public BindableOrderColumn(BeanProperty prop) { super(prop); @@ -29,7 +29,6 @@ public class BindableOrderColumn extends BindableProperty { */ @Override public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - int sortOrder = bean._ebean_getIntercept().getSortOrder(); request.bind(sortOrder, prop); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableProperty.java index 8716ddf91..8f50fe7b3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableProperty.java @@ -11,21 +11,21 @@ import java.util.List; /** * Bindable for a single BeanProperty. */ -public class BindableProperty implements Bindable { +class BindableProperty implements Bindable { final BeanProperty prop; - public BindableProperty(BeanProperty prop) { + BindableProperty(BeanProperty prop) { this.prop = prop; } @Override - public String toString() { + public final String toString() { return prop.toString(); } @Override - public boolean isDraftOnly() { + public final boolean isDraftOnly() { return prop.isDraftOnly(); } @@ -37,7 +37,7 @@ public class BindableProperty implements Bindable { } @Override - public void dmlAppend(GenerateDmlRequest request) { + public final void dmlAppend(GenerateDmlRequest request) { request.appendColumn(prop.getDbColumn()); } @@ -46,7 +46,6 @@ public class BindableProperty implements Bindable { */ @Override public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - Object value = null; if (bean != null) { value = prop.getValue(bean); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonInsert.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonInsert.java new file mode 100644 index 000000000..a6d6d6cb6 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonInsert.java @@ -0,0 +1,42 @@ +package io.ebeaninternal.server.persist.dmlbind; + +import io.ebean.bean.EntityBean; +import io.ebean.bean.MutableValueInfo; +import io.ebeaninternal.server.deploy.BeanProperty; + +import java.sql.SQLException; + +/** + * For JSON Jackson properties - dirty detection via MD5 of json content. + */ +final class BindablePropertyJsonInsert extends BindableProperty { + + private final int propertyIndex; + + BindablePropertyJsonInsert(BeanProperty prop) { + super(prop); + this.propertyIndex = prop.getPropertyIndex(); + } + + /** + * Normal binding of a property value from the bean. + */ + @Override + public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { + if (bean == null) { + request.bind(null, prop); + } else { + Object value = prop.getValue(bean); + if (value == null) { + request.bind(null, prop); + } else { + // on insert store hash and push json + final String json = prop.format(value); + final MutableValueInfo hash = prop.createMutableInfo(json); + bean._ebean_getIntercept().mutableInfo(propertyIndex, hash); + request.pushJson(json); + request.bind(value, prop); + } + } + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonUpdate.java new file mode 100644 index 000000000..7501fd92b --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyJsonUpdate.java @@ -0,0 +1,33 @@ +package io.ebeaninternal.server.persist.dmlbind; + +import io.ebean.bean.EntityBean; +import io.ebeaninternal.server.deploy.BeanProperty; + +import java.sql.SQLException; + +/** + * For JSON Jackson properties - dirty detection via MD5 of json content. + */ +final class BindablePropertyJsonUpdate extends BindableProperty { + + private final int propertyIndex; + + BindablePropertyJsonUpdate(BeanProperty prop) { + super(prop); + this.propertyIndex = prop.getPropertyIndex(); + } + + /** + * Normal binding of a property value from the bean. + */ + @Override + public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { + if (bean == null) { + request.bind(null, prop); + } else { + // update mutableInfo and push json + request.pushJson(bean._ebean_getIntercept().mutableNext(propertyIndex)); + request.bind(prop.getValue(bean), prop); + } + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyVersion.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyVersion.java index 5cdea3e8b..db28c3035 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyVersion.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindablePropertyVersion.java @@ -11,11 +11,11 @@ import java.util.List; /** * Bindable for a Version BeanProperty. Obtains value from 'old values'. */ -public class BindablePropertyVersion implements Bindable { +final class BindablePropertyVersion implements Bindable { private final BeanProperty prop; - public BindablePropertyVersion(BeanProperty prop) { + BindablePropertyVersion(BeanProperty prop) { this.prop = prop; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableRequest.java index 4a1fc6754..e06862e86 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableRequest.java @@ -57,4 +57,9 @@ public interface BindableRequest { * Return true if this is an update request. */ boolean isUpdate(); + + /** + * Push json content for scalarType bind(). + */ + void pushJson(String json); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableUnidirectional.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableUnidirectional.java index 4e94b85d2..2ea853644 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableUnidirectional.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/BindableUnidirectional.java @@ -18,19 +18,16 @@ import java.util.List; * parentBean. *

*/ -public class BindableUnidirectional implements Bindable { +public final class BindableUnidirectional implements Bindable { private final BeanPropertyAssocOne unidirectional; - private final ImportedId importedId; - private final BeanDescriptor desc; public BindableUnidirectional(BeanDescriptor desc, BeanPropertyAssocOne unidirectional) { this.desc = desc; this.unidirectional = unidirectional; this.importedId = unidirectional.getImportedId(); - } @Override @@ -54,13 +51,10 @@ public class BindableUnidirectional implements Bindable { importedId.dmlAppend(request); } - @Override public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - PersistRequestBean persistRequest = request.getPersistRequest(); Object parentBean = persistRequest.getParentBean(); - if (parentBean == null) { Class localType = desc.getBeanType(); Class targetType = unidirectional.getTargetType(); @@ -69,7 +63,6 @@ public class BindableUnidirectional implements Bindable { msg += "For inserts you must use cascade save on the master bean [" + targetType + "]."; throw new PersistenceException(msg); } - importedId.bind(request, (EntityBean) parentBean); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryAssocOnes.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryAssocOnes.java index bf3b0723d..7c2314bed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryAssocOnes.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryAssocOnes.java @@ -9,16 +9,12 @@ import java.util.List; /** * A factory that builds Bindable for BeanPropertyAssocOne properties. */ -public class FactoryAssocOnes { - - public FactoryAssocOnes() { - } +public final class FactoryAssocOnes { /** * Add foreign key columns from associated one beans. */ public void create(List list, BeanDescriptor desc, DmlMode mode) { - for (BeanPropertyAssocOne one : desc.propertiesOneImported()) { if (!one.isImportedPrimaryKey()) { switch (mode) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryBaseProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryBaseProperties.java index 43b9bec8d..209f17bbf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryBaseProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryBaseProperties.java @@ -12,11 +12,10 @@ import java.util.List; * This excludes unique embedded and associated properties. *

*/ -public class FactoryBaseProperties { +public final class FactoryBaseProperties { private final FactoryProperty factoryProperty; - public FactoryBaseProperties(boolean bindEncryptDataFirst) { factoryProperty = new FactoryProperty(bindEncryptDataFirst); } @@ -25,7 +24,6 @@ public class FactoryBaseProperties { * Add Bindable for the base properties to the list. */ public void create(List list, BeanDescriptor desc, DmlMode mode, boolean withLobs) { - for (BeanProperty prop : desc.propertiesBaseScalar()) { if (!prop.isImportedPrimaryKey()) { Bindable item = factoryProperty.create(prop, mode, withLobs, false); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryEmbedded.java index 380c7b3a9..cef891682 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryEmbedded.java @@ -11,7 +11,7 @@ import java.util.List; /** * A factory that builds Bindable for embedded bean properties. */ -public class FactoryEmbedded { +public final class FactoryEmbedded { private final FactoryProperty factoryProperty; @@ -23,7 +23,6 @@ public class FactoryEmbedded { * Add bindable for the embedded properties to the list. */ public void create(List list, BeanDescriptor desc, DmlMode mode, boolean withLobs) { - for (BeanPropertyAssocOne anEmbedded : desc.propertiesEmbedded()) { BeanProperty[] props = anEmbedded.getProperties(); List bindList = new ArrayList<>(props.length); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryId.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryId.java index d517e051b..398f59ecf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryId.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryId.java @@ -7,23 +7,18 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; /** * Create a Bindable for the ids of a bean type. */ -public class FactoryId { - - public FactoryId() { - } +public final class FactoryId { /** * Add uniqueId properties. */ public BindableId createId(BeanDescriptor desc) { - BeanProperty id = desc.getIdProperty(); if (id == null) { return new BindableIdEmpty(); } if (!id.isEmbedded()) { return new BindableIdScalar(id); - } else { BeanPropertyAssocOne embId = (BeanPropertyAssocOne) id; MatchedImportedProperty[] matches = MatchedImportedFactory.build(embId.getProperties(), desc); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryProperty.java index b47b4ecb6..7de3e79ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryProperty.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.persist.dmlbind; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; +import io.ebeaninternal.server.deploy.BeanPropertyJsonMapper; import io.ebeaninternal.server.persist.dml.DmlMode; /** @@ -11,7 +12,7 @@ import io.ebeaninternal.server.persist.dml.DmlMode; * and BindablePropertyUpdateGenerated as required. *

*/ -class FactoryProperty { +final class FactoryProperty { private final boolean bindEncryptDataFirst; @@ -23,14 +24,12 @@ class FactoryProperty { * Create a Bindable for the property given the mode and withLobs flag. */ public Bindable create(BeanProperty prop, DmlMode mode, boolean withLobs, boolean allowManyToOne) { - if (DmlMode.INSERT == mode && !prop.isDbInsertable()) { return null; } if (DmlMode.UPDATE == mode && !prop.isDbUpdatable()) { return null; } - if (prop.isLob() && !withLobs) { // Lob exclusion return null; @@ -38,11 +37,16 @@ class FactoryProperty { if (prop.isDbEncrypted()){ return new BindableEncryptedProperty(prop, bindEncryptDataFirst); } - if (allowManyToOne && prop instanceof BeanPropertyAssocOne) { return new BindableAssocOne((BeanPropertyAssocOne)prop); } - + if (prop instanceof BeanPropertyJsonMapper) { + if (DmlMode.INSERT == mode) { + return new BindablePropertyJsonInsert(prop); + } else if (DmlMode.UPDATE == mode) { + return new BindablePropertyJsonUpdate(prop); + } + } return new BindableProperty(prop); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java index abb7f1a20..7c418af31 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java @@ -7,17 +7,12 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; /** * Creates a Bindable to support version concurrency where clauses. */ -public class FactoryVersion { - - - public FactoryVersion() { - } +public final class FactoryVersion { /** * Create a Bindable for the version property(s) for a bean type. */ public Bindable create(BeanDescriptor desc) { - BeanProperty versionProperty = desc.getVersionProperty(); return (versionProperty == null) ? null : new BindablePropertyVersion(versionProperty); } @@ -26,7 +21,6 @@ public class FactoryVersion { * Create a Bindable for the version property(s) for a bean type. */ public Bindable createForDelete(BeanDescriptor desc) { - BeanProperty versionProperty = desc.getVersionProperty(); return (versionProperty == null) ? null : new BindableProperty(versionProperty); } @@ -35,7 +29,6 @@ public class FactoryVersion { * Create a Bindable for TenantId If multi-tenant with partitioning is on this bean type. */ public Bindable createTenantId(BeanDescriptor desc) { - BeanProperty tenant = desc.getTenantProperty(); if (tenant == null) { return null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java index 4ce1bb63d..60a32ea19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java @@ -8,12 +8,10 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; * Matches local embedded id properties to 'matching' properties from a * ManyToOne associated bean that is a 'imported primary key'. */ -class MatchedImportedEmbedded implements MatchedImportedProperty { +final class MatchedImportedEmbedded implements MatchedImportedProperty { private final BeanProperty localProp; - private final BeanPropertyAssocOne assocOne; - private final BeanProperty foreignProp; MatchedImportedEmbedded(BeanProperty localProp, BeanPropertyAssocOne assocOne, BeanProperty foreignProp) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java index 714e910dd..e4fa26284 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java @@ -4,15 +4,13 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; -class MatchedImportedFactory { +final class MatchedImportedFactory { /** * Create the array of matchedImportedProperty based on the properties and descriptor. */ static MatchedImportedProperty[] build(BeanProperty[] props, BeanDescriptor desc) { - MatchedImportedProperty[] matches = new MatchedImportedProperty[props.length]; - for (int i = 0; i < props.length; i++) { // find matching assoc one property for dbColumn matches[i] = findMatch(props[i], desc); @@ -25,12 +23,9 @@ class MatchedImportedFactory { } private static MatchedImportedProperty findMatch(BeanProperty prop, BeanDescriptor desc) { - // find matching against the local database column String dbColumn = prop.getDbColumn(); - - BeanPropertyAssocOne[] assocOnes = desc.propertiesOne(); - for (BeanPropertyAssocOne assocOne1 : assocOnes) { + for (BeanPropertyAssocOne assocOne1 : desc.propertiesOne()) { if (assocOne1.isImportedPrimaryKey()) { // search using the ImportedId from the assoc one BeanProperty foreignMatch = assocOne1.getImportedId().findMatchImport(dbColumn); @@ -39,14 +34,11 @@ class MatchedImportedFactory { } } } - - BeanProperty[] scalar = desc.propertiesBaseScalar(); - for (BeanProperty beanProperty : scalar) { + for (BeanProperty beanProperty : desc.propertiesBaseScalar()) { if (dbColumn.equals(beanProperty.getDbColumn())) { return new MatchedImportedScalar(prop, beanProperty); } } - // there was no matching assoc one property. // example UserRole bean missing assoc one to User? return null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java index 436ef69a5..de9907863 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java @@ -6,10 +6,9 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Matches local embedded id properties to 'matching' imported primary key scalar properties. */ -class MatchedImportedScalar implements MatchedImportedProperty { +final class MatchedImportedScalar implements MatchedImportedProperty { private final BeanProperty localProp; - private final BeanProperty foreignProp; MatchedImportedScalar(BeanProperty localProp, BeanProperty foreignProp) { @@ -19,7 +18,6 @@ class MatchedImportedScalar implements MatchedImportedProperty { @Override public void populate(EntityBean sourceBean, EntityBean embeddedId) { - Object value = foreignProp.getValue(sourceBean); localProp.setValue(embeddedId, value); } 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 3559a3a69..1a15b8438 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 @@ -11,7 +11,6 @@ import java.util.Collection; */ public class MultiValueBind { - @FunctionalInterface public interface BindOne { void bind(Object value) throws SQLException; 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 f90d5cfb8..f7d86f55e 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 @@ -6,7 +6,7 @@ import io.ebean.core.type.ScalarType; /** * Multi value binder that uses Postgres Array. */ -public class PostgresMultiValueBind extends AbstractMultiValueBind { +public final class PostgresMultiValueBind extends AbstractMultiValueBind { @Override public String getInExpression(boolean not, ScalarType type, int size) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java index 507938a96..d7d5b0fd2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java @@ -13,7 +13,7 @@ final class BasicProfileLocation implements ProfileLocation { BasicProfileLocation(String fullLocation) { this.fullLocation = fullLocation; - this.location = shortDesc(fullLocation); + this.location = UtilLocation.loc(fullLocation); this.label = UtilLocation.label(location); } @@ -57,15 +57,4 @@ final class BasicProfileLocation implements ProfileLocation { // do nothing } - private String shortDesc(String location) { - int lastPer = location.lastIndexOf('.'); - if (lastPer > -1) { - lastPer = location.lastIndexOf('.', lastPer - 1); - if (lastPer > -1) { - return location.substring(lastPer + 1); - } - } - return location; - } - } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java index 2cf7a25a7..693aa5de8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java @@ -9,10 +9,9 @@ import java.util.concurrent.atomic.LongAdder; /** * Used to collect counter metrics. */ -class DCountMetric implements CountMetric { +final class DCountMetric implements CountMetric { private final String name; - private final LongAdder count = new LongAdder(); DCountMetric(String name) { @@ -49,7 +48,7 @@ class DCountMetric implements CountMetric { @Override public void visit(MetricVisitor visitor) { - long val = visitor.isReset() ? count.sumThenReset() : count.sum(); + long val = visitor.reset() ? count.sumThenReset() : count.sum(); if (val > 0) { visitor.visitCount(new DCountMetricStats(name, val)); } @@ -66,12 +65,12 @@ class DCountMetric implements CountMetric { } @Override - public String getName() { + public String name() { return name; } @Override - public long getCount() { + public long count() { return count; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java index 633c4c505..d51ff2198 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java @@ -10,7 +10,7 @@ import io.ebean.metric.TimedMetricMap; /** * Default metric factory implementation. */ -public class DMetricFactory implements MetricFactory { +public final class DMetricFactory implements MetricFactory { @Override public TimedMetricMap createTimedMetricMap(String name) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java index c5ff7d3ac..df4c44c56 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java @@ -8,17 +8,12 @@ import io.ebean.ProfileLocation; class DProfileLocation implements ProfileLocation { private static final String IO_EBEAN = "io.ebean"; - private static final String UNKNOWN = "unknown"; private String fullLocation; - private String location; - private String label; - private final int lineNumber; - private int traceCount; DProfileLocation() { @@ -49,10 +44,10 @@ class DProfileLocation implements ProfileLocation { return false; } final String loc = create(); - final String shortDesc = shortDesc(loc); - label = UtilLocation.label(shortDesc); - location = shortDesc; - fullLocation = loc; + final String location = UtilLocation.loc(loc); + this.label = UtilLocation.label(location); + this.location = location; + this.fullLocation = loc; initWith(label); return true; } @@ -113,20 +108,4 @@ class DProfileLocation implements ProfileLocation { return traceLine.substring(0, traceLine.length() - 1) + ":" + lineNumber + ")"; } } - - private String shortDesc(String location) { - int pos = location.lastIndexOf('('); - if (pos == -1) { - pos = location.length(); - } - - pos = location.lastIndexOf('.', pos); - if (pos > -1) { - pos = location.lastIndexOf('.', pos - 1); - if (pos > -1) { - return location.substring(pos + 1); - } - } - return location; - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java index ebf5e78c0..cc6e19bd3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java @@ -8,7 +8,7 @@ import io.ebean.service.SpiProfileLocationFactory; /** * Default implementation of the profile location factory. */ -public class DProfileLocationFactory implements SpiProfileLocationFactory { +public final class DProfileLocationFactory implements SpiProfileLocationFactory { @Override public ProfileLocation create() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java index 0690b5fdd..879d2ee6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.profile; import io.ebean.ProfileLocation; import io.ebeaninternal.server.util.Md5; -class DQueryPlanMeta { +final class DQueryPlanMeta { private final Class type; private final String label; @@ -22,15 +22,8 @@ class DQueryPlanMeta { name += "_" + label; } this.name = name; - this.hash = initHash(); - } - - private String initHash() { - StringBuilder sb = new StringBuilder(sql).append("|").append(name); - if (profileLocation != null) { - sb.append("|").append(profileLocation.location()); - } - return Md5.hash(sb.toString()); + String loc = profileLocation == null ? null : profileLocation.location(); + this.hash = Md5.hash(sql, name, loc); } public Class getType() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java index 21559a152..723c24511 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java @@ -6,7 +6,7 @@ import io.ebean.metric.QueryPlanMetric; import io.ebean.metric.TimedMetric; import io.ebean.metric.TimedMetricStats; -class DQueryPlanMetric implements QueryPlanMetric { +final class DQueryPlanMetric implements QueryPlanMetric { private final DQueryPlanMeta meta; private final DTimedMetric metric; @@ -19,7 +19,7 @@ class DQueryPlanMetric implements QueryPlanMetric { @Override public void visit(MetricVisitor visitor) { - TimedMetricStats stats = metric.collect(visitor.isReset()); + TimedMetricStats stats = metric.collect(visitor.reset()); if (stats != null) { visitor.visitQuery(new Stats(meta, stats, collected)); collected = true; @@ -45,11 +45,11 @@ class DQueryPlanMetric implements QueryPlanMetric { @Override public String toString() { - return meta + " " + stats + " sql:" + getSql(); + return meta + " " + stats + " sql:" + sql(); } @Override - public Class getType() { + public Class type() { return meta.getType(); } @@ -59,48 +59,48 @@ class DQueryPlanMetric implements QueryPlanMetric { } @Override - public String getHash() { + public String hash() { return meta.getHash(); } @Override - public String getLabel() { + public String label() { return meta.getLabel(); } @Override - public String getSql() { + public String sql() { return meta.getSql(); } @Override - public String getName() { + public String name() { return meta.getName(); } @Override - public String getLocation() { + public String location() { return meta.getLocation(); } @Override - public long getCount() { - return stats.getCount(); + public long count() { + return stats.count(); } @Override - public long getTotal() { - return stats.getTotal(); + public long total() { + return stats.total(); } @Override - public long getMax() { - return stats.getMax(); + public long max() { + return stats.max(); } @Override - public long getMean() { - return stats.getMean(); + public long mean() { + return stats.mean(); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java index 54146abe9..900f47aae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java @@ -5,19 +5,14 @@ import io.ebean.metric.TimedMetricStats; /** * Snapshot of the current statistics for a Counter or TimeCounter. */ -class DTimeMetricStats implements TimedMetricStats { - - private String name; +final class DTimeMetricStats implements TimedMetricStats { private final boolean collected; - - private String location; - private final long count; - private final long total; - private final long max; + private String name; + private String location; DTimeMetricStats(String name, boolean collected, long count, long total, long max) { this.name = name; @@ -60,12 +55,12 @@ class DTimeMetricStats implements TimedMetricStats { } @Override - public String getName() { + public String name() { return name; } @Override - public String getLocation() { + public String location() { return location; } @@ -73,7 +68,7 @@ class DTimeMetricStats implements TimedMetricStats { * Return the count of values collected. */ @Override - public long getCount() { + public long count() { return count; } @@ -81,7 +76,7 @@ class DTimeMetricStats implements TimedMetricStats { * Return the total of all the values. */ @Override - public long getTotal() { + public long total() { return total; } @@ -89,7 +84,7 @@ class DTimeMetricStats implements TimedMetricStats { * Return the Max value collected. */ @Override - public long getMax() { + public long max() { return max; } @@ -97,7 +92,7 @@ class DTimeMetricStats implements TimedMetricStats { * Return the mean value rounded up. */ @Override - public long getMean() { + public long mean() { return (count < 1) ? 0L : Math.round((double)(total / count)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java index 63eb275f6..a62fef911 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java @@ -12,16 +12,12 @@ import java.util.concurrent.atomic.LongAdder; * It is intended for high concurrent updates to the statistics and relatively infrequent reads. *

*/ -class DTimedMetric implements TimedMetric { +final class DTimedMetric implements TimedMetric { private final String name; - private final LongAdder count = new LongAdder(); - private final LongAdder total = new LongAdder(); - private final LongAccumulator max = new LongAccumulator(Math::max, Long.MIN_VALUE); - private boolean collected; DTimedMetric(String name) { @@ -71,7 +67,7 @@ class DTimedMetric implements TimedMetric { @Override public void visit(MetricVisitor visitor) { - DTimeMetricStats metric = collect(visitor.isReset()); + DTimeMetricStats metric = collect(visitor.reset()); if (metric != null) { visitor.visitTimed(metric); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java index 7ef4e9084..2164f86c7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java @@ -7,14 +7,11 @@ import io.ebean.metric.TimedMetricStats; /** * Default profile location that uses stack trace. */ -class DTimedProfileLocation extends DProfileLocation implements TimedProfileLocation { +final class DTimedProfileLocation extends DProfileLocation implements TimedProfileLocation { private final String label; - private final TimedMetric timedMetric; - private final boolean overrideMetricName; - private String fullName; DTimedProfileLocation(int lineNumber, String label, TimedMetric timedMetric) { @@ -48,7 +45,7 @@ class DTimedProfileLocation extends DProfileLocation implements TimedProfileLoca @Override public void visit(MetricVisitor visitor) { - TimedMetricStats collect = timedMetric.collect(visitor.isReset()); + TimedMetricStats collect = timedMetric.collect(visitor.reset()); if (collect != null) { if (overrideMetricName) { collect.setName(fullName); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java index 1a5f8ff07..350dd6688 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java @@ -7,7 +7,7 @@ import java.util.List; /** * Global registry of the TimedProfileLocation instances created. */ -public class TimedProfileLocationRegistry { +public final class TimedProfileLocationRegistry { private static final List list = Collections.synchronizedList(new ArrayList<>()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java index 7b70dfcb7..65ab1ce4d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java @@ -2,15 +2,30 @@ package io.ebeaninternal.server.profile; final class UtilLocation { - static String label(String shortDescription) { - int pos = shortDescription.indexOf("("); - if (pos == -1) { - return shortDescription; + static String loc(String full) { + final int pos = full.lastIndexOf('('); + if (pos > -1) { + return full.substring(0, pos); } else { - return trimInit(shortDescription.substring(0, pos)); + return full; } } + static String label(String location) { + return trimInit(shortDesc(location)); + } + + private static String shortDesc(String location) { + int pos = location.lastIndexOf('.'); + if (pos > -1) { + pos = location.lastIndexOf('.', pos - 1); + if (pos > -1) { + return location.substring(pos + 1); + } + } + return location; + } + /** * Trim constructor init to be "safe" without greater than or less than chars. */ @@ -21,5 +36,4 @@ final class UtilLocation { } return desc; } - } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java index e00fdf497..ec56da19d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java @@ -8,10 +8,9 @@ import java.util.Map; /** * Determines the properties on a given bean. */ -public class BeanPropertiesReader { +public final class BeanPropertiesReader { private final Map propertyIndexMap = new HashMap<>(); - private final String[] props; public BeanPropertiesReader(Class clazz) { @@ -38,7 +37,6 @@ public class BeanPropertiesReader { try { Field field = clazz.getField("_ebean_props"); return (String[]) field.get(null); - } catch (Exception e) { throw new IllegalStateException("Error getting _ebean_props field on type " + clazz, e); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java b/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java index e4d9e9839..e7e48b6f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java @@ -9,23 +9,20 @@ public final class EnhanceBeanPropertyAccess implements BeanPropertyAccess { private static final int CACHE_SIZE = 30; - private final BeanPropertyGetter[] getters = initGetters(CACHE_SIZE); - private final BeanPropertySetter[] setters = initSetters(CACHE_SIZE); + private final BeanPropertyGetter[] getters = initGetters(); + private final BeanPropertySetter[] setters = initSetters(); - public EnhanceBeanPropertyAccess() { - } - - private BeanPropertyGetter[] initGetters(int count) { - BeanPropertyGetter[] getters = new BeanPropertyGetter[count]; - for (int i = 0; i < count; i++) { + private BeanPropertyGetter[] initGetters() { + BeanPropertyGetter[] getters = new BeanPropertyGetter[CACHE_SIZE]; + for (int i = 0; i < CACHE_SIZE; i++) { getters[i] = new Getter(i); } return getters; } - private BeanPropertySetter[] initSetters(int count) { - BeanPropertySetter[] setters = new BeanPropertySetter[count]; - for (int i = 0; i < count; i++) { + private BeanPropertySetter[] initSetters() { + BeanPropertySetter[] setters = new BeanPropertySetter[CACHE_SIZE]; + for (int i = 0; i < CACHE_SIZE; i++) { setters[i] = new Setter(i); } return setters; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java index 93c86fe7b..e71334ea6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java @@ -26,22 +26,22 @@ abstract class BaseFuture implements Future { } @Override - public T get() throws InterruptedException, ExecutionException { + public final T get() throws InterruptedException, ExecutionException { return futureTask.get(); } @Override - public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return futureTask.get(timeout, unit); } @Override - public boolean isCancelled() { + public final boolean isCancelled() { return futureTask.isCancelled(); } @Override - public boolean isDone() { + public final boolean isDone() { return futureTask.isDone(); } 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 e7674a31c..e9d2281d0 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 @@ -37,7 +37,7 @@ import java.util.concurrent.locks.ReentrantLock; * The tree structure is flattened into a SqlSelectChain. The SqlSelectChain is * the key object used in reading the flat resultSet back into Objects. */ -public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTransactionEvent { +public final class CQuery implements DbReadContext, CancelableQuery, SpiProfileTransactionEvent { private static final Logger logger = LoggerFactory.getLogger(CQuery.class); @@ -541,9 +541,13 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran updateStatistics(); } + long micros() { + return (System.nanoTime() - startNano) / 1000L; + } + private void updateStatistics() { try { - executionTimeMicros = (System.nanoTime() - startNano) / 1000L; + executionTimeMicros = micros(); if (autoTuneProfiling) { profilingListener.collectQueryInfo(objectGraphNode, loadedBeanCount, executionTimeMicros); } 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 e3a1a5e54..559dfa0da 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 @@ -7,7 +7,7 @@ import io.ebeaninternal.server.type.bindcapture.BindCapture; import java.util.concurrent.locks.ReentrantLock; -class CQueryBindCapture implements SpiQueryBindCapture { +final class CQueryBindCapture implements SpiQueryBindCapture { private static final double multiplier = 1.5d; 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 41439e4b6..09b465893 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 @@ -40,15 +40,13 @@ import java.util.List; * Generates the SQL SELECT statements taking into account the physical * deployment properties. */ -class CQueryBuilder { +final class CQueryBuilder { private final String columnAliasPrefix; private final SqlLimiter sqlLimiter; private final CQueryBuilderRawSql rawSqlHandler; private final Binder binder; - private final boolean selectCountWithAlias; - private final CQueryHistorySupport historySupport; private final CQueryDraftSupport draftSupport; private final DatabasePlatform dbPlatform; @@ -79,7 +77,6 @@ class CQueryBuilder { if (sb.length() > 0) { sb.append(", "); } - sb.append(name); sb.append("."); sb.append(token.trim()); @@ -91,7 +88,6 @@ class CQueryBuilder { * Build the delete query. */ CQueryUpdate buildUpdateQuery(boolean deleteRequest, OrmQueryRequest request) { - SpiQuery query = request.getQuery(); String rootTableAlias = query.getAlias(); query.setupForDeleteOrUpdate(); @@ -105,7 +101,6 @@ class CQueryBuilder { } predicates.prepare(true); - SqlTree sqlTree = createSqlTree(request, predicates); String sql; @@ -114,7 +109,6 @@ class CQueryBuilder { } else { sql = buildUpdateSql(request, rootTableAlias, predicates, sqlTree); } - // cache the query plan queryPlan = new CQueryPlan(request, sql, sqlTree, predicates.getLogWhereSql()); request.putQueryPlan(queryPlan); @@ -122,7 +116,6 @@ class CQueryBuilder { } private String buildDeleteSql(OrmQueryRequest request, String rootTableAlias, CQueryPredicates predicates, SqlTree sqlTree) { - String alias = alias(rootTableAlias); if (sqlTree.noJoins() && !request.getQuery().hasMaxRowsOrFirstRow()) { if (dbPlatform.isSupportsDeleteTableAlias()) { @@ -151,7 +144,6 @@ class CQueryBuilder { } private String buildUpdateSql(OrmQueryRequest request, String rootTableAlias, CQueryPredicates predicates, SqlTree sqlTree) { - StringBuilder sb = new StringBuilder(200); sb.append("update ").append(request.getBeanDescriptor().getBaseTable()); if (rootTableAlias != null) { @@ -159,7 +151,6 @@ class CQueryBuilder { } sb.append(" set ").append(predicates.getDbUpdateClause()); String updateClause = sb.toString(); - if (sqlTree.noJoins() && request.isInlineSqlUpdateLimit()) { // simple - update table set ... where ... return aliasStrip(buildSqlUpdate(updateClause, request, predicates, sqlTree).getSql()); @@ -186,7 +177,6 @@ class CQueryBuilder { } CQueryFetchSingleAttribute buildFetchAttributeQuery(OrmQueryRequest request) { - SpiQuery query = request.getQuery(); query.setSingleAttribute(); if (!query.isIncludeSoftDeletes()) { @@ -218,7 +208,6 @@ class CQueryBuilder { * Build the find ids query. */ CQueryFetchSingleAttribute buildFetchIdsQuery(OrmQueryRequest request) { - SpiQuery query = request.getQuery(); query.setSelectId(); BeanDescriptor desc = request.getBeanDescriptor(); @@ -246,9 +235,7 @@ class CQueryBuilder { * Build the row count query. */ CQueryRowCount buildRowCountQuery(OrmQueryRequest request) { - SpiQuery query = request.getQuery(); - // always set the order by to null for row count query query.setOrder(null); query.setFirstRow(0); @@ -310,7 +297,6 @@ class CQueryBuilder { // cache the query plan queryPlan = new CQueryPlan(request, sql, sqlTree, predicates.getLogWhereSql()); request.putQueryPlan(queryPlan); - return new CQueryRowCount(queryPlan, request, predicates); } @@ -334,9 +320,7 @@ class CQueryBuilder { * names to physical deployment column names. */ CQuery buildQuery(OrmQueryRequest request) { - CQueryPredicates predicates = new CQueryPredicates(binder, request); - CQueryPlan queryPlan = request.getQueryPlan(); if (queryPlan != null) { // Reuse the query plan so skip generating SqlTree and SQL. @@ -370,7 +354,6 @@ class CQueryBuilder { boolean rawSql = request.isRawSql(); if (rawSql) { queryPlan = new CQueryPlanRawSql(request, res, sqlTree, predicates.getLogWhereSql()); - } else { queryPlan = new CQueryPlan(request, res, sqlTree, false, predicates.getLogWhereSql()); } @@ -380,11 +363,9 @@ class CQueryBuilder { // log the query plan based bean type (i.e. ignoring query disabling for logging the sql/plan) desc.getReadAuditLogger().queryPlan(new ReadAuditQueryPlan(desc.getFullName(), queryPlan.getAuditQueryKey(), queryPlan.getSql())); } - // cache the query plan because we can reuse it and also // gather query performance statistics based on it. request.putQueryPlan(queryPlan); - return new CQuery<>(request, predicates, queryPlan); } @@ -393,18 +374,15 @@ class CQueryBuilder { *

* The SqlTree is immutable after construction and so is safe to use by * concurrent threads. - *

*

* The predicates is used to add additional joins that come from the where or * order by clauses that are not already included for the select clause. - *

*/ private SqlTree createSqlTree(OrmQueryRequest request, CQueryPredicates predicates) { return createSqlTree(request, predicates, false); } private SqlTree createSqlTree(OrmQueryRequest request, CQueryPredicates predicates, boolean forceColumnAlias) { - if (request.isNativeSql()) { return createNativeSqlTree(request, predicates); } @@ -423,9 +401,7 @@ class CQueryBuilder { * Create the SqlTree by reading the ResultSetMetaData and mapping table/columns to bean property paths. */ private SqlTree createNativeSqlTree(OrmQueryRequest request, CQueryPredicates predicates) { - SpiQuery query = request.getQuery(); - // parse named parameters returning the final sql to execute String sql = predicates.parseBindParams(query.getNativeSql()); if (query.hasMaxRowsOrFirstRow()) { @@ -469,10 +445,8 @@ class CQueryBuilder { } private SqlTree createRawSqlSqlTree(OrmQueryRequest request, CQueryPredicates predicates) { - BeanDescriptor descriptor = request.getBeanDescriptor(); ColumnMapping columnMapping = request.getQuery().getRawSql().getColumnMapping(); - PathProperties pathProps = new PathProperties(); // convert list of columns into (tree like) PathProperties @@ -498,12 +472,10 @@ class CQueryBuilder { } OrmQueryDetail detail = new OrmQueryDetail(); - // transfer PathProperties into OrmQueryDetail for (PathProperties.Props props : pathProps.getPathProps()) { detail.fetch(props.getPath(), props.getProperties()); } - // check if @Id property included in RawSql boolean rawNoId = true; BeanProperty idProperty = descriptor.getIdProperty(); @@ -511,7 +483,6 @@ class CQueryBuilder { // contains the @Id property for the root level bean rawNoId = false; } - // build SqlTree based on OrmQueryDetail of the RawSql return new SqlTreeBuilder(request, predicates, detail, rawNoId).build(); } @@ -603,7 +574,6 @@ class CQueryBuilder { private void appendSelect() { if (selectClause != null) { sb.append(selectClause); - } else { useSqlLimiter = (query.hasMaxRowsOrFirstRow() && select.getManyProperty() == null); if (!useSqlLimiter) { 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 2bc60d208..d3b4e7ca6 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 @@ -11,7 +11,7 @@ import io.ebeaninternal.server.querydefn.OrmQueryLimitRequest; import io.ebeaninternal.server.rawsql.SpiRawSql; import io.ebeaninternal.server.util.BindParamsParser; -class CQueryBuilderRawSql { +final class CQueryBuilderRawSql { private final SqlLimiter sqlLimiter; private final DatabasePlatform dbPlatform; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java index ac4230999..cf8adf097 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java @@ -7,7 +7,7 @@ import io.ebean.bean.EntityBean; * A NOOP based CQueryCollectionAdd for use with lazy loading many queries where the * beans loaded into the collection are added to the collection(s) of the parent(s). */ -class CQueryCollectionAddNoop implements CQueryCollectionAdd { +final class CQueryCollectionAddNoop implements CQueryCollectionAdd { /** * Return null as we are not collecting the beans. 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 da1e01cac..771ff8145 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 @@ -5,7 +5,7 @@ import java.util.Map; /** * Support 'asDraft' queries. */ -class CQueryDraftSupport { +final class CQueryDraftSupport { /** * The mapping of base tables to their matching 'draft' 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 a1a211c0a..b76d0b4e9 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 @@ -33,7 +33,7 @@ import java.util.Map; /** * Handles the Object Relational fetching. */ -public class CQueryEngine { +public final class CQueryEngine { private static final Logger logger = LoggerFactory.getLogger(CQueryEngine.class); @@ -79,15 +79,10 @@ public class CQueryEngine { private int executeUpdate(OrmQueryRequest request, CQueryUpdate query) { try { int rows = query.execute(); - if (request.isLogSql()) { - String logSql = query.getGeneratedSql(); - logSql = Str.add(logSql, "; --bind(", query.getBindLog(), ") rows:", String.valueOf(rows)); - request.logSql(logSql); + request.logSql(Str.add(query.getGeneratedSql(), "; --bind(", query.getBindLog(), ") --micros(", query.micros() + ") --rows(", rows + ")")); } - return rows; - } catch (SQLException e) { throw translate(request, query.getBindLog(), query.getGeneratedSql(), e); } @@ -97,7 +92,6 @@ public class CQueryEngine { * Build and execute the findSingleAttributeList query. */ public List findSingleAttributeList(OrmQueryRequest request) { - CQueryFetchSingleAttribute rcQuery = queryBuilder.buildFetchAttributeQuery(request); request.setCancelableQuery(rcQuery); return findAttributeList(request, rcQuery); @@ -108,14 +102,13 @@ public class CQueryEngine { try { List list = (List) rcQuery.findList(); if (request.isLogSql()) { - logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog()); + logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog(), rcQuery.micros()); } if (request.isLogSummary()) { request.getTransaction().logSummary(rcQuery.getSummary()); } if (request.isQueryCachePut()) { request.addDependentTables(rcQuery.getDependentTables()); - list = Collections.unmodifiableList(list); request.putToQueryCache(list); if (Boolean.FALSE.equals(request.getQuery().isReadOnly())) { @@ -123,7 +116,6 @@ public class CQueryEngine { } } return list; - } catch (SQLException e) { throw translate(request, rcQuery.getBindLog(), rcQuery.getGeneratedSql(), e); } @@ -139,10 +131,8 @@ public class CQueryEngine { String msg = "ERROR executing query, bindLog[" + bindLog + "] error[" + StringHelper.removeNewLines(e.getMessage()) + "]"; t.logSummary(msg); } - // ensure 'rollback' is logged if queryOnly transaction t.getConnection(); - // 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); @@ -152,46 +142,37 @@ public class CQueryEngine { * Build and execute the find Id's query. */ public List findIds(OrmQueryRequest request) { - CQueryFetchSingleAttribute rcQuery = queryBuilder.buildFetchIdsQuery(request); request.setCancelableQuery(rcQuery); return findAttributeList(request, rcQuery); } - private void logGeneratedSql(OrmQueryRequest request, String sql, String bindLog) { - request.logSql(Str.add(sql, "; --bind(", bindLog, ")")); + private void logGeneratedSql(OrmQueryRequest request, String sql, String bindLog, long micros) { + request.logSql(Str.add(sql, "; --bind(", bindLog, ") --micros(", micros + ")")); } /** * Build and execute the row count query. */ public int findCount(OrmQueryRequest request) { - CQueryRowCount rcQuery = queryBuilder.buildRowCountQuery(request); request.setCancelableQuery(rcQuery); try { - int count = rcQuery.findCount(); - if (request.isLogSql()) { - logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog()); + logGeneratedSql(request, rcQuery.getGeneratedSql(), rcQuery.getBindLog(), rcQuery.micros()); } - if (request.isLogSummary()) { request.getTransaction().logSummary(rcQuery.getSummary()); } - if (request.getQuery().isFutureFetch()) { request.getTransaction().end(); } - if (request.isQueryCachePut()) { request.addDependentTables(rcQuery.getDependentTables()); request.putToQueryCache(count); } - return count; - } catch (SQLException e) { throw translate(request, rcQuery.getBindLog(), rcQuery.getGeneratedSql(), e); } @@ -254,9 +235,7 @@ public class CQueryEngine { * Execute the find versions query returning version beans. */ public List> findVersions(OrmQueryRequest request) { - SpiQuery query = request.getQuery(); - String sysPeriodLower = getSysPeriodLower(query); if (query.isVersionsBetween() && !historySupport.isStandardsBased()) { query.where().lt(sysPeriodLower, query.getVersionEnd()); @@ -272,26 +251,21 @@ public class CQueryEngine { if (request.isLogSql()) { logSql(cquery); } - List> versions = cquery.readVersions(); // just order in memory rather than use NULLS LAST as that // is not universally supported, not expect huge list here versions.sort(OrderVersionDesc.INSTANCE); deriveVersionDiffs(versions, request); - if (request.isLogSummary()) { logFindManySummary(cquery); } - if (request.isAuditReads()) { cquery.auditFindMany(); } - return versions; } catch (SQLException e) { throw cquery.createPersistenceException(e); - } finally { if (cquery != null) { cquery.close(); @@ -300,9 +274,7 @@ public class CQueryEngine { } private void deriveVersionDiffs(List> versions, OrmQueryRequest request) { - BeanDescriptor descriptor = request.getBeanDescriptor(); - if (!versions.isEmpty()) { Version current = versions.get(0); if (versions.size() > 1) { @@ -367,10 +339,8 @@ public class CQueryEngine { * Find a list/map/set of beans. */ BeanCollection findMany(OrmQueryRequest request) { - CQuery cquery = queryBuilder.buildQuery(request); request.setCancelableQuery(cquery); - try { if (defaultFetchSizeFindList > 0) { request.setDefaultFetchBuffer(defaultFetchSizeFindList); @@ -380,30 +350,24 @@ public class CQueryEngine { logger.trace("Future fetch already cancelled"); return null; } - if (request.isLogSql()) { logSql(cquery); } - BeanCollection beanCollection = cquery.readCollection(); if (request.isLogSummary()) { logFindManySummary(cquery); } - if (request.isAuditReads()) { cquery.auditFindMany(); } - request.executeSecondaryQueries(false); if (request.isQueryCachePut()) { request.addDependentTables(cquery.getDependentTables()); } - return beanCollection; } catch (SQLException e) { throw cquery.createPersistenceException(e); - } finally { if (cquery != null) { cquery.close(); @@ -416,38 +380,27 @@ public class CQueryEngine { */ @SuppressWarnings("unchecked") public T find(OrmQueryRequest request) { - EntityBean bean = null; - CQuery cquery = queryBuilder.buildQuery(request); request.setCancelableQuery(cquery); - try { cquery.prepareBindExecuteQuery(); - if (request.isLogSql()) { logSql(cquery); } - if (cquery.readBean()) { bean = cquery.next(); } - if (request.isLogSummary()) { logFindBeanSummary(cquery); } - if (request.isAuditReads()) { cquery.auditFind(bean); } - request.executeSecondaryQueries(false); - return (T) bean; - } catch (SQLException e) { throw cquery.createPersistenceException(e); - } finally { cquery.close(); } @@ -457,17 +410,13 @@ public class CQueryEngine { * Log the generated SQL to the transaction log. */ private void logSql(CQuery query) { - - String sql = query.getGeneratedSql(); - sql = Str.add(sql, "; --bind(", query.getBindLog(), ")"); - query.getTransaction().logSql(sql); + query.getTransaction().logSql(Str.add(query.getGeneratedSql(), "; --bind(", query.getBindLog(), ") --micros(", query.micros() + ")")); } /** * Log the FindById summary to the transaction log. */ private void logFindBeanSummary(CQuery q) { - SpiQuery query = q.getQueryRequest().getQuery(); String loadMode = query.getLoadMode(); String loadDesc = query.getLoadDescription(); @@ -504,7 +453,6 @@ public class CQueryEngine { msg.append("exeMicros[").append(q.getQueryExecutionTimeMicros()); msg.append("] rows[").append(q.getLoadedRowDetail()); msg.append("] bind[").append(q.getBindLog()).append("]"); - q.getTransaction().logSummary(msg.toString()); } @@ -512,7 +460,6 @@ public class CQueryEngine { * Log the FindMany to the transaction log. */ private void logFindManySummary(CQuery q) { - SpiQuery query = q.getQueryRequest().getQuery(); String loadMode = query.getLoadMode(); String loadDesc = query.getLoadDescription(); @@ -551,7 +498,6 @@ public class CQueryEngine { msg.append("] rows[").append(q.getLoadedRowDetail()); msg.append("] predicates[").append(q.getLogWhereSql()); msg.append("] bind[").append(q.getBindLog()).append("]"); - q.getTransaction().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 b68813bd4..41f9e7f4d 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 @@ -24,50 +24,24 @@ import java.util.concurrent.locks.ReentrantLock; /** * Base compiled query request for single attribute queries. */ -class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, CancelableQuery { private static final Logger logger = LoggerFactory.getLogger(CQueryFetchSingleAttribute.class); private final CQueryPlan queryPlan; - - /** - * The overall find request wrapper object. - */ private final OrmQueryRequest request; - private final BeanDescriptor desc; - private final SpiQuery query; - - /** - * Where clause predicates. - */ private final CQueryPredicates predicates; - - /** - * The final sql that is generated. - */ private final String sql; - private RsetDataReader dataReader; - - /** - * The statement used to create the resultSet. - */ private PreparedStatement pstmt; - private String bindLog; - private long executionTimeMicros; - private int rowCount; - private final ScalarDataReader reader; - private final boolean containsCounts; - private long profileOffset; - private final ReentrantLock lock = new ReentrantLock(); /** @@ -95,19 +69,20 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Cancelab .append("] type[").append(desc.getName()) .append("] predicates[").append(predicates.getLogWhereSql()) .append("] bind[").append(bindLog).append("]"); - return sb.toString(); } + long micros() { + return executionTimeMicros; + } + /** * Execute the query returning the row count. */ List findList() throws SQLException { - long startNano = System.nanoTime(); try { prepareExecute(); - List result = new ArrayList<>(); while (dataReader.next()) { Object value = reader.read(dataReader); @@ -117,16 +92,13 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Cancelab result.add(value); rowCount++; } - executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); if (queryPlan.executionTime(executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } getTransaction().profileEvent(this); - return result; - } finally { close(); } @@ -158,14 +130,12 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, Cancelab profileOffset = t.profileOffset(); Connection conn = t.getInternalConnection(); pstmt = conn.prepareStatement(sql); - if (query.getBufferFetchSizeHint() > 0) { pstmt.setFetchSize(query.getBufferFetchSizeHint()); } if (query.getTimeout() > 0) { pstmt.setQueryTimeout(query.getTimeout()); } - bindLog = predicates.bind(pstmt, conn); } finally { lock.unlock(); 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 5f810c6da..e082c97eb 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 @@ -7,7 +7,7 @@ import java.util.Map; /** * Helper to support history functions. */ -class CQueryHistorySupport { +final class CQueryHistorySupport { /** * The DB specific support. 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 17cec9d15..d438ec747 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 @@ -9,7 +9,7 @@ import java.sql.SQLException; /** * QueryIterator that does not require a buffer for secondary queries. */ -class CQueryIteratorSimple implements QueryIterator { +final class CQueryIteratorSimple implements QueryIterator { private final CQuery cquery; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java index e2a9bdad2..ad1a924b5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java @@ -11,7 +11,7 @@ import java.util.NoSuchElementException; /** * A QueryIterator that uses a buffer to execute secondary queries periodically. */ -class CQueryIteratorWithBuffer implements QueryIterator { +final class CQueryIteratorWithBuffer implements QueryIterator { private final CQuery cquery; private final int bufferSize; 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 c325255ef..ffb65a039 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 @@ -13,7 +13,7 @@ import java.util.List; /** * Creates the order by expression clause. */ -class CQueryOrderBy { +final class CQueryOrderBy { private final BeanDescriptor desc; 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 295cbe7c2..aef2c1164 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 @@ -13,12 +13,12 @@ import io.ebeaninternal.api.SpiQueryBindCapture; import io.ebeaninternal.api.SpiQueryPlan; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.timezone.DataTimeZone; +import io.ebeaninternal.server.util.Md5; import io.ebeaninternal.server.util.Str; import io.ebeaninternal.server.query.CQueryPlanStats.Snapshot; import io.ebeaninternal.server.type.DataBind; import io.ebeaninternal.server.type.DataBindCapture; import io.ebeaninternal.server.type.RsetDataReader; -import io.ebeaninternal.server.util.Md5; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,46 +54,31 @@ public class CQueryPlan implements SpiQueryPlan { static final String RESULT_SET_BASED_RAW_SQL = "--ResultSetBasedRawSql"; private final SpiEbeanServer server; - private final ProfileLocation profileLocation; - private final String location; - private final String label; - private final String name; - private final CQueryPlanKey planKey; - private final boolean rawSql; - private final String sql; private final String hash; - private final String logWhereSql; - private final SqlTree sqlTree; /** * Encrypted properties required additional binding. */ private final STreeProperty[] encryptedProps; - private final CQueryPlanStats stats; - private final Class beanType; - final DataTimeZone dataTimeZone; - private final int asOfTableCount; /** * Key used to identify the query plan in audit logging. */ private volatile String auditQueryHash; - private final Set dependentTables; - private final SpiQueryBindCapture bindCapture; /** @@ -106,9 +91,9 @@ public class CQueryPlan implements SpiQueryPlan { this.planKey = request.getQueryPlanKey(); SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); + this.location = (profileLocation == null) ? null : profileLocation.location(); this.label = query.getPlanLabel(); this.name = deriveName(label, query.getType(), request.getBeanDescriptor().getSimpleName()); - this.location = location(); this.asOfTableCount = query.getAsOfTableCount(); this.sql = sqlRes.getSql(); this.sqlTree = sqlTree; @@ -118,7 +103,7 @@ public class CQueryPlan implements SpiQueryPlan { this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCapture(query); - this.hash = md5Hash(); + this.hash = Md5.hash(sql, name, location); } /** @@ -130,9 +115,9 @@ public class CQueryPlan implements SpiQueryPlan { this.beanType = request.getBeanDescriptor().getBeanType(); SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); + this.location = (profileLocation == null) ? null : profileLocation.location(); this.label = query.getPlanLabel(); this.name = deriveName(label, query.getType(), request.getBeanDescriptor().getSimpleName()); - this.location = location(); this.planKey = buildPlanKey(sql, logWhereSql); this.asOfTableCount = 0; this.sql = sql; @@ -143,7 +128,7 @@ public class CQueryPlan implements SpiQueryPlan { this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCaptureRaw(sql, query); - this.hash = md5Hash(); + this.hash = Md5.hash(sql, name, location); } private String deriveName(String label, SpiQuery.Type type, String simpleName) { @@ -169,10 +154,6 @@ public class CQueryPlan implements SpiQueryPlan { return sql.equals(RESULT_SET_BASED_RAW_SQL) || query.getType().isUpdate() ? SpiQueryBindCapture.NOOP : server.createQueryBindCapture(this); } - private String location() { - return (profileLocation == null) ? null : profileLocation.location(); - } - private CQueryPlanKey buildPlanKey(String sql, String logWhereSql) { return new RawSqlQueryPlanKey(sql, false, logWhereSql); } @@ -183,49 +164,49 @@ public class CQueryPlan implements SpiQueryPlan { } @Override - public Class getBeanType() { + public final Class getBeanType() { return beanType; } @Override - public String getName() { + public final String getName() { return name; } @Override - public String getHash() { + public final String getHash() { return hash; } @Override - public String getSql() { + public final String getSql() { return sql; } @Override - public ProfileLocation getProfileLocation() { + public final ProfileLocation getProfileLocation() { return profileLocation; } - public String getLabel() { + public final String getLabel() { return label; } - public Set getDependentTables() { + public final Set getDependentTables() { return dependentTables; } - public String getLocation() { + public final String getLocation() { return location; } @Override - public void queryPlanInit(long thresholdMicros) { + public final void queryPlanInit(long thresholdMicros) { bindCapture.queryPlanInit(thresholdMicros); } @Override - public DQueryPlanOutput createMeta(String bind, String planString) { + public final DQueryPlanOutput createMeta(String bind, String planString) { return new DQueryPlanOutput(getBeanType(), name, hash, sql, profileLocation, bind, planString); } @@ -236,7 +217,7 @@ public class CQueryPlan implements SpiQueryPlan { /** * Bind keys for encrypted properties if necessary returning the DataBind. */ - DataBind bindEncryptedProperties(PreparedStatement stmt, Connection conn) throws SQLException { + final DataBind bindEncryptedProperties(PreparedStatement stmt, Connection conn) throws SQLException { DataBind dataBind = new DataBind(dataTimeZone, stmt, conn); if (encryptedProps != null) { for (STreeProperty encryptedProp : encryptedProps) { @@ -256,14 +237,14 @@ public class CQueryPlan implements SpiQueryPlan { return dataBind; } - int getAsOfTableCount() { + final int getAsOfTableCount() { return asOfTableCount; } /** * Return a key used in audit logging to identify the query. */ - String getAuditQueryKey() { + final String getAuditQueryKey() { if (auditQueryHash == null) { // volatile object assignment (so happy for multithreaded access) auditQueryHash = calcAuditQueryKey(); @@ -276,44 +257,29 @@ public class CQueryPlan implements SpiQueryPlan { return rawSql ? planKey.getPartialKey() + "_" + hash : planKey.getPartialKey(); } - /** - * Return the MD5 hash of the sql. - */ - private String md5Hash() { - StringBuilder sb = new StringBuilder(sql) - .append("|").append(name) - .append("|").append(location); - try { - return Md5.hash(sb.toString()); - } catch (Exception e) { - logger.error("Failed to MD5 hash the query", e); - return "error"; - } - } - - SqlTree getSqlTree() { + final SqlTree getSqlTree() { return sqlTree; } - public boolean isRawSql() { + public final boolean isRawSql() { return rawSql; } - String getLogWhereSql() { + final String getLogWhereSql() { return logWhereSql; } /** * Reset the query statistics. */ - public void resetStatistics() { + public final void resetStatistics() { stats.reset(); } /** * Register an execution time against this query plan; */ - boolean executionTime(long timeMicros) { + final boolean executionTime(long timeMicros) { stats.add(timeMicros); return bindCapture != null && bindCapture.collectFor(timeMicros); } @@ -321,33 +287,33 @@ public class CQueryPlan implements SpiQueryPlan { /** * Return a copy of the current query statistics. */ - public Snapshot getSnapshot(boolean reset) { + public final Snapshot getSnapshot(boolean reset) { return stats.getSnapshot(reset); } /** * Return the time this query plan was last used. */ - public long getLastQueryTime() { + public final long getLastQueryTime() { return stats.getLastQueryTime(); } - ScalarDataReader getSingleAttributeScalarType() { + final ScalarDataReader getSingleAttributeScalarType() { return sqlTree.getRootNode().getSingleAttributeReader(); } /** * Return true if there are no statistics collected since the last reset. */ - public boolean isEmptyStats() { + public final boolean isEmptyStats() { return stats.isEmpty(); } - TimedMetric createTimedMetric() { + final TimedMetric createTimedMetric() { return MetricFactory.get().createTimedMetric(label); } - void captureBindForQueryPlan(CQueryPredicates predicates, long executionTimeMicros) { + final void captureBindForQueryPlan(CQueryPredicates predicates, long executionTimeMicros) { final long startNanos = System.nanoTime(); try { DataBindCapture capture = bindCapture(); 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 4ff62f44d..499e801d3 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 @@ -20,7 +20,7 @@ import java.util.concurrent.ConcurrentHashMap; import static java.util.Collections.emptyList; -public class CQueryPlanManager implements QueryPlanManager { +public final class CQueryPlanManager implements QueryPlanManager { private static final Logger log = LoggerFactory.getLogger(CQueryPlanManager.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java index bab955d84..a23114bf2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java @@ -12,7 +12,7 @@ import java.util.List; /** * RawSql based query plan. */ -class CQueryPlanRawSql extends CQueryPlan { +final class CQueryPlanRawSql extends CQueryPlan { private final int[] rsetIndexPositions; @@ -27,7 +27,6 @@ class CQueryPlanRawSql extends CQueryPlan { } private int[] createIndexPositions(OrmQueryRequest request, SqlTree sqlTree) { - List chain = sqlTree.buildRawSqlSelectChain(); ColumnMapping columnMapping = request.getQuery().getRawSql().getColumnMapping(); 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 86e15f389..00b202d57 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 @@ -11,7 +11,7 @@ import java.util.List; /** * Captures database query plans. */ -class CQueryPlanRequest { +final class CQueryPlanRequest { private final List plans = new ArrayList<>(); @@ -19,15 +19,15 @@ class CQueryPlanRequest { private final long since; private final int maxCount; private final long maxTime; - private Iterator iterator; + private final Iterator iterator; CQueryPlanRequest(Connection connection, QueryPlanRequest req, Iterator iterator) { this.connection = connection; this.iterator = iterator; - this.maxCount = req.getMaxCount(); - long reqSince = req.getSince(); + this.maxCount = req.maxCount(); + long reqSince = req.since(); this.since = (reqSince == 0) ? Long.MAX_VALUE: reqSince; - long maxTimeMillis = req.getMaxTimeMillis(); + long maxTimeMillis = req.maxTimeMillis(); this.maxTime = maxTimeMillis > 0 ? System.currentTimeMillis() + maxTimeMillis : 0; } 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 23de6de5c..05ad13173 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 @@ -10,11 +10,8 @@ import io.ebean.metric.TimedMetricStats; public final class CQueryPlanStats { private final CQueryPlan queryPlan; - private final TimedMetric timedMetric; - private boolean collected; - private long lastQueryTime; /** @@ -83,56 +80,56 @@ public final class CQueryPlanStats { @Override public String toString() { - return "label:" + getLabel() + " location:" + getLocation() + " metrics:" + metrics + " sql:" + getSql(); + return "label:" + label() + " location:" + location() + " metrics:" + metrics + " sql:" + sql(); } @Override - public Class getType() { + public Class type() { return queryPlan.getBeanType(); } @Override - public String getLabel() { + public String label() { return queryPlan.getLabel(); } @Override - public String getName() { + public String name() { return queryPlan.getName(); } @Override - public String getLocation() { + public String location() { return queryPlan.getLocation(); } @Override - public long getCount() { - return metrics.getCount(); + public long count() { + return metrics.count(); } @Override - public long getTotal() { - return metrics.getTotal(); + public long total() { + return metrics.total(); } @Override - public long getMax() { - return metrics.getMax(); + public long max() { + return metrics.max(); } @Override - public long getMean() { - return metrics.getMean(); + public long mean() { + return metrics.mean(); } @Override - public String getHash() { + public String hash() { return queryPlan.getHash(); } @Override - public String getSql() { + public String sql() { return queryPlan.getSql(); } 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 bc0588949..94d4800f2 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 @@ -38,74 +38,51 @@ import java.util.Set; * named parameters and expression values into the prepared statement. *

*/ -public class CQueryPredicates { +public final class CQueryPredicates { private static final Logger logger = LoggerFactory.getLogger(CQueryPredicates.class); private final Binder binder; - private final OrmQueryRequest request; - private final SpiQuery query; - private final Object idValue; - - /** - * Named bind parameters. - */ private final BindParams bindParams; - - /** - * Bind values from the where expressions. - */ private DefaultExpressionRequest filterMany; - /** * SQL generated from the where expressions. */ private String filterManyExprSql; - /** * Bind values from the where expressions. */ private DefaultExpressionRequest where; - /** * SQL generated from the where expressions. */ private String whereExprSql; - /** * Bind values for having expression. */ private DefaultExpressionRequest having; - /** * SQL generated from the having expression. */ private String havingExprSql; - private String dbHaving; - /** * logicalWhere with property names converted to db columns. */ private String dbWhere; - /** * Filter than can apply to a many fetch join. */ private String dbFilterMany; - private String dbOrderBy; - private String dbUpdateClause; - /** * Includes from where and order by clauses. */ private Set predicateIncludes; - private Set orderByIncludes; CQueryPredicates(Binder binder, OrmQueryRequest request) { 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 248fa9058..ccfbb3ce6 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 @@ -19,47 +19,20 @@ import java.util.concurrent.locks.ReentrantLock; /** * Executes the select row count query. */ -class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { private final CQueryPlan queryPlan; - - /** - * The overall find request wrapper object. - */ private final OrmQueryRequest request; - private final BeanDescriptor desc; - private final SpiQuery query; - - /** - * Where clause predicates. - */ private final CQueryPredicates predicates; - - /** - * The final sql that is generated. - */ private final String sql; - - /** - * The resultSet that is read and converted to objects. - */ private ResultSet rset; - - /** - * The statement used to create the resultSet. - */ private PreparedStatement pstmt; - private String bindLog; - private long executionTimeMicros; - private int rowCount; - private long profileOffset; - private final ReentrantLock lock = new ReentrantLock(); /** @@ -104,11 +77,14 @@ class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { return sql; } + long micros() { + return executionTimeMicros; + } + /** * Execute the query returning the row count. */ public int findCount() throws SQLException { - long startNano = System.nanoTime(); try { SpiTransaction t = getTransaction(); @@ -118,24 +94,19 @@ class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { try { query.checkCancelled(); pstmt = conn.prepareStatement(sql); - if (query.getTimeout() > 0) { pstmt.setQueryTimeout(query.getTimeout()); } - bindLog = predicates.bind(pstmt, conn); } finally { lock.unlock(); } rset = pstmt.executeQuery(); query.checkCancelled(); - if (!rset.next()) { throw new PersistenceException("Expecting 1 row but got none?"); } - rowCount = rset.getInt(1); - executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); if (queryPlan.executionTime(executionTimeMicros)) { @@ -143,7 +114,6 @@ class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { } t.profileEvent(this); return rowCount; - } finally { close(); } 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 eec5d2e6f..e35615a0c 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 @@ -16,39 +16,21 @@ import java.util.concurrent.locks.ReentrantLock; /** * Executes the update query. */ -class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { private final CQueryPlan queryPlan; - private final OrmQueryRequest request; - private final BeanDescriptor desc; - private final SpiQuery query; - - /** - * Where clause predicates. - */ private final CQueryPredicates predicates; - - /** - * The final sql that is generated. - */ private final String sql; - - /** - * The statement used to create the resultSet. - */ private PreparedStatement pstmt; - private String bindLog; - private int rowCount; - private long profileOffset; - + private long executionTimeMicros; private final ReentrantLock lock = new ReentrantLock(); - + /** * Create the Sql select based on the request. */ @@ -80,7 +62,6 @@ class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { * Execute the update or delete statement returning the row count. */ public int execute() throws SQLException { - long startNano = System.nanoTime(); try { SpiTransaction t = getTransaction(); @@ -90,19 +71,16 @@ class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { try { query.checkCancelled(); pstmt = conn.prepareStatement(sql); - if (query.getTimeout() > 0) { pstmt.setQueryTimeout(query.getTimeout()); } - bindLog = predicates.bind(pstmt, conn); } finally { lock.unlock(); } rowCount = pstmt.executeUpdate(); query.checkCancelled(); - - long executionTimeMicros = (System.nanoTime() - startNano) / 1000L; + executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); if (queryPlan.executionTime(executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); @@ -115,6 +93,10 @@ class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { } } + long micros() { + return executionTimeMicros; + } + private SpiTransaction getTransaction() { return request.getTransaction(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java index 2a432b732..528984d17 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java @@ -10,9 +10,7 @@ import io.ebeaninternal.api.SpiQuery; abstract class CallableQuery { final SpiQuery query; - final SpiEbeanServer server; - final Transaction transaction; CallableQuery(SpiEbeanServer server, SpiQuery query, Transaction t) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java index a2076b363..959ce2abd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java @@ -8,10 +8,8 @@ import java.util.concurrent.Callable; /** * Represent the findCount query as a Callable. - * - * @param the entity bean type */ -public class CallableQueryCount extends CallableQuery implements Callable { +public final class CallableQueryCount extends CallableQuery implements Callable { /** * Note that the transaction passed in is always a new transaction solely to diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java index c8ae160f6..c236ccb6d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java @@ -9,10 +9,8 @@ import java.util.concurrent.Callable; /** * Represent the fetch Id's query as a Callable. - * - * @param the entity bean type */ -public class CallableQueryIds extends CallableQuery implements Callable> { +public final class CallableQueryIds extends CallableQuery implements Callable> { public CallableQueryIds(SpiEbeanServer server, SpiQuery query, Transaction t) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java index b20e75a86..350cd67f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java @@ -12,8 +12,7 @@ import java.util.concurrent.Callable; * * @param the entity bean type */ -public class CallableQueryList extends CallableQuery implements Callable> { - +public final class CallableQueryList extends CallableQuery implements Callable> { public CallableQueryList(SpiEbeanServer server, SpiQuery query, Transaction t) { super(server, query, t); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java index 4b17e3461..bc2449d63 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.querydefn.SpiFetchGroup; /** * Default FetchGroup implementation. */ -class DFetchGroup implements SpiFetchGroup { +final class DFetchGroup implements SpiFetchGroup { private final OrmQueryDetail detail; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java index 6553b7ea4..50966a45f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.querydefn.SpiFetchGroup; /** * Default implementation of the FetchGroupBuilder. */ -class DFetchGroupBuilder implements FetchGroupBuilder { +final class DFetchGroupBuilder implements FetchGroupBuilder { private static final FetchConfig DEFAULT_FETCH = FetchConfig.ofDefault(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java index 8065a62dc..642e163e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java @@ -7,7 +7,7 @@ import io.ebeaninternal.api.SpiDbQueryPlan; /** * Captured query plan details. */ -class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { +final class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { private final Class beanType; private final String label; @@ -16,8 +16,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { private final String sql; private final String bind; private final String plan; - - private String hash; + private final String hash; private long queryTimeMicros; private long captureCount; @@ -32,7 +31,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { } @Override - public String getHash() { + public String hash() { return hash; } @@ -40,7 +39,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return the associated bean. */ @Override - public Class getBeanType() { + public Class beanType() { return beanType; } @@ -48,12 +47,12 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return the query label if set. */ @Override - public String getLabel() { + public String label() { return label; } @Override - public ProfileLocation getProfileLocation() { + public ProfileLocation profileLocation() { return profileLocation; } @@ -61,7 +60,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return the sql of query. */ @Override - public String getSql() { + public String sql() { return sql; } @@ -69,7 +68,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return a description of the bind values used. */ @Override - public String getBind() { + public String bind() { return bind; } @@ -77,7 +76,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return the query plan. */ @Override - public String getPlan() { + public String plan() { return plan; } @@ -86,7 +85,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * to build the query plan. */ @Override - public long getQueryTimeMicros() { + public long queryTimeMicros() { return queryTimeMicros; } @@ -94,7 +93,7 @@ class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { * Return the total count of times bind capture has occurred. */ @Override - public long getCaptureCount() { + public long captureCount() { return captureCount; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java index 766be909b..72eb81db4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.query; import java.util.regex.Pattern; -class DbOrderByTrim { +final class DbOrderByTrim { private static final Pattern orderByTrim = Pattern.compile("(?i) asc\\b| desc\\b|\\b nulls first\\b|\\b nulls last\\b"); 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 378647818..dbd9b263e 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 @@ -8,7 +8,7 @@ import io.ebeaninternal.server.util.ArrayStack; import java.util.ArrayList; import java.util.HashSet; -class DefaultDbSqlContext implements DbSqlContext { +final class DefaultDbSqlContext implements DbSqlContext { private static final String COMMA = ", "; private static final String PERIOD = "."; 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 9f7cb9b7e..459bba998 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 @@ -44,7 +44,7 @@ import java.util.stream.Stream; /** * Implementation of FetchGroup query for use to create FetchGroup via query beans. */ -class DefaultFetchGroupQuery implements SpiFetchGroupQuery, SpiQueryFetch { +final class DefaultFetchGroupQuery implements SpiFetchGroupQuery, SpiQueryFetch { private static final FetchConfig FETCH_CACHE = FetchConfig.ofCache(); 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 b112c7986..abab7cdf9 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 @@ -21,7 +21,7 @@ import java.util.List; /** * Main Finder implementation. */ -public class DefaultOrmQueryEngine implements OrmQueryEngine { +public final class DefaultOrmQueryEngine implements OrmQueryEngine { /** * Find using predicates 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 78b9717d9..44b84a6a5 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 @@ -23,7 +23,7 @@ import java.util.function.Predicate; /** * Perform native sql fetches. */ -public class DefaultRelationalQueryEngine implements RelationalQueryEngine { +public final class DefaultRelationalQueryEngine implements RelationalQueryEngine { private final Binder binder; 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 0ee1e1525..e38d9d7d7 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 @@ -29,7 +29,7 @@ import java.util.UUID; * returning the type you expect. *

*/ -public class DefaultSqlRow implements SqlRow { +public final class DefaultSqlRow implements SqlRow { private static final long serialVersionUID = -3120927797041336242L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryEngine.java index 526d36dee..39588b733 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryEngine.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; -public class DtoQueryEngine { +public final class DtoQueryEngine { private final Binder binder; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryIterator.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryIterator.java index bdf4e2df6..47676c525 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryIterator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DtoQueryIterator.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.core.DtoQueryRequest; import javax.persistence.PersistenceException; import java.sql.SQLException; -class DtoQueryIterator implements QueryIterator { +final class DtoQueryIterator implements QueryIterator { private final DtoQueryRequest request; private boolean closed; 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 c246c651d..6fdeedd43 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 @@ -1,6 +1,6 @@ package io.ebeaninternal.server.query; -public class ExtraJoin { +public final class ExtraJoin { private final STreePropertyAssoc property; private final boolean containsMany; 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 a6f506ef6..cb9f6f560 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 @@ -12,7 +12,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * PagedList implementation based on limit offset types of queries. */ -public class LimitOffsetPagedList implements PagedList { +public final class LimitOffsetPagedList implements PagedList { private final transient SpiEbeanServer server; 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 e3b99561a..52e661b10 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 @@ -9,7 +9,7 @@ import java.util.Comparator; /** * Compare Version beans in descending order with nulls last. */ -class OrderVersionDesc implements Comparator>, Serializable { +final class OrderVersionDesc implements Comparator>, Serializable { static final OrderVersionDesc INSTANCE = new OrderVersionDesc(); 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 b330d7d25..ff5acb76c 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 @@ -10,7 +10,7 @@ import java.util.concurrent.FutureTask; /** * Default implementation of FutureIds. */ -public class QueryFutureIds extends BaseFuture> implements FutureIds { +public final class QueryFutureIds extends BaseFuture> implements FutureIds { private final CallableQueryIds call; 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 2d3999b61..34264ffcf 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 @@ -14,7 +14,7 @@ import java.util.concurrent.TimeoutException; /** * Default implementation for FutureList. */ -public class QueryFutureList extends BaseFuture> implements FutureList { +public final class QueryFutureList extends BaseFuture> implements FutureList { private final CallableQueryList call; 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 52c7b0fca..832653f1d 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 @@ -8,7 +8,7 @@ import java.util.concurrent.FutureTask; /** * Future implementation for the row count query. */ -public class QueryFutureRowCount extends BaseFuture implements FutureRowCount { +public final class QueryFutureRowCount extends BaseFuture implements FutureRowCount { private final CallableQueryCount call; 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 53bd01f94..1ab789158 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 @@ -16,7 +16,7 @@ public abstract class QueryPlanLogger { abstract SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind); - SpiDbQueryPlan readQueryPlan(SpiQueryPlan plan, BindCapture bind, ResultSet rset) throws SQLException { + final SpiDbQueryPlan readQueryPlan(SpiQueryPlan plan, BindCapture bind, ResultSet rset) throws SQLException { StringBuilder sb = new StringBuilder(); for (int i = 1; i <= rset.getMetaData().getColumnCount(); i++) { sb.append(rset.getMetaData().getColumnLabel(i)).append("\t"); @@ -27,11 +27,11 @@ public abstract class QueryPlanLogger { return createPlan(plan, bind.toString(), sb.toString()); } - SpiDbQueryPlan createPlan(SpiQueryPlan plan, String bind, String planString) { + final SpiDbQueryPlan createPlan(SpiQueryPlan plan, String bind, String planString) { return plan.createMeta(bind, planString); } - SpiDbQueryPlan readQueryPlanBasic(SpiQueryPlan plan, BindCapture bind, ResultSet rset) throws SQLException { + final SpiDbQueryPlan readQueryPlanBasic(SpiQueryPlan plan, BindCapture bind, ResultSet rset) throws SQLException { StringBuilder sb = new StringBuilder(); readPlanData(sb, rset); return createPlan(plan, bind.toString(), sb.toString().trim()); 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 6f89c138a..6319967d9 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 @@ -12,7 +12,7 @@ import java.sql.SQLException; /** * A QueryPlanLogger that prefixes "EXPLAIN " to the query. This works for Postgres, H2 and MySql. */ -public class QueryPlanLoggerExplain extends QueryPlanLogger { +public final class QueryPlanLoggerExplain extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { 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 2d2f4702f..d4ccd81bb 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 @@ -16,7 +16,7 @@ import java.sql.Statement; * * @author Roland Praml, FOCONIS AG */ -public class QueryPlanLoggerOracle extends QueryPlanLogger { +public final class QueryPlanLoggerOracle extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { 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 596f33bc0..f52654ba5 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 @@ -12,7 +12,7 @@ import java.sql.SQLException; /** * A QueryPlanLogger for Postgres that prefixes "EXPLAIN ANALYZE" to the query. */ -public class QueryPlanLoggerPostgres extends QueryPlanLogger { +public final class QueryPlanLoggerPostgres extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { 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 6657448e2..c71072084 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 @@ -16,7 +16,7 @@ import java.sql.Statement; * * @author Roland Praml, FOCONIS AG */ -public class QueryPlanLoggerSqlServer extends QueryPlanLogger { +public final class QueryPlanLoggerSqlServer extends QueryPlanLogger { @Override public SpiDbQueryPlan collectPlan(Connection conn, SpiQueryPlan plan, BindCapture bind) { 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 2a3fce499..b24a57e04 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 @@ -7,7 +7,7 @@ import java.util.Objects; /** * QueryPlanKey for RawSql queries. */ -class RawSqlQueryPlanKey implements CQueryPlanKey { +final class RawSqlQueryPlanKey implements CQueryPlanKey { private final String sql; private final boolean rawSql; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlBeanLoad.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlBeanLoad.java index ac1386e11..cdeb345c0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlBeanLoad.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlBeanLoad.java @@ -13,24 +13,20 @@ import io.ebeaninternal.server.deploy.DbReadContext; * partial objects. *

*/ -public class SqlBeanLoad { +public final class SqlBeanLoad { private final DbReadContext ctx; private final EntityBean bean; private final EntityBeanIntercept ebi; - private final Class type; private final boolean lazyLoading; - private final boolean refreshLoading; private final boolean rawSql; SqlBeanLoad(DbReadContext ctx, Class type, EntityBean bean, Mode queryMode) { - this.ctx = ctx; this.rawSql = ctx.isRawSql(); this.type = type; this.lazyLoading = queryMode == Mode.LAZYLOAD_BEAN; - this.refreshLoading = queryMode == Mode.REFRESH_BEAN; this.bean = bean; this.ebi = bean == null ? null : bean._ebean_getIntercept(); } @@ -50,34 +46,21 @@ public class SqlBeanLoad { } public Object load(BeanProperty prop) { - if (!rawSql && !prop.isLoadProperty(ctx.isDraftQuery())) { return null; } - if ((bean == null) || (lazyLoading && ebi.isLoadedProperty(prop.getPropertyIndex())) || (type != null && !prop.isAssignableFrom(type))) { - // ignore this property // ... null: bean already in persistence context // ... lazyLoading: partial bean that is lazy loading // ... type: inheritance and not assignable to this instance - prop.loadIgnore(ctx); return null; } - try { - Object dbVal = prop.read(ctx); - if (!refreshLoading) { - prop.setValue(bean, dbVal); - } else { - prop.setValueIntercept(bean, dbVal); - } - - return dbVal; - + return prop.readSet(ctx, bean); } catch (Exception e) { bean._ebean_getIntercept().setLoadError(prop.getPropertyIndex(), e); ctx.handleLoadError(prop.getFullBeanName(), e); @@ -89,10 +72,6 @@ public class SqlBeanLoad { * Load the given value into the property. */ public void load(BeanProperty target, Object dbVal) { - if (!refreshLoading) { - target.setValue(bean, dbVal); - } else { - target.setValueIntercept(bean, dbVal); - } + target.setValue(bean, dbVal); } } 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 1befa650b..27e35c365 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 @@ -10,7 +10,7 @@ import java.util.Set; /** * Represents the SELECT clause part of the SQL query. */ -class SqlTree { +final class SqlTree { private final SqlTreeNode rootNode; @@ -101,6 +101,7 @@ class SqlTree { * Return the String for the actual SQL. */ String getSelectSql() { + assert selectSql != null : "selectSql was null"; return selectSql; } 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 27ec943b4..9d46d07c3 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 @@ -12,7 +12,7 @@ import java.util.TreeSet; /** * Special Map of the logical property joins to table alias. */ -class SqlTreeAlias { +final class SqlTreeAlias { private final SpiQuery.TemporalMode temporalMode; 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 239e8a58e..43e3a0215 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 @@ -30,44 +30,28 @@ public final class SqlTreeBuilder { private static final Logger logger = LoggerFactory.getLogger(SqlTreeBuilder.class); private final SpiQuery query; - private final STreeType desc; - private final OrmQueryDetail queryDetail; - private final CQueryPredicates predicates; - private final boolean subQuery; - private final boolean distinctOnPlatform; /** * Property if resultSet contains master and detail rows. */ private STreePropertyAssocMany manyProperty; - private final SqlTreeAlias alias; - private final DefaultDbSqlContext ctx; - private final HashSet selectIncludes = new HashSet<>(); - private final ManyWhereJoins manyWhereJoins; - private final TableJoin includeJoin; - private final boolean rawSql; - /** * rawNoId true if the RawSql does not include the @Id property */ private final boolean rawNoId; - private final boolean disableLazyLoad; - private final SpiQuery.TemporalMode temporalMode; - private SqlTreeNode rootNode; - private boolean sqlDistinct; /** @@ -102,7 +86,11 @@ public final class SqlTreeBuilder { this.query = request.getQuery(); this.temporalMode = SpiQuery.TemporalMode.of(query); this.disableLazyLoad = query.isDisableLazyLoading(); - this.subQuery = Type.SUBQUERY == query.getType() || Type.ID_LIST == query.getType() || Type.DELETE == query.getType() || query.isCountDistinct(); + this.subQuery = Type.SQ_EXISTS == query.getType() + || 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(); @@ -146,6 +134,10 @@ public final class SqlTreeBuilder { if (rawSql) { return "Not Used"; } + if (query.getType() == Type.SQ_EXISTS) { + // effective query is "where exists (select 1 from ...)" + return "1"; + } rootNode.appendSelect(ctx, subQuery); return trimComma(ctx.getContent()); } @@ -311,7 +303,7 @@ public final class SqlTreeBuilder { } else { // do not read Id on child beans (e.g. when used with fetch()) - boolean withId = isNotSingleAttribute(); + boolean withId = isNotSingleAttribute() && !subQuery; return new SqlTreeNodeBean(prefix, prop, props, myList, withId, temporalMode, disableLazyLoad); } } @@ -365,11 +357,11 @@ public final class SqlTreeBuilder { * This means it can included individual properties of an embedded bean. *

*/ - private void addPropertyToSubQuery(SqlTreeProperties selectProps, STreeType desc, String propName) { - STreeProperty p = desc.findProperty(propName); + private void addPropertyToSubQuery(SqlTreeProperties selectProps, STreeType desc, String propName, String path) { + STreeProperty p = desc.findPropertyWithDynamic(propName, path); if (p == null) { logger.error("property [" + propName + "]not found on " + desc + " for query - excluding it."); - + return; } else if (p instanceof STreePropertyAssoc && p.isEmbedded()) { // if the property is embedded we need to lookup the real column name int pos = propName.indexOf('.'); @@ -383,7 +375,7 @@ public final class SqlTreeBuilder { private void addProperty(SqlTreeProperties selectProps, STreeType desc, OrmQueryProperties queryProps, String propName) { if (subQuery) { - addPropertyToSubQuery(selectProps, desc, propName); + addPropertyToSubQuery(selectProps, desc, propName, queryProps.getPath()); return; } 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 1c9bff694..83c8362a9 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 @@ -28,58 +28,40 @@ class SqlTreeNodeBean implements SqlTreeNode { private static final SqlTreeNode[] NO_CHILDREN = new SqlTreeNode[0]; final STreeType desc; - final IdBinder idBinder; - /** * The children which will be other SelectBean or SelectProxyBean. */ final SqlTreeNode[] children; - /** * Set to true if this is a partial object fetch. */ private final boolean partialObject; - private final STreeProperty[] properties; - /** * Extra where clause added by Where annotation on associated many. */ private final String extraWhere; - private final STreePropertyAssoc nodeBeanProp; - /** * False if report bean and has no id property. */ final boolean readId; private final boolean readIdNormal; - private final boolean disableLazyLoad; - private final InheritInfo inheritInfo; - final String prefix; - private final Map pathMap; - final STreePropertyAssocMany lazyLoadParent; - private final SpiQuery.TemporalMode temporalMode; - private final boolean temporalVersions; - private final IdBinder lazyLoadParentIdBinder; - String baseTableAlias; - /** * Table alias set if this bean node includes a join to a intersection * table and that table has history support. */ private boolean intersectionAsOfTableAlias; - private final boolean aggregation; /** @@ -131,12 +113,12 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public boolean isSingleProperty() { + public final boolean isSingleProperty() { return properties != null && properties.length == 1 && children.length == 0; } @Override - public ScalarDataReader getSingleAttributeReader() { + public final ScalarDataReader getSingleAttributeReader() { if (properties == null || properties.length == 0) { // if we have no property ask first children (in a distinct select with join) if (children.length == 0) { @@ -172,7 +154,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public void buildRawSqlSelectChain(List selectChain) { + public final void buildRawSqlSelectChain(List selectChain) { if (readId) { if (inheritInfo != null) { // discriminator column always proceeds id column @@ -194,7 +176,7 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Load that takes into account inheritance. */ - private class LoadInherit extends Load { + private final class LoadInherit extends Load { private LoadInherit(DbReadContext ctx, EntityBean parentBean) { super(ctx, parentBean); @@ -437,7 +419,7 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Perform the load returning the loaded bean. */ - EntityBean perform() throws SQLException { + final EntityBean perform() throws SQLException { initialise(); if (isLazyLoadManyRoot()) { return getContextBean(); @@ -451,7 +433,7 @@ class SqlTreeNodeBean implements SqlTreeNode { * Return true if this bean was already in the context. If already in the * context we need to check if it is already contained in the collection. */ - boolean isContextBean() { + final boolean isContextBean() { return localBean == null; } } @@ -467,12 +449,12 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Create the loader with or without inheritance. */ - Load createLoad(DbReadContext ctx, EntityBean parentBean) { + final Load createLoad(DbReadContext ctx, EntityBean parentBean) { return (inheritInfo != null) ? new LoadInherit(ctx, parentBean) : new Load(ctx, parentBean); } @Override - public void appendGroupBy(DbSqlContext ctx, boolean subQuery) { + public final void appendGroupBy(DbSqlContext ctx, boolean subQuery) { ctx.pushJoin(prefix); ctx.pushTableAlias(prefix); if (lazyLoadParent != null) { @@ -507,7 +489,7 @@ class SqlTreeNodeBean implements SqlTreeNode { * Append the property columns to the buffer. */ @Override - public void appendSelect(DbSqlContext ctx, boolean subQuery) { + public final void appendSelect(DbSqlContext ctx, boolean subQuery) { ctx.pushJoin(prefix); ctx.pushTableAlias(prefix); if (temporalVersions) { @@ -532,7 +514,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public boolean isAggregation() { + public final boolean isAggregation() { if (aggregation) { return true; } @@ -553,14 +535,14 @@ class SqlTreeNodeBean implements SqlTreeNode { } } - void appendSelectId(DbSqlContext ctx, STreeProperty prop) { + final void appendSelectId(DbSqlContext ctx, STreeProperty prop) { if (prop != null) { prop.appendSelect(ctx, false); } } @Override - public void appendWhere(DbSqlContext ctx) { + public final void appendWhere(DbSqlContext ctx) { // Only apply inheritance to root node as any join will already have the inheritance join include - see TableJoin if (inheritInfo != null && nodeBeanProp == null) { if (!inheritInfo.isRoot()) { @@ -618,7 +600,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public void addSoftDeletePredicate(SpiQuery query) { + public final void addSoftDeletePredicate(SpiQuery query) { if (desc.isSoftDelete()) { query.addSoftDeletePredicate(desc.getSoftDeletePredicate(baseTableAlias)); } 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 1b31ee08c..ae5e5bf3f 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 @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebean.util.SplitName; @@ -22,7 +21,7 @@ import java.util.Set; * etc in this case we must add an extra join. *

*/ -class SqlTreeNodeExtraJoin implements SqlTreeNode { +final class SqlTreeNodeExtraJoin implements SqlTreeNode { private final STreePropertyAssoc assocBeanProperty; private final SpiQuery.TemporalMode temporalMode; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java index 20a3037da..faf1ce4f1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebeaninternal.api.SpiQuery; @@ -13,7 +12,7 @@ import java.util.Set; /** * Join to Many (or child of a many) to support where clause predicates on many properties. */ -class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { +final class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { private final STreeProperty nodeBeanProp; 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 c537c4bf7..c3f534a25 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 @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebean.util.SplitName; @@ -15,21 +14,16 @@ import java.util.Set; /** * Join to Many (or child of a many) to support where clause predicates on many properties. */ -class SqlTreeNodeManyWhereJoin implements SqlTreeNode { +final class SqlTreeNodeManyWhereJoin implements SqlTreeNode { private final String parentPrefix; - private final String prefix; - private final STreePropertyAssoc nodeBeanProp; - private final STreeType target; - /** * The many where join which is either INNER or OUTER. */ private final SqlJoinType manyJoinType; - private final boolean softDelete; SqlTreeNodeManyWhereJoin(String prefix, STreePropertyAssoc prop, SqlJoinType manyJoinType, SpiQuery.TemporalMode temporalMode) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java index e52477cf1..a58c51cc5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java @@ -18,9 +18,7 @@ import java.util.Set; final class SqlTreeNodeRoot extends SqlTreeNodeBean implements SqlTreeRoot { private final TableJoin includeJoin; - private final boolean sqlDistinct; - private final String baseTable; /** 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 f46ca8088..489341789 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 @@ -10,24 +10,16 @@ import java.util.List; /** * The select properties for a node in the SqlTree. */ -public class SqlTreeProperties { +public final class SqlTreeProperties { - /** - * The bean properties in order. - */ private final List propsList = new ArrayList<>(); - /** * Maintain a list of property names to detect embedded bean additions. */ private final LinkedHashSet propNames = new LinkedHashSet<>(); - private boolean allProperties; - private boolean aggregationManyToOne; - private boolean aggregation; - private String aggregationPath; SqlTreeProperties() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java index 62fd3cdf0..4ad835188 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java @@ -15,14 +15,12 @@ import io.ebeaninternal.api.SpiCancelableQuery; */ public class AbstractQuery implements SpiCancelableQuery { + private final ReentrantLock lock = new ReentrantLock(); private boolean cancelled; - private CancelableQuery cancelableQuery; - private final ReentrantLock lock = new ReentrantLock(); - @Override - public void cancel() { + public final void cancel() { lock.lock(); try { if (!cancelled) { @@ -37,14 +35,14 @@ public class AbstractQuery implements SpiCancelableQuery { } @Override - public void checkCancelled() { + public final void checkCancelled() { if (cancelled) { throw new PersistenceException("Query was cancelled"); } } @Override - public void setCancelableQuery(CancelableQuery cancelableQuery) { + public final void setCancelableQuery(CancelableQuery cancelableQuery) { lock.lock(); try { checkCancelled(); 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 c2cb02198..4a72c0057 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 @@ -21,35 +21,20 @@ import java.util.stream.Stream; /** * Default implementation of DtoQuery. */ -public class DefaultDtoQuery extends AbstractQuery implements SpiDtoQuery { +public final class DefaultDtoQuery extends AbstractQuery implements SpiDtoQuery { private final SpiEbeanServer server; - private final DtoBeanDescriptor descriptor; - private final SpiQuery ormQuery; - private String sql; - private int firstRow; - private int maxRows; - private int timeout; - private int bufferFetchSizeHint; - private boolean relaxedMode; - private String label; - private ProfileLocation profileLocation; - - /** - * Bind parameters when using the query language. - */ private final BindParams bindParams = new BindParams(); - private Transaction transaction; /** 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 96a923637..65ba6b9a3 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 @@ -1,30 +1,7 @@ package io.ebeaninternal.server.querydefn; -import io.ebean.CacheMode; -import io.ebean.CountDistinctOrder; -import io.ebean.Database; -import io.ebean.DtoQuery; -import io.ebean.Expression; -import io.ebean.ExpressionFactory; -import io.ebean.ExpressionList; -import io.ebean.FetchConfig; -import io.ebean.FetchGroup; -import io.ebean.FetchPath; -import io.ebean.FutureIds; -import io.ebean.FutureList; -import io.ebean.FutureRowCount; -import io.ebean.OrderBy; +import io.ebean.*; import io.ebean.OrderBy.Property; -import io.ebean.PagedList; -import io.ebean.PersistenceContextScope; -import io.ebean.ProfileLocation; -import io.ebean.Query; -import io.ebean.QueryIterator; -import io.ebean.QueryType; -import io.ebean.RawSql; -import io.ebean.Transaction; -import io.ebean.UpdateQuery; -import io.ebean.Version; import io.ebean.bean.CallOrigin; import io.ebean.bean.ObjectGraphNode; import io.ebean.bean.ObjectGraphOrigin; @@ -32,29 +9,10 @@ import io.ebean.bean.PersistenceContext; import io.ebean.event.BeanQueryRequest; import io.ebean.event.readaudit.ReadEvent; import io.ebean.plugin.BeanType; -import io.ebeaninternal.api.BindParams; -import io.ebeaninternal.api.CQueryPlanKey; -import io.ebeaninternal.api.CacheIdLookup; -import io.ebeaninternal.api.CacheIdLookupMany; -import io.ebeaninternal.api.CacheIdLookupSingle; -import io.ebeaninternal.api.HashQuery; -import io.ebeaninternal.api.ManyWhereJoins; -import io.ebeaninternal.api.NaturalKeyQueryData; -import io.ebeaninternal.api.SpiEbeanServer; -import io.ebeaninternal.api.SpiExpression; -import io.ebeaninternal.api.SpiExpressionList; -import io.ebeaninternal.api.SpiExpressionValidation; -import io.ebeaninternal.api.SpiNamedParam; -import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.api.SpiQuerySecondary; -import io.ebeaninternal.api.SpiTransaction; +import io.ebeaninternal.api.*; import io.ebeaninternal.server.autotune.ProfilingListener; import io.ebeaninternal.server.core.SpiOrmQueryRequest; -import io.ebeaninternal.server.deploy.BeanDescriptor; -import io.ebeaninternal.server.deploy.BeanNaturalKey; -import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import io.ebeaninternal.server.deploy.InheritInfo; -import io.ebeaninternal.server.deploy.TableJoin; +import io.ebeaninternal.server.deploy.*; import io.ebeaninternal.server.el.ElPropertyDeploy; import io.ebeaninternal.server.expression.DefaultExpressionList; import io.ebeaninternal.server.expression.IdInExpression; @@ -66,14 +24,7 @@ import io.ebeaninternal.server.transaction.ExternalJdbcTransaction; import javax.persistence.PersistenceException; import java.sql.Connection; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.locks.ReentrantLock; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -81,79 +32,47 @@ import java.util.stream.Stream; /** * Default implementation of an Object Relational query. */ -public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { +public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery { private static final String DEFAULT_QUERY_NAME = "default"; - 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 final ReentrantLock lock = new ReentrantLock(); - private final Class beanType; - private final ExpressionFactory expressionFactory; - private final BeanDescriptor rootBeanDescriptor; - private BeanDescriptor beanDescriptor; - private SpiEbeanServer server; - private SpiTransaction transaction; - /** * For lazy loading of ManyToMany we need to add a join to the intersection table. This is that * join to the intersection table. */ private TableJoin m2mIncludeJoin; - private ProfilingListener profilingListener; - private Type type; - private String label; - private Mode mode = Mode.NORMAL; - private Object tenantId; - /** * Holds query in structured form. */ private OrmQueryDetail detail; - private int maxRows; - private int firstRow; - - /** - * Set to true to disable lazy loading on the object graph returned. - */ private boolean disableLazyLoading; - /** * Lazy loading batch size (can override server wide default). */ private int lazyLoadBatchSize; - private OrderBy orderBy; - private String loadMode; - private String loadDescription; - private String generatedSql; - private String lazyLoadProperty; - private String lazyLoadManyPath; - private boolean allowLoadErrors; - /** * Flag set for report/DTO beans when we may choose to explicitly include the Id property. */ @@ -192,97 +111,55 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { * Bind parameters when using the query language. */ private BindParams bindParams; - private DefaultExpressionList textExpressions; - private DefaultExpressionList whereExpressions; - private DefaultExpressionList havingExpressions; - private boolean asOfBaseTable; - private int asOfTableCount; /** * Set for flashback style 'as of' query. */ private Timestamp asOf; - private TemporalMode temporalMode = TemporalMode.CURRENT; - private Timestamp versionsStart; private Timestamp versionsEnd; - private List softDeletePredicates; - private boolean disableReadAudit; - private int bufferFetchSizeHint; - private boolean usageProfiling = true; - private CacheMode useBeanCache = CacheMode.AUTO; - private CacheMode useQueryCache = CacheMode.OFF; - private Boolean readOnly; - private PersistenceContextScope persistenceContextScope; /** * Allow for explicit on off or null for default. */ private Boolean autoTune; - private LockWait forUpdate; private LockType lockType; - private boolean singleAttribute; - private CountDistinctOrder countDistinctOrder; - - /** - * Set to true if this query has been tuned by autoTune. - */ private boolean autoTuned; - - /** - * Root table alias. For {@link Query#alias(String)} command. - */ private String rootTableAlias; - private String baseTable; - /** * The node of the bean or collection that fired lazy loading. Not null if profiling is on and * this query is for lazy loading. Used to hook back a lazy loading query to the "original" query * point. */ private ObjectGraphNode parentNode; - private BeanPropertyAssocMany lazyLoadForParentsProperty; - - /** - * Hash of final query after AutoTune tuning. - */ private CQueryPlanKey queryPlanKey; - private PersistenceContext persistenceContext; - private ManyWhereJoins manyWhereJoins; - private SpiRawSql rawSql; - private boolean useDocStore; - private String docIndexName; - private OrmUpdateProperties updateProperties; - private String nativeSql; - private boolean orderById; - private ProfileLocation profileLocation; public DefaultOrmQuery(BeanDescriptor desc, SpiEbeanServer server, ExpressionFactory expressionFactory) { @@ -616,7 +493,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { * Limit the number of fetch joins to Many properties, mark as query joins as needed. */ private void markQueryJoins() { - detail.markQueryJoins(beanDescriptor, lazyLoadManyPath, isAllowOneManyFetch(), type != Type.ATTRIBUTE); + detail.markQueryJoins(beanDescriptor, lazyLoadManyPath, isAllowOneManyFetch(), type.defaultSelect()); } private boolean isAllowOneManyFetch() { @@ -629,7 +506,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { @Override public void setDefaultSelectClause() { - if (type != Type.ATTRIBUTE) { + if (type.defaultSelect()) { detail.setDefaultSelectClause(beanDescriptor); } else if (!detail.hasSelectClause()) { // explicit empty select when single attribute query on non-root fetch path @@ -1269,22 +1146,13 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { } } - /** - * Calculate a hash based on the bind values used in the query. - *

- * Used with queryPlanHash() to get a unique hash for a query. - *

- */ @Override - public int queryBindHash() { - int hc = (id == null ? 0 : id.hashCode()); - hc = hc * 92821 + (whereExpressions == null ? 0 : whereExpressions.queryBindHash()); - hc = hc * 92821 + (havingExpressions == null ? 0 : havingExpressions.queryBindHash()); - hc = hc * 92821 + (bindParams == null ? 0 : bindParams.queryBindHash()); - hc = hc * 92821 + (asOf == null ? 0 : asOf.hashCode()); - hc = hc * 92821 + (versionsStart == null ? 0 : versionsStart.hashCode()); - hc = hc * 92821 + (versionsEnd == null ? 0 : versionsEnd.hashCode()); - return hc; + public void queryBindKey(BindValuesKey key) { + key.add(id); + if (whereExpressions != null) whereExpressions.queryBindKey(key); + if (havingExpressions != null) havingExpressions.queryBindKey(key); + if (bindParams != null) bindParams.queryBindHash(key); + key.add(asOf).add(versionsStart).add(versionsEnd); } /** @@ -1298,8 +1166,9 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { public HashQuery queryHash() { // calculateQueryPlanHash is called just after potential AutoTune tuning // so queryPlanHash is calculated well before this method is called - int hc = queryBindHash(); - return new HashQuery(queryPlanKey, hc); + BindValuesKey bindKey = new BindValuesKey(); + queryBindKey(bindKey); + return new HashQuery(queryPlanKey, bindKey); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java index 0381df322..88b84fc2f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java @@ -14,41 +14,21 @@ public final class DefaultOrmUpdate implements SpiUpdate, Serializable { private static final long serialVersionUID = -8791423602246515438L; - private transient final EbeanServer server; - private final Class beanType; - - /** - * The name of the update. - */ private final String name; - private String label; - - /** - * The parameters used to bind to the sql. - */ private final BindParams bindParams = new BindParams(); - - /** - * The sql update or delete statement. - */ private final String updateStatement; - /** * Automatically detect the table being modified by this sql. This will * register this information so that eBean invalidates cached objects if * required. */ private boolean notifyCache = true; - private int timeout; - private String generatedSql; - private final String baseTable; - private final OrmUpdateType type; /** 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 6afe54a1f..879d1bdaf 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 @@ -17,27 +17,17 @@ import java.util.function.Predicate; /** * Default implementation of SQuery - SQL Query. */ -public class DefaultRelationalQuery extends AbstractQuery implements SpiSqlQuery { +public final class DefaultRelationalQuery extends AbstractQuery implements SpiSqlQuery { private static final long serialVersionUID = -1098305779779591068L; private final transient SpiEbeanServer server; - private final String query; - private String label; - private int firstRow; - private int maxRows; - private int timeout; - private int bufferFetchSizeHint; - - /** - * Bind parameters when using the query language. - */ private final BindParams bindParams = new BindParams(); /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java index 897424b8a..c9ed9ca11 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java @@ -10,7 +10,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Default implementation of UpdateQuery. */ -public class DefaultUpdateQuery implements UpdateQuery { +public final class DefaultUpdateQuery implements UpdateQuery { private final OrmUpdateProperties values = new OrmUpdateProperties(); private final DefaultOrmQuery query; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java index 3655a3ef4..301ec4ef3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java @@ -1,9 +1,8 @@ package io.ebeaninternal.server.querydefn; -public class NaturalKeyBindParam { +public final class NaturalKeyBindParam { private final String name; - private final Object value; public NaturalKeyBindParam(String name, Object value) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java index e63526063..f2585a708 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java @@ -7,10 +7,9 @@ import javax.persistence.PersistenceException; /** * Named parameter used as placeholder in expressions created by EQL language parsing. */ -class ONamedParam implements SpiNamedParam { +final class ONamedParam implements SpiNamedParam { private final String name; - private Object value; /** 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 2fabfdd79..90f4cbac1 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 @@ -21,7 +21,7 @@ import java.util.*; * Tuning a query is a matter of replacing an instance of this class with one that has been tuned * with select() and join() set. */ -public class OrmQueryDetail implements Serializable { +public final class OrmQueryDetail implements Serializable { private static final long serialVersionUID = -2510486880141461807L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java index 0314b55b6..744f70ebf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java @@ -9,10 +9,9 @@ import javax.persistence.PersistenceException; * replace the OrmQueryDetail leaving the attributes unchanged. *

*/ -public class OrmQueryDetailParser { +public final class OrmQueryDetailParser { private final OrmQueryDetail detail = new OrmQueryDetail(); - private final SimpleTextParser parser; public OrmQueryDetailParser(String oql) { @@ -20,7 +19,6 @@ public class OrmQueryDetailParser { } public OrmQueryDetail parse() throws PersistenceException { - if (parser.isEmpty()) return detail; parser.nextWord(); @@ -68,7 +66,6 @@ public class OrmQueryDetailParser { } private OrmQueryProperties readFindFetch() { - boolean readAlias = false; String props = null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java index 99354bf71..a36889557 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java @@ -4,16 +4,12 @@ import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.SqlLimitRequest; import io.ebeaninternal.api.SpiQuery; -public class OrmQueryLimitRequest implements SqlLimitRequest { +public final class OrmQueryLimitRequest implements SqlLimitRequest { private final SpiQuery ormQuery; - private final DatabasePlatform dbPlatform; - private final String sql; - private final String sqlOrderBy; - private final boolean distinct; public OrmQueryLimitRequest(String sql, String sqlOrderBy, SpiQuery ormQuery, DatabasePlatform dbPlatform, boolean distinct) { 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 3a9ac8e33..3ce478c92 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 @@ -8,7 +8,7 @@ import java.util.Objects; /** * Query plan key for ORM queries. */ -class OrmQueryPlanKey implements CQueryPlanKey { +final class OrmQueryPlanKey implements CQueryPlanKey { private final SpiRawSql.Key rawSqlKey; private final int maxRows; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryProperties.java index 0a8b51465..98864e744 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryProperties.java @@ -23,7 +23,7 @@ import java.util.Set; /** * Represents the Properties of an Object Relational query. */ -public class OrmQueryProperties implements Serializable { +public final class OrmQueryProperties implements Serializable { private static final long serialVersionUID = -8785582703966455658L; @@ -35,30 +35,24 @@ public class OrmQueryProperties implements Serializable { private final Set included; private final FetchConfig fetchConfig; private final boolean cache; - /** * Flag set when this fetch path needs to be a query join. */ private boolean markForQueryJoin; - /** * Included bean joins. */ private Set includedBeanJoin; - /** * Add these properties to the select so that the foreign key columns are included in the query. */ private Set secondaryQueryJoins; - private List secondaryChildren; - /** * OrderBy properties that where on the main query but moved here as they relate to this (query join). */ @SuppressWarnings("rawtypes") private OrderBy orderBy; - /** * A filter that can be applied to the fetch of this path in the object graph. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQuerySecondary.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQuerySecondary.java index 738566597..4d2a94b1c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQuerySecondary.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQuerySecondary.java @@ -7,10 +7,9 @@ import java.util.List; /** * The secondary query paths for 'query joins' and 'lazy loading'. */ -class OrmQuerySecondary implements SpiQuerySecondary { +final class OrmQuerySecondary implements SpiQuerySecondary { private final List queryJoins; - private final List lazyJoins; /** 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 930e653f4..5a9d5b392 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 @@ -13,10 +13,9 @@ import java.util.Set; /** * Set properties for a UpdateQuery. */ -public class OrmUpdateProperties { +public final class OrmUpdateProperties { private static final NullValue NULL_VALUE = new NullValue(); - private static final NoneValue NONE_VALUE = new NoneValue(); /** @@ -41,7 +40,7 @@ public class OrmUpdateProperties { /** * Set property to null. */ - private static class NullValue extends Value { + private static final class NullValue extends Value { @Override public String bindClause() { return "=null"; @@ -51,7 +50,7 @@ public class OrmUpdateProperties { /** * Set property to a simple value. */ - private static class SimpleValue extends Value { + private static final class SimpleValue extends Value { final Object value; final ScalarType scalarType; @@ -85,7 +84,7 @@ public class OrmUpdateProperties { /** * Set using an expression with no bind value. */ - private static class NoneValue extends Value { + private static final class NoneValue extends Value { @Override public String bindClause() { return ""; @@ -95,7 +94,7 @@ public class OrmUpdateProperties { /** * Set using an expression with many bind values. */ - private static class RawArrayValue extends Value { + private static final class RawArrayValue extends Value { final Object[] bindValues; 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 849234e8c..0072c8eec 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 @@ -1,11 +1,10 @@ package io.ebeaninternal.server.querydefn; -public class SimpleTextParser { +public final class SimpleTextParser { private final String oql; private final char[] chars; private final int eof; - private int pos; private String word; private String lowerWord; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSql.java index 9f7e6627d..c58b8bc11 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSql.java @@ -8,9 +8,7 @@ import java.sql.ResultSet; public final class DRawSql implements SpiRawSql { private final ResultSet resultSet; - private final Sql sql; - private final ColumnMapping columnMapping; /** @@ -22,7 +20,7 @@ public final class DRawSql implements SpiRawSql { this.columnMapping = new ColumnMapping(propertyNames); } - protected DRawSql(ResultSet resultSet, Sql sql, ColumnMapping columnMapping) { + DRawSql(ResultSet resultSet, Sql sql, ColumnMapping columnMapping) { this.resultSet = resultSet; this.sql = sql; this.columnMapping = columnMapping; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlBuilder.java index 40160e873..a42c8035d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlBuilder.java @@ -5,12 +5,10 @@ import io.ebean.RawSqlBuilder; import java.sql.ResultSet; -public class DRawSqlBuilder implements RawSqlBuilder { +public final class DRawSqlBuilder implements RawSqlBuilder { private final ResultSet resultSet; - private final SpiRawSql.Sql sql; - private final SpiRawSql.ColumnMapping columnMapping; DRawSqlBuilder(SpiRawSql.Sql sql, SpiRawSql.ColumnMapping columnMapping) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlColumnsParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlColumnsParser.java index 74c02badd..48e61789b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlColumnsParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlColumnsParser.java @@ -17,7 +17,6 @@ final class DRawSqlColumnsParser { private static final Pattern COLINFO_SPLIT = Pattern.compile("\\s(?=[^\\)]*(?:\\(|$))"); private final String sqlSelect; - private int indexPos; public static ColumnMapping parse(String sqlSelect) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlParser.java index 0e46cbe10..033aa0755 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/rawsql/DRawSqlParser.java @@ -7,20 +7,15 @@ import io.ebeaninternal.server.rawsql.SpiRawSql.Sql; * Parses sql-select queries to try and determine the location where WHERE and * HAVING clauses can be added dynamically to the sql. */ -class DRawSqlParser { +final class DRawSqlParser { private static final String $_AND_HAVING = "${andHaving}"; - private static final String $_HAVING = "${having}"; - private static final String $_AND_WHERE = "${andWhere}"; - private static final String $_WHERE = "${where}"; private final SimpleTextParser textParser; - private String sql; - private int placeHolderWhere; private int placeHolderAndWhere; private int placeHolderHaving; 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 5a405dbc4..8ffef8a33 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 @@ -11,7 +11,7 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; -public class DRawSqlService implements SpiRawSqlService { +public final class DRawSqlService implements SpiRawSqlService { @Override public RawSql resultSet(ResultSet resultSet, String... propertyNames) { @@ -20,10 +20,8 @@ public class DRawSqlService implements SpiRawSqlService { @Override public RawSqlBuilder parsed(String sql) { - SpiRawSql.Sql sql2 = DRawSqlParser.parse(sql); String select = sql2.getPreFrom(); - SpiRawSql.ColumnMapping mapping = DRawSqlColumnsParser.parse(select); return new DRawSqlBuilder(sql2, mapping); } @@ -36,7 +34,6 @@ public class DRawSqlService implements SpiRawSqlService { @Override public SqlRow sqlRow(ResultSet resultSet, String dbTrueValue, boolean binaryOptimizedUUID) throws SQLException { - ResultSetMetaData meta = resultSet.getMetaData(); int estCap = (int) (meta.getColumnCount() / 0.7f) + 1; DefaultSqlRow ret = new DefaultSqlRow(estCap, 0.75f, dbTrueValue, binaryOptimizedUUID); @@ -77,7 +74,6 @@ public class DRawSqlService implements SpiRawSqlService { * Combine schema table and column names allowing for null schema and table. */ String combine(String schemaName, String tableName, String name) { - StringBuilder sb = new StringBuilder(); if (schemaName != null) { sb.append(schemaName).append("."); 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 64a9072eb..9e1403836 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 @@ -19,15 +19,11 @@ import java.util.Map; public class DefaultReadAuditLogger implements ReadAuditLogger { private static final Logger appLogger = LoggerFactory.getLogger(DefaultReadAuditLogger.class); - private static final Logger queryLogger = LoggerFactory.getLogger("io.ebean.ReadAuditQuery"); - private static final Logger auditLogger = LoggerFactory.getLogger("io.ebean.ReadAudit"); protected final JsonFactory jsonFactory = new JsonFactory(); - protected int defaultQueryBuffer = 500; - protected int defaultReadBuffer = 150; /** @@ -37,7 +33,6 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { public void queryPlan(ReadAuditQueryPlan queryPlan) { StringWriter writer = new StringWriter(defaultQueryBuffer); try (JsonGenerator gen = jsonFactory.createGenerator(writer)) { - gen.writeStartObject(); String beanType = queryPlan.getBeanType(); if (beanType != null) { @@ -53,9 +48,7 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { } gen.writeEndObject(); gen.flush(); - queryLogger.info(writer.toString()); - } catch (IOException e) { appLogger.error("Error writing Read audit event", e); } @@ -66,7 +59,6 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { */ @Override public void auditBean(ReadEvent beanEvent) { - writeEvent(beanEvent); } @@ -79,14 +71,11 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { } protected void writeEvent(ReadEvent event) { - try { StringWriter writer = new StringWriter(defaultReadBuffer); JsonGenerator gen = jsonFactory.createGenerator(writer); writeDetails(gen, event); - auditLogger.info(writer.toString()); - } catch (IOException e) { appLogger.error("Error writing Read audit event", e); } @@ -96,7 +85,6 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { * Write the details for the read bean or read many beans event. */ protected void writeDetails(JsonGenerator gen, ReadEvent event) throws IOException { - gen.writeStartObject(); String source = event.getSource(); if (source != null) { @@ -130,7 +118,6 @@ public class DefaultReadAuditLogger implements ReadAuditLogger { gen.writeFieldName("ids"); EJson.writeCollection(event.getIds(), gen); } - gen.writeEndObject(); gen.flush(); gen.close(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditPrepare.java b/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditPrepare.java index dee68efbd..70065f9ec 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditPrepare.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/readaudit/DefaultReadAuditPrepare.java @@ -10,7 +10,7 @@ import io.ebean.event.readaudit.ReadEvent; * the user context information on the readEvent bean (like user id). *

*/ -public class DefaultReadAuditPrepare implements ReadAuditPrepare { +public final class DefaultReadAuditPrepare implements ReadAuditPrepare { @Override public void prepare(ReadEvent readEvent) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java index ecfa3af8c..8193d397c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonBeanReader.java @@ -15,10 +15,9 @@ import java.io.IOException; * This is used such that a load context and persistence context can be used to span multiple marshalling requests. *

*/ -public class DJsonBeanReader implements JsonBeanReader { +public final class DJsonBeanReader implements JsonBeanReader { private final BeanDescriptor desc; - private final SpiJsonReader readJson; public DJsonBeanReader(BeanDescriptor desc, SpiJsonReader readJson) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java index 6a94bd31d..b0706173c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java @@ -43,18 +43,14 @@ import java.util.Set; /** * Default implementation of JsonContext. */ -public class DJsonContext implements SpiJsonContext { +public final class DJsonContext implements SpiJsonContext { private static final PrettyPrinter PRETTY_PRINTER = new Pretty(); private final SpiEbeanServer server; - private final JsonFactory jsonFactory; - private final Object defaultObjectMapper; - private final JsonConfig.Include defaultInclude; - private final DJsonScalar jsonScalar; private static class Pretty extends DefaultPrettyPrinter { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java index fed4c5945..d0ef82204 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/DJsonScalar.java @@ -10,7 +10,7 @@ import java.util.List; /** * Default implementation of JsonScalar. */ -public class DJsonScalar { +public final class DJsonScalar { private final TypeManager typeManager; @@ -20,7 +20,6 @@ public class DJsonScalar { @SuppressWarnings({ "unchecked", "rawtypes" }) public void write(JsonGenerator gen, Object value) throws IOException { - if (value instanceof String) { gen.writeString((String) value); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java index 7da49f6ad..6cb3b2b67 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/PathStack.java @@ -2,10 +2,9 @@ package io.ebeaninternal.server.text.json; import io.ebeaninternal.server.util.ArrayStack; -public class PathStack extends ArrayStack { +public final class PathStack extends ArrayStack { public String peekFullPath(String key) { - String prefix = peekWithNull(); if (prefix != null) { return prefix + "." + key; @@ -15,7 +14,6 @@ public class PathStack extends ArrayStack { } public void pushPathKey(String key) { - String prefix = peekWithNull(); if (prefix != null) { key = prefix + "." + key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java index 74c85a770..f685188b6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/ReadJson.java @@ -20,42 +20,28 @@ import java.util.Map; /** * Context for JSON read processing. */ -public class ReadJson implements SpiJsonReader { +public final class ReadJson implements SpiJsonReader { private final BeanDescriptor rootDesc; - - /** - * Jackson parser. - */ private final JsonParser parser; - - /** - * Stack of the path - used to find the appropriate JsonReadBeanVisitor. - */ private final PathStack pathStack; - /** * Map of the JsonReadBeanVisitor keyed by path. */ private final Map> visitorMap; - private final Object objectMapper; - private final PersistenceContext persistenceContext; - private final LoadContext loadContext; /** * Construct with parser and readOptions. */ public ReadJson(BeanDescriptor desc, JsonParser parser, JsonReadOptions readOptions, Object objectMapper) { - this.rootDesc = desc; this.parser = parser; this.objectMapper = objectMapper; this.persistenceContext = initPersistenceContext(readOptions); this.loadContext = initLoadContext(desc, readOptions); - // only create visitorMap, pathStack if needed ... this.visitorMap = (readOptions == null) ? null : readOptions.getVisitorMap(); this.pathStack = (visitorMap == null && loadContext == null) ? null : new PathStack(); @@ -119,7 +105,6 @@ public class ReadJson implements SpiJsonReader { */ @Override public void persistenceContextPut(Object beanId, T currentBean) { - persistenceContextPutIfAbsent(beanId, (EntityBean) currentBean, rootDesc); } @@ -129,16 +114,13 @@ public class ReadJson implements SpiJsonReader { */ @Override public Object persistenceContextPutIfAbsent(Object id, EntityBean bean, BeanDescriptor beanDesc) { - if (persistenceContext == null) { // no persistenceContext means no lazy loading either return null; } - Object existing = beanDesc.contextPutIfAbsent(persistenceContext, id, bean); if (existing != null) { beanDesc.merge(bean, (EntityBean) existing); - } else { if (loadContext != null) { EntityBeanIntercept ebi = bean._ebean_getIntercept(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java index d7914f587..4ae521e16 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/text/json/WriteJson.java @@ -21,22 +21,15 @@ import java.util.Collection; import java.util.Map; import java.util.Set; -public class WriteJson implements SpiJsonWriter { +public final class WriteJson implements SpiJsonWriter { private final SpiEbeanServer server; - private final JsonGenerator generator; - private final FetchPath fetchPath; - private final Map> visitors; - private final PathStack pathStack; - private final ArrayStack parentBeans; - private final Object objectMapper; - private final JsonConfig.Include include; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java index bb1690bfe..280f3c28f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java @@ -28,12 +28,10 @@ import java.util.List; * size of data sent around the network. *

*/ -public class BeanPersistIds implements BinaryWritable { +public final class BeanPersistIds implements BinaryWritable { private final BeanDescriptor beanDescriptor; - private final String descriptorId; - /** * The ids to invalidate from the cache (updates and deletes). */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BulkEventListenerMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BulkEventListenerMap.java index 86a6428b7..bcc91909f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BulkEventListenerMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/BulkEventListenerMap.java @@ -8,12 +8,11 @@ import java.util.HashMap; import java.util.List; import java.util.Set; -public class BulkEventListenerMap { +public final class BulkEventListenerMap { private final HashMap map = new HashMap<>(); public BulkEventListenerMap(List listeners) { - if (listeners != null) { for (BulkTableEventListener l : listeners) { Set tables = l.registeredTables(); @@ -29,7 +28,6 @@ public class BulkEventListenerMap { } public void process(BulkTableEvent event) { - Entry entry = map.get(event.getTableName()); if (entry != null) { entry.process(event); @@ -42,7 +40,7 @@ public class BulkEventListenerMap { entry.add(l); } - private static class Entry { + private static final class Entry { final List listeners = new ArrayList<>(); 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 38f5446d2..177e4bc15 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 @@ -38,7 +38,7 @@ import static java.time.temporal.ChronoField.YEAR; *

* Uses a sleep backoff on the single threaded consumer that reads the profiles and writes them to files. */ -public class DefaultProfileHandler implements SpiProfileHandler, Plugin { +public final class DefaultProfileHandler implements SpiProfileHandler, Plugin { private static final Logger log = LoggerFactory.getLogger(DefaultProfileHandler.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java index bc2913137..38c38e3d5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java @@ -5,7 +5,7 @@ import io.ebean.ProfileLocation; /** * Default transaction profiling event collection. */ -public class DefaultProfileStream implements ProfileStream { +public final class DefaultProfileStream implements ProfileStream { private final long startNanos; private final StringBuilder buffer; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultTransactionScopeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultTransactionScopeManager.java index 0cabba365..2ad93d490 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultTransactionScopeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultTransactionScopeManager.java @@ -9,7 +9,6 @@ import javax.persistence.PersistenceException; */ public class DefaultTransactionScopeManager extends TransactionScopeManager { - private final ThreadLocal local = new ThreadLocal<>(); @Override @@ -18,7 +17,7 @@ public class DefaultTransactionScopeManager extends TransactionScopeManager { } @Override - public SpiTransaction getInScope() { + public final SpiTransaction getInScope() { return local.get(); } @@ -33,7 +32,7 @@ public class DefaultTransactionScopeManager extends TransactionScopeManager { } @Override - public void replace(SpiTransaction trans) { + public final void replace(SpiTransaction trans) { if (trans == null) { throw new IllegalStateException("Setting a null transaction?"); } @@ -41,7 +40,7 @@ public class DefaultTransactionScopeManager extends TransactionScopeManager { } @Override - public void set(SpiTransaction trans) { + public final void set(SpiTransaction trans) { if (trans == null) { throw new IllegalStateException("Setting a null transaction?"); } @@ -50,13 +49,13 @@ public class DefaultTransactionScopeManager extends TransactionScopeManager { } @Override - public void clear() { + public final void clear() { checkForActiveTransaction(); local.remove(); } @Override - public void clearExternal() { + public final void clearExternal() { local.remove(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java index 43fb216a5..0165fb1e8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreOnlyTransaction.java @@ -5,7 +5,7 @@ import java.sql.Connection; /** * Document store only transaction. */ -public class DocStoreOnlyTransaction extends JdbcTransaction { +public final class DocStoreOnlyTransaction extends JdbcTransaction { /** * Create a new DocStore only Transaction. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java index 364e46841..d23476c25 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java @@ -9,7 +9,7 @@ import java.sql.Connection; *

* There is no underlying JDBC DataSource etc */ -public class DocStoreTransactionManager extends TransactionManager { +public final class DocStoreTransactionManager extends TransactionManager { /** * Create the TransactionManager diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalTransactionScopeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalTransactionScopeManager.java index b033e277b..6922e2129 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalTransactionScopeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ExternalTransactionScopeManager.java @@ -6,7 +6,7 @@ import io.ebeaninternal.api.SpiTransaction; /** * A TransactionScopeManager aware of external transaction managers. */ -public class ExternalTransactionScopeManager extends DefaultTransactionScopeManager { +public final class ExternalTransactionScopeManager extends DefaultTransactionScopeManager { private final ExternalTransactionManager externalManager; 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 e4e36e337..cbb4f7618 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 @@ -27,7 +27,7 @@ import java.util.Map; * persisting features are attempted to be used - which is not expected). *

*/ -class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCodes { +final class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCodes { private static final Logger logger = LoggerFactory.getLogger(ImplicitReadOnlyTransaction.class); 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 f61f03699..d271d1c04 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 @@ -219,56 +219,56 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void setLabel(String label) { + public final void setLabel(String label) { this.label = label; } @Override - public String getLabel() { + public final String getLabel() { return label; } @Override - public long getStartNanoTime() { + public final long getStartNanoTime() { return startNanos; } @Override - public long profileOffset() { + public final long profileOffset() { return (profileStream == null) ? 0 : profileStream.offset(); } @Override - public void profileEvent(SpiProfileTransactionEvent event) { + public final void profileEvent(SpiProfileTransactionEvent event) { if (profileStream != null) { event.profile(); } } @Override - public void setProfileStream(ProfileStream profileStream) { + public final void setProfileStream(ProfileStream profileStream) { this.profileStream = profileStream; } @Override - public ProfileStream profileStream() { + public final ProfileStream profileStream() { return profileStream; } @Override - public void setProfileLocation(ProfileLocation profileLocation) { + public final void setProfileLocation(ProfileLocation profileLocation) { this.profileLocation = profileLocation; } @Override - public ProfileLocation getProfileLocation() { + public final ProfileLocation getProfileLocation() { return profileLocation; } /** * Overridden in AutoCommitJdbcTransaction as that expects to run/operate with autocommit true. */ - void checkAutoCommit(Connection connection) throws SQLException { + final void checkAutoCommit(Connection connection) throws SQLException { if (connection != null) { this.autoCommit = connection.getAutoCommit(); if (this.autoCommit) { @@ -289,34 +289,34 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void setAutoPersistUpdates(boolean autoPersistUpdates) { + public final void setAutoPersistUpdates(boolean autoPersistUpdates) { this.autoPersistUpdates = autoPersistUpdates; this.batchMode = true; } @Override - public boolean isAutoPersistUpdates() { + public final boolean isAutoPersistUpdates() { return autoPersistUpdates; } @Override - public boolean isSkipCacheExplicit() { + public final boolean isSkipCacheExplicit() { return (skipCache != null && !skipCache); } @Override - public boolean isSkipCache() { + public final boolean isSkipCache() { if (skipCache != null) return skipCache; return skipCacheAfterWrite && !queryOnly; } @Override - public void setSkipCache(boolean skipCache) { + public final void setSkipCache(boolean skipCache) { this.skipCache = skipCache; } @Override - public String getLogPrefix() { + public final String getLogPrefix() { return logPrefix; } @@ -330,7 +330,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void addBeanChange(BeanChange beanChange) { + public final void addBeanChange(BeanChange beanChange) { if (changeLogHolder == null) { changeLogHolder = new TChangeLogHolder(this, 100); } @@ -338,14 +338,14 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void sendChangeLog(ChangeSet changesRequest) { + public final void sendChangeLog(ChangeSet changesRequest) { if (manager != null) { manager.sendChangeLog(changesRequest); } } @Override - public void register(TransactionCallback callback) { + public final void register(TransactionCallback callback) { if (callbackList == null) { callbackList = new ArrayList<>(4); } @@ -391,27 +391,27 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public int getDocStoreBatchSize() { + public final int getDocStoreBatchSize() { return docStoreBatchSize; } @Override - public void setDocStoreBatchSize(int docStoreBatchSize) { + public final void setDocStoreBatchSize(int docStoreBatchSize) { this.docStoreBatchSize = docStoreBatchSize; } @Override - public DocStoreMode getDocStoreMode() { + public final DocStoreMode getDocStoreMode() { return docStoreMode; } @Override - public void setDocStoreMode(DocStoreMode docStoreMode) { + public final void setDocStoreMode(DocStoreMode docStoreMode) { this.docStoreMode = docStoreMode; } @Override - public void registerDeferred(PersistDeferredRelationship derived) { + public final void registerDeferred(PersistDeferredRelationship derived) { if (deferredList == null) { deferredList = new ArrayList<>(); } @@ -425,7 +425,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { *

*/ @Override - public void registerDeleteBean(Integer persistingBean) { + public final void registerDeleteBean(Integer persistingBean) { if (deletingBeansHash == null) { deletingBeansHash = new HashSet<>(); } @@ -436,7 +436,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return true if this is a bean that has already been saved/deleted. */ @Override - public boolean isRegisteredDeleteBean(Integer persistingBean) { + public final boolean isRegisteredDeleteBean(Integer persistingBean) { return deletingBeansHash != null && deletingBeansHash.contains(persistingBean); } @@ -444,7 +444,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Unregister the persisted beans (when persisting at the top level). */ @Override - public void unregisterBeans() { + public final void unregisterBeans() { persistingBeans.clear(); } @@ -453,7 +453,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * register the bean if it is not already. */ @Override - public boolean isRegisteredBean(Object bean) { + public final boolean isRegisteredBean(Object bean) { if (persistingBeans == null) { persistingBeans = new IdentityHashMap<>(); } @@ -465,7 +465,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * This is to stop m2m intersection management via both directions of a m2m. */ @Override - public boolean isSaveAssocManyIntersection(String intersectionTable, String beanName) { + public final boolean isSaveAssocManyIntersection(String intersectionTable, String beanName) { if (m2mIntersectionSave == null) { // first attempt so yes allow this m2m intersection direction m2mIntersectionSave = new HashMap<>(); @@ -500,7 +500,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * @param diff the amount to add or subtract from the depth. */ @Override - public void depth(int diff) { + public final void depth(int diff) { depth += diff; } @@ -508,12 +508,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return the current depth. */ @Override - public int depth() { + public final int depth() { return depth; } @Override - public void markNotQueryOnly() { + public final void markNotQueryOnly() { this.queryOnly = false; } @@ -543,17 +543,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void setUpdateAllLoadedProperties(boolean updateAllLoadedProperties) { + public final void setUpdateAllLoadedProperties(boolean updateAllLoadedProperties) { this.updateAllLoadedProperties = updateAllLoadedProperties; } @Override - public Boolean isUpdateAllLoadedProperties() { + public final Boolean isUpdateAllLoadedProperties() { return updateAllLoadedProperties; } @Override - public void setBatchMode(boolean batchMode) { + public final void setBatchMode(boolean batchMode) { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } @@ -561,12 +561,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public boolean isBatchMode() { + public final boolean isBatchMode() { return batchMode; } @Override - public void setBatchOnCascade(boolean batchMode) { + public final void setBatchOnCascade(boolean batchMode) { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } @@ -574,17 +574,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public boolean isBatchOnCascade() { + public final boolean isBatchOnCascade() { return batchOnCascadeMode; } @Override - public Boolean getBatchGetGeneratedKeys() { + public final Boolean getBatchGetGeneratedKeys() { return batchGetGeneratedKeys; } @Override - public void setGetGeneratedKeys(boolean getGeneratedKeys) { + public final void setGetGeneratedKeys(boolean getGeneratedKeys) { this.batchGetGeneratedKeys = getGeneratedKeys; if (batchControl != null) { batchControl.setGetGeneratedKeys(getGeneratedKeys); @@ -592,7 +592,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void setFlushOnMixed(boolean batchFlushOnMixed) { + public final void setFlushOnMixed(boolean batchFlushOnMixed) { this.batchFlushOnMixed = batchFlushOnMixed; if (batchControl != null) { batchControl.setBatchFlushOnMixed(batchFlushOnMixed); @@ -606,12 +606,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { *

*/ @Override - public int getBatchSize() { + public final int getBatchSize() { return batchSize; } @Override - public void setBatchSize(int batchSize) { + public final void setBatchSize(int batchSize) { this.batchSize = batchSize; if (batchControl != null) { batchControl.setBatchSize(batchSize); @@ -619,12 +619,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public boolean isFlushOnQuery() { + public final boolean isFlushOnQuery() { return batchFlushOnQuery; } @Override - public void setFlushOnQuery(boolean batchFlushOnQuery) { + public final void setFlushOnQuery(boolean batchFlushOnQuery) { this.batchFlushOnQuery = batchFlushOnQuery; } @@ -633,12 +633,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * this request should be executed immediately. */ @Override - public boolean isBatchThisRequest() { + public final boolean isBatchThisRequest() { return batchMode; } @Override - public void checkBatchEscalationOnCollection() { + public final void checkBatchEscalationOnCollection() { if (!batchMode && batchOnCascadeMode) { batchMode = true; batchOnCascadeSet = true; @@ -646,7 +646,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void flushBatchOnCollection() { + public final void flushBatchOnCollection() { if (batchOnCascadeSet) { batchFlushReset(); // restore the previous batch mode of NONE @@ -675,7 +675,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public PersistenceException translate(String message, SQLException cause) { + public final PersistenceException translate(String message, SQLException cause) { if (manager != null) { return manager.translate(message, cause); } @@ -686,14 +686,14 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Flush after completing persist cascade. */ @Override - public void flushBatchOnCascade() { + public final void flushBatchOnCascade() { batchFlushReset(); // restore the previous batch mode batchMode = oldBatchMode; } @Override - public void flushBatchOnRollback() { + public final void flushBatchOnRollback() { internalBatchClear(); // restore the previous batch mode batchMode = oldBatchMode; @@ -709,13 +709,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public boolean checkBatchEscalationOnCascade(PersistRequestBean request) { - + public final boolean checkBatchEscalationOnCascade(PersistRequestBean request) { if (batchMode) { // already batching (at top level) return false; } - if (batchOnCascadeMode) { // escalate up to batch mode for this request (and cascade) oldBatchMode = false; @@ -725,13 +723,12 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { request.setSkipBatchForTopLevel(); return true; } - batchFlushReset(); return false; } @Override - public BatchControl getBatchControl() { + public final BatchControl getBatchControl() { return batchControl; } @@ -740,7 +737,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * on the first persist request. */ @Override - public void setBatchControl(BatchControl batchControl) { + public final void setBatchControl(BatchControl batchControl) { queryOnly = false; this.batchControl = batchControl; // in case these parameters have already been set @@ -763,7 +760,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { *

*/ @Override - public void flush() { + public final void flush() { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } @@ -771,7 +768,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void flushBatch() { + public final void flushBatch() { flush(); } @@ -797,7 +794,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return the persistence context associated with this transaction. */ @Override - public SpiPersistenceContext getPersistenceContext() { + public final SpiPersistenceContext getPersistenceContext() { return persistenceContext; } @@ -809,7 +806,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * then set it back later to a second transaction. */ @Override - public void setPersistenceContext(SpiPersistenceContext context) { + public final void setPersistenceContext(SpiPersistenceContext context) { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } @@ -820,7 +817,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return the underlying TransactionEvent. */ @Override - public TransactionEvent getEvent() { + public final TransactionEvent getEvent() { queryOnly = false; if (event == null) { event = new TransactionEvent(); @@ -832,27 +829,27 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return true if this was an explicitly created transaction. */ @Override - public boolean isExplicit() { + public final boolean isExplicit() { return explicit; } @Override - public boolean isLogSql() { + public final boolean isLogSql() { return logSql; } @Override - public boolean isLogSummary() { + public final boolean isLogSummary() { return logSummary; } @Override - public void logSql(String msg) { + public final void logSql(String msg) { manager.log().sql().debug(Str.add(logPrefix, msg)); } @Override - public void logSummary(String msg) { + public final void logSummary(String msg) { manager.log().sum().debug(Str.add(logPrefix, msg)); } @@ -860,17 +857,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return the transaction id. */ @Override - public String getId() { + public final String getId() { return id; } @Override - public void setTenantId(Object tenantId) { + public final void setTenantId(Object tenantId) { this.tenantId = tenantId; } @Override - public Object getTenantId() { + public final Object getTenantId() { return tenantId; } @@ -926,7 +923,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { /** * Notify the transaction manager. */ - void notifyCommit() { + final void notifyCommit() { if (manager != null) { if (queryOnly) { manager.notifyOfQueryOnly(this); @@ -1000,13 +997,13 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void postCommit() { + public final void postCommit() { firePostCommit(); notifyCommit(); } @Override - public void preCommit() { + public final void preCommit() { internalBatchFlush(); firePreCommit(); } @@ -1081,7 +1078,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { /** * Notify the transaction manager. */ - void notifyRollback(Throwable cause) { + final void notifyRollback(Throwable cause) { if (manager != null) { if (queryOnly) { manager.notifyOfQueryOnly(this); @@ -1095,7 +1092,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Return true if the transaction is marked as rollback only. */ @Override - public boolean isRollbackOnly() { + public final boolean isRollbackOnly() { return rollbackOnly; } @@ -1103,17 +1100,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Mark the transaction as rollback only. */ @Override - public void setRollbackOnly() { + public final void setRollbackOnly() { this.rollbackOnly = true; } @Override - public boolean isNestedUseSavepoint() { + public final boolean isNestedUseSavepoint() { return nestedUseSavepoint; } @Override - public void setNestedUseSavepoint() { + public final void setNestedUseSavepoint() { this.nestedUseSavepoint = true; } @@ -1159,7 +1156,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void postRollback(Throwable cause) { + public final void postRollback(Throwable cause) { firePostRollback(); notifyRollback(cause); } @@ -1183,22 +1180,22 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public boolean isPersistCascade() { + public final boolean isPersistCascade() { return persistCascade; } @Override - public void setPersistCascade(boolean persistCascade) { + public final void setPersistCascade(boolean persistCascade) { this.persistCascade = persistCascade; } @Override - public void addModification(String tableName, boolean inserts, boolean updates, boolean deletes) { + public final void addModification(String tableName, boolean inserts, boolean updates, boolean deletes) { getEvent().add(tableName, inserts, updates, deletes); } @Override - public DocStoreTransaction getDocStoreTransaction() { + public final DocStoreTransaction getDocStoreTransaction() { if (docStoreTxn == null) { queryOnly = false; docStoreTxn = manager.createDocStoreTransaction(docStoreBatchSize); @@ -1207,7 +1204,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public void putUserObject(String name, Object value) { + public final void putUserObject(String name, Object value) { if (userObjects == null) { userObjects = new HashMap<>(); } @@ -1215,7 +1212,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public Object getUserObject(String name) { + public final Object getUserObject(String name) { if (userObjects == null) { return null; } @@ -1226,7 +1223,7 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * Alias for end(), which enables this class to be used in try-with-resources. */ @Override - public void close() { + public final void close() { end(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java index e0c33a193..cfd76c581 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java @@ -9,7 +9,7 @@ import java.sql.SQLException; /** * Jta based transaction. */ -public class JtaTransaction extends JdbcTransaction { +public final class JtaTransaction extends JdbcTransaction { private final UserTransaction userTransaction; 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 cc9e8cdc8..2168a287b 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 @@ -18,7 +18,7 @@ import javax.transaction.UserTransaction; /** * Hook into external JTA transaction manager. */ -public class JtaTransactionManager implements ExternalTransactionManager { +public final class JtaTransactionManager implements ExternalTransactionManager { private static final Logger logger = LoggerFactory.getLogger(JtaTransactionManager.class); 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 d435e93fd..0ed17e94f 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 @@ -19,9 +19,9 @@ import java.sql.Connection; import java.sql.SQLException; /** - * Place holder for use with SUPPORTS and NEVER transactional when there really isn't a transaction. + * Placeholder for use with SUPPORTS and NEVER transactional when there really isn't a transaction. */ -class NoTransaction implements SpiTransaction { +final class NoTransaction implements SpiTransaction { static final NoTransaction INSTANCE = new NoTransaction(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoopProfileHandler.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoopProfileHandler.java index 636ad7c6a..a994987c5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoopProfileHandler.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoopProfileHandler.java @@ -6,7 +6,7 @@ import io.ebeaninternal.api.SpiProfileHandler; /** * A do nothing SpiProfileHandler. */ -public class NoopProfileHandler implements SpiProfileHandler { +public final class NoopProfileHandler implements SpiProfileHandler { @Override public void collectTransactionProfile(TransactionProfile transactionProfile) { 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 f963aad71..a3b97ec2a 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 @@ -9,7 +9,7 @@ import java.io.IOException; import java.util.LinkedHashSet; import java.util.Set; -public class RemoteTableMod implements BinaryWritable { +public final class RemoteTableMod implements BinaryWritable { private final long timestamp; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java index 50480c043..8a9041eef 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java @@ -14,7 +14,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -public class RemoteTransactionEvent implements Runnable, BinaryWritable { +public final class RemoteTransactionEvent implements Runnable, BinaryWritable { private final List beanPersistList = new ArrayList<>(); 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 dafaa05b5..aa4bc978e 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 @@ -12,7 +12,7 @@ import java.sql.Savepoint; /** * A nested transaction that represents a Savepoint. */ -class SavepointTransaction extends SpiTransactionProxy { +final class SavepointTransaction extends SpiTransactionProxy { private static final int STATE_COMMITTED = 1; private static final int STATE_ROLLED_BACK = 2; 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 961247bd9..b2a7269d0 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 @@ -11,7 +11,7 @@ import java.util.UUID; * Holder of the changes handling the case when we send the changes * prior to commit or rollback as we hit the allowed 'batch size'. */ -public class TChangeLogHolder { +public final class TChangeLogHolder { /** * The owning transaction. 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 e16fa6d81..d3793a8e4 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 @@ -17,7 +17,7 @@ import java.util.concurrent.ConcurrentHashMap; * This information is used to validate entries in the L2 query caches. *

*/ -public class TableModState implements QueryCacheEntryValidate, ServerCacheNotify { +public final class TableModState implements QueryCacheEntryValidate, ServerCacheNotify { private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.TABLEMOD"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java index 9a8684982..687741654 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java @@ -33,8 +33,7 @@ abstract class TransactionFactory { /** * Set the Transaction Isolation level if required. */ - SpiTransaction setIsolationLevel(SpiTransaction t, boolean explicit, int isolationLevel) { - + final SpiTransaction setIsolationLevel(SpiTransaction t, boolean explicit, int isolationLevel) { if (isolationLevel > -1) { Connection connection = t.getConnection(); try { @@ -44,11 +43,9 @@ abstract class TransactionFactory { throw new PersistenceException(e); } } - if (explicit && manager.log().txn().isTrace()) { manager.log().txn().trace(t.getLogPrefix() + "Begin"); } - return t; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasic.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasic.java index 1fd2f9e69..a190cf64e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasic.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasic.java @@ -22,7 +22,6 @@ class TransactionFactoryBasic extends TransactionFactory { @Override public SpiTransaction createReadOnlyTransaction(Object tenantId) { - Connection connection = null; try { connection = dataSource.getConnection(); @@ -37,7 +36,7 @@ class TransactionFactoryBasic extends TransactionFactory { } @Override - public SpiTransaction createTransaction(boolean explicit, int isolationLevel) { + public final SpiTransaction createTransaction(boolean explicit, int isolationLevel) { Connection connection = null; try { connection = dataSource.getConnection(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasicWithRead.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasicWithRead.java index c942ed31e..d84361480 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasicWithRead.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasicWithRead.java @@ -16,7 +16,7 @@ import java.sql.SQLException; * - Skip explicit commit (as we use AutoCommit instead) *

*/ -class TransactionFactoryBasicWithRead extends TransactionFactoryBasic { +final class TransactionFactoryBasicWithRead extends TransactionFactoryBasic { private final DataSource readOnlyDataSource; @@ -27,16 +27,13 @@ class TransactionFactoryBasicWithRead extends TransactionFactoryBasic { @Override public SpiTransaction createReadOnlyTransaction(Object tenantId) { - Connection connection = null; try { connection = readOnlyDataSource.getConnection(); return new ImplicitReadOnlyTransaction(manager, connection); - } catch (PersistenceException ex) { JdbcClose.close(connection); throw ex; - } catch (SQLException ex) { throw new PersistenceException(ex); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBuilder.java index 590fcec63..b2b7e875f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBuilder.java @@ -5,7 +5,7 @@ import io.ebean.config.CurrentTenantProvider; /** * Helper to build and return the appropriate TransactionFactory. */ -class TransactionFactoryBuilder { +final class TransactionFactoryBuilder { /** * Build and return based on multi-tenancy and read only DataSource. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenant.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenant.java index fd70cd47a..64c9c9511 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenant.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenant.java @@ -29,8 +29,7 @@ class TransactionFactoryTenant extends TransactionFactory { } @Override - public SpiTransaction createTransaction(boolean explicit, int isolationLevel) { - + public final SpiTransaction createTransaction(boolean explicit, int isolationLevel) { SpiTransaction t = create(explicit, null); return setIsolationLevel(t, explicit, isolationLevel); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenantWithRead.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenantWithRead.java index 1aa190770..cb9f8c9c4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenantWithRead.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenantWithRead.java @@ -16,7 +16,7 @@ import java.sql.SQLException; * - Skip explicit commit (as we use AutoCommit instead) *

*/ -class TransactionFactoryTenantWithRead extends TransactionFactoryTenant { +final class TransactionFactoryTenantWithRead extends TransactionFactoryTenant { TransactionFactoryTenantWithRead(TransactionManager manager, DataSourceSupplier dataSourceSupplier, CurrentTenantProvider tenantProvider) { super(manager, dataSourceSupplier, tenantProvider); @@ -24,7 +24,6 @@ class TransactionFactoryTenantWithRead extends TransactionFactoryTenant { @Override public SpiTransaction createReadOnlyTransaction(Object tenantId) { - Connection connection = null; try { if (tenantId == null) { @@ -33,11 +32,9 @@ class TransactionFactoryTenantWithRead extends TransactionFactoryTenant { } connection = dataSourceSupplier.getReadOnlyConnection(tenantId); return new ImplicitReadOnlyTransaction(manager, connection, tenantId); - } catch (PersistenceException ex) { JdbcClose.close(connection); throw ex; - } catch (SQLException ex) { throw new PersistenceException(ex); } 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 e3fbdd425..37a53f680 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 @@ -201,14 +201,14 @@ public class TransactionManager implements SpiTransactionManager { /** * Return the scope manager. */ - public TransactionScopeManager scope() { + public final TransactionScopeManager scope() { return scopeManager; } /** * Set the transaction onto the scope. */ - public void set(SpiTransaction txn) { + public final void set(SpiTransaction txn) { scopeManager.set(txn); } @@ -216,7 +216,7 @@ public class TransactionManager implements SpiTransactionManager { * Return the current active transaction. */ @Override - public SpiTransaction getActive() { + public final SpiTransaction getActive() { return scopeManager.getActive(); } @@ -230,18 +230,18 @@ public class TransactionManager implements SpiTransactionManager { /** * Return the current transaction from thread local scope. Note that it may be inactive. */ - public SpiTransaction getInScope() { + public final SpiTransaction getInScope() { return scopeManager.getInScope(); } /** * Translate the SQLException into a specific exception if possible based on the DB platform. */ - public PersistenceException translate(String message, SQLException cause) { + public final PersistenceException translate(String message, SQLException cause) { return databasePlatform.translate(message, cause); } - public void shutdown(boolean shutdownDataSource, boolean deregisterDriver) { + public final void shutdown(boolean shutdownDataSource, boolean deregisterDriver) { if (shutdownDataSource) { dataSourceSupplier.shutdown(deregisterDriver); } @@ -250,39 +250,39 @@ public class TransactionManager implements SpiTransactionManager { /** * Return true if the DB platform supports SavepointId(). */ - boolean isSupportsSavepointId() { + final boolean isSupportsSavepointId() { return supportsSavepointId; } - boolean isDocStoreActive() { + final boolean isDocStoreActive() { return docStoreActive; } - DocStoreTransaction createDocStoreTransaction(int docStoreBatchSize) { + final DocStoreTransaction createDocStoreTransaction(int docStoreBatchSize) { return docStoreUpdateProcessor.createTransaction(docStoreBatchSize); } - boolean isSkipCacheAfterWrite() { + final boolean isSkipCacheAfterWrite() { return skipCacheAfterWrite; } - public BeanDescriptorManager getBeanDescriptorManager() { + public final BeanDescriptorManager getBeanDescriptorManager() { return beanDescriptorManager; } - BulkEventListenerMap getBulkEventListenerMap() { + final BulkEventListenerMap getBulkEventListenerMap() { return bulkEventListenerMap; } - boolean isAutoPersistUpdates() { + final boolean isAutoPersistUpdates() { return autoPersistUpdates; } - boolean isPersistBatch() { + final boolean isPersistBatch() { return persistBatch; } - boolean isPersistBatchOnCascade() { + final boolean isPersistBatchOnCascade() { return persistBatchOnCascade; } @@ -296,7 +296,7 @@ public class TransactionManager implements SpiTransactionManager { * If the Isolation level is higher (say SERIALIZABLE) then Connections used * just for queries do need to be committed or rollback after the query. */ - OnQueryOnly initOnQueryOnly(OnQueryOnly dbPlatformOnQueryOnly) { + final OnQueryOnly initOnQueryOnly(OnQueryOnly dbPlatformOnQueryOnly) { // first check for a system property 'override' String systemPropertyValue = System.getProperty("ebean.transaction.onqueryonly"); if (systemPropertyValue != null) { @@ -306,29 +306,29 @@ public class TransactionManager implements SpiTransactionManager { return dbPlatformOnQueryOnly == null ? OnQueryOnly.COMMIT : dbPlatformOnQueryOnly; } - public String getServerName() { + public final String getServerName() { return serverName; } @Override - public Connection getQueryPlanConnection() throws SQLException { + public final Connection getQueryPlanConnection() throws SQLException { return dataSourceSupplier.getConnection(null); } @Override - public DataSource getDataSource() { + public final DataSource getDataSource() { return dataSourceSupplier.getDataSource(); } @Override - public DataSource getReadOnlyDataSource() { + public final DataSource getReadOnlyDataSource() { return dataSourceSupplier.getReadOnlyDataSource(); } /** * Defines the type of behavior to use when closing a transaction that was used to query data only. */ - OnQueryOnly getOnQueryOnly() { + final OnQueryOnly getOnQueryOnly() { return onQueryOnly; } @@ -390,7 +390,7 @@ public class TransactionManager implements SpiTransactionManager { * Process a local rolled back transaction. */ @Override - public void notifyOfRollback(SpiTransaction transaction, Throwable cause) { + public final void notifyOfRollback(SpiTransaction transaction, Throwable cause) { try { if (txnLogger.isDebug()) { String msg = transaction.getLogPrefix() + "Rollback"; @@ -408,7 +408,7 @@ public class TransactionManager implements SpiTransactionManager { * Query only transaction in read committed isolation. */ @Override - public void notifyOfQueryOnly(SpiTransaction transaction) { + public final void notifyOfQueryOnly(SpiTransaction transaction) { // Nothing that interesting here if (txnLogger.isTrace()) { txnLogger.trace(transaction.getLogPrefix() + "Commit - query only"); @@ -442,7 +442,7 @@ public class TransactionManager implements SpiTransactionManager { * Process a local committed transaction. */ @Override - public void notifyOfCommit(SpiTransaction transaction) { + public final void notifyOfCommit(SpiTransaction transaction) { try { if (txnLogger.isDebug()) { txnLogger.debug(transaction.getLogPrefix() + "Commit"); @@ -455,7 +455,7 @@ public class TransactionManager implements SpiTransactionManager { } } - public void externalModification(TransactionEventTable tableEvent) { + public final void externalModification(TransactionEventTable tableEvent) { SpiTransaction t = getActive(); if (t != null) { t.getEvent().add(tableEvent); @@ -476,7 +476,7 @@ public class TransactionManager implements SpiTransactionManager { /** * Notify local BeanPersistListeners etc of events from another server in the cluster. */ - public void remoteTransactionEvent(RemoteTransactionEvent remoteEvent) { + public final void remoteTransactionEvent(RemoteTransactionEvent remoteEvent) { if (clusterLogger.isDebugEnabled()) { clusterLogger.debug("processing {}", remoteEvent); } @@ -506,14 +506,14 @@ public class TransactionManager implements SpiTransactionManager { /** * Process the docstore / ElasticSearch updates. */ - void processDocStoreUpdates(DocStoreUpdates docStoreUpdates, int bulkBatchSize) { + final void processDocStoreUpdates(DocStoreUpdates docStoreUpdates, int bulkBatchSize) { docStoreUpdateProcessor.process(docStoreUpdates, bulkBatchSize); } /** * Prepare and then send/log the changeSet. */ - void sendChangeLog(final ChangeSet changeSet) { + final void sendChangeLog(final ChangeSet changeSet) { // can set userId, userIpAddress & userContext if desired if (changeLogPrepare.prepare(changeSet)) { if (changeLogAsync) { @@ -528,7 +528,7 @@ public class TransactionManager implements SpiTransactionManager { /** * Invalidate the query caches for entities based on views. */ - void processTouchedTables(Set touchedTables) { + final void processTouchedTables(Set touchedTables) { tableModState.touch(touchedTables); if (viewInvalidation) { beanDescriptorManager.processViewInvalidation(touchedTables); @@ -539,32 +539,32 @@ public class TransactionManager implements SpiTransactionManager { /** * Process the collected transaction profiling information. */ - void profileCollect(TransactionProfile transactionProfile) { + final void profileCollect(TransactionProfile transactionProfile) { profileHandler.collectTransactionProfile(transactionProfile); } /** * Collect execution time for an explicit transaction. */ - void collectMetric(long exeMicros) { + final void collectMetric(long exeMicros) { txnMain.add(exeMicros); } /** * Collect execution time for implicit read only transaction. */ - void collectMetricReadOnly(long exeMicros) { + final void collectMetricReadOnly(long exeMicros) { txnReadOnly.add(exeMicros); } /** * Collect execution time for a named transaction. */ - void collectMetricNamed(long exeMicros, String label) { + final void collectMetricNamed(long exeMicros, String label) { txnNamed.add(label, exeMicros); } - public void visitMetrics(MetricVisitor visitor) { + public final void visitMetrics(MetricVisitor visitor) { txnMain.visit(visitor); txnReadOnly.visit(visitor); txnNamed.visit(visitor); @@ -576,14 +576,14 @@ public class TransactionManager implements SpiTransactionManager { /** * Clear an implicit transaction from thread local scope. */ - public void clearServerTransaction() { + public final void clearServerTransaction() { scopeManager.clear(); } /** * Begin an implicit transaction. */ - public SpiTransaction beginServerTransaction() { + public final SpiTransaction beginServerTransaction() { SpiTransaction t = createTransaction(false, -1); scopeManager.set(t); return t; @@ -592,7 +592,7 @@ public class TransactionManager implements SpiTransactionManager { /** * Exit a scoped transaction (that can be inactive - already committed etc). */ - public void exitScopedTransaction(Object returnOrThrowable, int opCode) { + public final void exitScopedTransaction(Object returnOrThrowable, int opCode) { SpiTransaction st = getInScope(); if (st instanceof ScopedTransaction) { // can be null for Supports as that can start as a 'No Transaction' and then @@ -602,7 +602,7 @@ public class TransactionManager implements SpiTransactionManager { } @Override - public void externalRemoveTransaction() { + public final void externalRemoveTransaction() { scopeManager.clearExternal(); } @@ -611,7 +611,7 @@ public class TransactionManager implements SpiTransactionManager { * (e.g. Spring managed transaction). */ @Override - public ScopedTransaction externalBeginTransaction(SpiTransaction transaction, TxScope txScope) { + public final ScopedTransaction externalBeginTransaction(SpiTransaction transaction, TxScope txScope) { ScopedTransaction scopedTxn = new ScopedTransaction(scopeManager); scopedTxn.push(new ScopeTrans(rollbackOnChecked, false, transaction, txScope)); scopeManager.replace(scopedTxn); @@ -621,7 +621,7 @@ public class TransactionManager implements SpiTransactionManager { /** * Begin a scoped transaction. */ - public ScopedTransaction beginScopedTransaction(TxScope txScope) { + public final ScopedTransaction beginScopedTransaction(TxScope txScope) { txScope = initTxScope(txScope); ScopedTransaction txnContainer = getActiveScoped(); @@ -742,26 +742,26 @@ public class TransactionManager implements SpiTransactionManager { /** * Return true if Transaction debug is on. */ - public boolean isTxnDebug() { + public final boolean isTxnDebug() { return txnDebug; } - public SpiLogManager log() { + public final SpiLogManager log() { return logManager; } - public boolean isLogSql() { + public final boolean isLogSql() { return logManager.sql().isDebug(); } - public boolean isLogSummary() { + public final boolean isLogSummary() { return logManager.sum().isDebug(); } /** * Experimental - find dirty beans in the persistence context and persist them. */ - public void flushTransparent(SpiPersistenceContext persistenceContext, SpiTransaction transaction) { + public final void flushTransparent(SpiPersistenceContext persistenceContext, SpiTransaction transaction) { List dirtyBeans = persistenceContext.dirtyBeans(beanDescriptorManager); if (!dirtyBeans.isEmpty()) { server.updateAll(dirtyBeans, transaction); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManagerOptions.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManagerOptions.java index 5d0c87794..b7d54b37e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManagerOptions.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManagerOptions.java @@ -14,7 +14,7 @@ import io.ebeanservice.docstore.api.DocStoreUpdateProcessor; /** * Objects supplied for constructing the TransactionManager. */ -public class TransactionManagerOptions { +public final class TransactionManagerOptions { final SpiServer server; final boolean notifyL2CacheInForeground; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionProfile.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionProfile.java index 2c7006eba..cb749cd54 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionProfile.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionProfile.java @@ -5,7 +5,7 @@ import io.ebean.ProfileLocation; /** * Profiling information for a single transaction that has completed. */ -public class TransactionProfile { +public final class TransactionProfile { private final ProfileLocation location; private final String label; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/AttributeConverterAdapter.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/AttributeConverterAdapter.java index e358dd891..242b657f3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/AttributeConverterAdapter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/AttributeConverterAdapter.java @@ -7,7 +7,7 @@ import javax.persistence.AttributeConverter; /** * Adapter from ScalarTypeConverter to AttributeConverter. */ -class AttributeConverterAdapter implements ScalarTypeConverter { +final class AttributeConverterAdapter implements ScalarTypeConverter { private final AttributeConverter converter; private final B nullValue; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ConvertInetAddresses.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ConvertInetAddresses.java index 03357004a..ebec02029 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ConvertInetAddresses.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ConvertInetAddresses.java @@ -112,7 +112,7 @@ import java.util.regex.Pattern; * @author Erik Kline * @since 5 */ -public final class ConvertInetAddresses { +final class ConvertInetAddresses { private static final int IPV4_PART_COUNT = 4; private static final int IPV6_PART_COUNT = 8; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java index 2959c872c..89603122b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBind.java @@ -26,16 +26,12 @@ public class DataBind implements DataBinder { private static final Logger log = LoggerFactory.getLogger(DataBind.class); private final DataTimeZone dataTimeZone; - private final PreparedStatement pstmt; - private final Connection connection; - private final StringBuilder bindLog = new StringBuilder(); - private List inputStreams; - protected int pos; + private String json; public DataBind(DataTimeZone dataTimeZone, PreparedStatement pstmt, Connection connection) { this.dataTimeZone = dataTimeZone; @@ -44,22 +40,35 @@ public class DataBind implements DataBinder { } @Override - public StringBuilder append(Object entry) { + public final void pushJson(String json) { + assert this.json == null; // we can only push one value + this.json = json; + } + + @Override + public final String popJson() { + String ret = json; + json = null; + return ret; + } + + @Override + public final StringBuilder append(Object entry) { return bindLog.append(entry); } @Override - public StringBuilder log() { + public final StringBuilder log() { return bindLog; } @Override - public void close() throws SQLException { + public final void close() throws SQLException { pstmt.close(); } @Override - public int currentPos() { + public final int currentPos() { return pos; } @@ -69,7 +78,7 @@ public class DataBind implements DataBinder { } @Override - public void setObject(Object value, int sqlType) throws SQLException { + public final void setObject(Object value, int sqlType) throws SQLException { pstmt.setObject(++pos, value, sqlType); } @@ -79,17 +88,17 @@ public class DataBind implements DataBinder { } @Override - public int nextPos() { + public final int nextPos() { return ++pos; } @Override - public void decrementPos() { + public final void decrementPos() { --pos; } @Override - public int executeUpdate() throws SQLException { + public final int executeUpdate() throws SQLException { try { return pstmt.executeUpdate(); } finally { @@ -111,7 +120,7 @@ public class DataBind implements DataBinder { } @Override - public PreparedStatement getPstmt() { + public final PreparedStatement getPstmt() { return pstmt; } @@ -121,37 +130,37 @@ public class DataBind implements DataBinder { } @Override - public void setInt(int i) throws SQLException { + public final void setInt(int i) throws SQLException { pstmt.setInt(++pos, i); } @Override - public void setLong(long i) throws SQLException { + public final void setLong(long i) throws SQLException { pstmt.setLong(++pos, i); } @Override - public void setShort(short i) throws SQLException { + public final void setShort(short i) throws SQLException { pstmt.setShort(++pos, i); } @Override - public void setFloat(float i) throws SQLException { + public final void setFloat(float i) throws SQLException { pstmt.setFloat(++pos, i); } @Override - public void setDouble(double i) throws SQLException { + public final void setDouble(double i) throws SQLException { pstmt.setDouble(++pos, i); } @Override - public void setBigDecimal(BigDecimal v) throws SQLException { + public final void setBigDecimal(BigDecimal v) throws SQLException { pstmt.setBigDecimal(++pos, v); } @Override - public void setDate(java.sql.Date v) throws SQLException { + public final void setDate(java.sql.Date v) throws SQLException { Calendar timeZone = dataTimeZone.getDateTimeZone(); if (timeZone != null) { pstmt.setDate(++pos, v, timeZone); @@ -161,7 +170,7 @@ public class DataBind implements DataBinder { } @Override - public void setTimestamp(Timestamp v) throws SQLException { + public final void setTimestamp(Timestamp v) throws SQLException { Calendar timeZone = dataTimeZone.getTimeZone(); if (timeZone != null) { pstmt.setTimestamp(++pos, v, timeZone); @@ -171,7 +180,7 @@ public class DataBind implements DataBinder { } @Override - public void setTime(Time v) throws SQLException { + public final void setTime(Time v) throws SQLException { Calendar timeZone = dataTimeZone.getTimeZone(); if (timeZone != null) { pstmt.setTime(++pos, v, timeZone); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java index e87ebf471..659d0ef06 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataBindCapture.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.type.bindcapture.BindCaptureStatement; /** * Special DataBind used to capture bind values for obtaining explain plans. */ -public class DataBindCapture extends DataBind { +public final class DataBindCapture extends DataBind { private final BindCaptureStatement captureStatement; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataEncryptSupport.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataEncryptSupport.java index 32d87cd91..791d3e78e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DataEncryptSupport.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DataEncryptSupport.java @@ -4,7 +4,7 @@ import io.ebean.config.EncryptKey; import io.ebean.config.EncryptKeyManager; import io.ebean.config.Encryptor; -public class DataEncryptSupport { +public final class DataEncryptSupport { private final EncryptKeyManager encryptKeyManager; private final Encryptor encryptor; 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 index 60e3f6d6e..13ceb73c2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DecimalUtils.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DecimalUtils.java @@ -27,7 +27,7 @@ import java.time.Instant; * @author Nick Williams * @since 2.2.0 */ -public final class DecimalUtils { +final class DecimalUtils { private static final char[] ZEROES = new char[]{'0', '0', '0', '0', '0', '0', '0', '0', '0'}; @@ -37,53 +37,48 @@ public final class DecimalUtils { throw new RuntimeException("DecimalUtils cannot be instantiated."); } - public static Duration toDuration(BigDecimal value) { - + static Duration toDuration(BigDecimal value) { long seconds = value.longValue(); int nanoseconds = extractNanosecondDecimal(value, seconds); - return Duration.ofSeconds(seconds, nanoseconds); } - public static BigDecimal toDecimal(Duration instant) { + static BigDecimal toDecimal(Duration instant) { return new BigDecimal(toDecimal(instant.getSeconds(), instant.getNano())); } - public static Timestamp toTimestamp(BigDecimal value) { - + 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; } - public static BigDecimal toDecimal(Timestamp instant) { + static BigDecimal toDecimal(Timestamp instant) { long millis = instant.getTime(); long secs = millis / 1000; return new BigDecimal(toDecimal(secs, instant.getNanos())); } - public static Instant toInstant(BigDecimal value) { - + static Instant toInstant(BigDecimal value) { long seconds = value.longValue(); int nanoseconds = extractNanosecondDecimal(value, seconds); return Instant.ofEpochSecond(seconds, nanoseconds); } - public static BigDecimal toDecimal(Instant instant) { + static BigDecimal toDecimal(Instant instant) { return new BigDecimal(toDecimal(instant.getEpochSecond(), instant.getNano())); } - public static String toDecimal(long seconds, int nanoseconds) { + 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; } - public static int extractNanosecondDecimal(BigDecimal value, long integer) { + 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 22f50b937..b962a4811 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 @@ -14,7 +14,7 @@ import java.util.Date; * Helper to create some default ScalarType objects for Booleans, * java.util.Date, java.util.Calendar etc. */ -public class DefaultTypeFactory { +final class DefaultTypeFactory { private final DatabaseConfig config; @@ -22,7 +22,7 @@ public class DefaultTypeFactory { this.config = config; } - protected ScalarTypeBool createBoolean(String trueValue, String falseValue) { + ScalarTypeBool createBoolean(String trueValue, String falseValue) { try { // first try Integer based boolean Integer intTrue = BasicTypeConverter.toInteger(trueValue); 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 befe46b20..d58c284f3 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 @@ -2,7 +2,6 @@ package io.ebeaninternal.server.type; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; import io.ebean.annotation.*; import io.ebean.config.DatabaseConfig; import io.ebean.config.JsonConfig; @@ -72,7 +71,7 @@ public final class DefaultTypeManager implements TypeManager { private final ScalarType varbinaryType = new ScalarTypeBytesVarbinary(); private final ScalarType longVarbinaryType = new ScalarTypeBytesLongVarbinary(); private final ScalarType shortType = new ScalarTypeShort(); - private final ScalarType integerType = ScalarTypeInteger.INSTANCE; + private final ScalarType integerType = new ScalarTypeInteger(); private final ScalarType longType = new ScalarTypeLong(); private final ScalarType doubleType = new ScalarTypeDouble(); private final ScalarType floatType = new ScalarTypeFloat(); @@ -135,7 +134,7 @@ public final class DefaultTypeManager implements TypeManager { this.postgres = isPostgres(config.getDatabasePlatform()); this.objectMapperPresent = config.getClassLoadConfig().isJacksonObjectMapperPresent(); this.objectMapper = (objectMapperPresent) ? initObjectMapper(config) : null; - this.jsonManager = (objectMapperPresent) ? new TypeJsonManager(postgres, objectMapper, config.isJsonDirtyByDefault()) : null; + this.jsonManager = (objectMapperPresent) ? new TypeJsonManager(postgres, objectMapper, config.getJsonMutationDetection()) : null; this.extraTypeFactory = new DefaultTypeFactory(config); this.arrayTypeListFactory = arrayTypeListFactory(config.getDatabasePlatform()); this.arrayTypeSetFactory = arrayTypeSetFactory(config.getDatabasePlatform()); @@ -290,7 +289,7 @@ public final class DefaultTypeManager implements TypeManager { @Override public ScalarType getDbMapScalarType() { - return (postgres) ? hstoreType : ScalarTypeJsonMap.typeFor(false, Types.VARCHAR); + return (postgres) ? hstoreType : ScalarTypeJsonMap.typeFor(false, Types.VARCHAR, false); } @Override @@ -313,7 +312,7 @@ public final class DefaultTypeManager implements TypeManager { return arrayTypeSetFactory.typeFor(valueType, nullable); } // fallback to JSON storage in VARCHAR column - return new ScalarTypeJsonSet.Varchar(getDocType(valueType), nullable); + return new ScalarTypeJsonSet.Varchar(getDocType(valueType), nullable, false); // TODO: keepSource for @DbArray? } private ScalarType getArrayScalarTypeList(Type valueType, boolean nullable) { @@ -324,7 +323,7 @@ public final class DefaultTypeManager implements TypeManager { return arrayTypeListFactory.typeFor(valueType, nullable); } // fallback to JSON storage in VARCHAR column - return new ScalarTypeJsonList.Varchar(getDocType(valueType), nullable); + return new ScalarTypeJsonList.Varchar(getDocType(valueType), nullable, false); // TODO: keepSource for @DbArray? } private Class> asEnumClass(Type valueType) { @@ -341,10 +340,11 @@ public final class DefaultTypeManager implements TypeManager { Type genericType = prop.getGenericType(); boolean hasJacksonAnnotations = objectMapperPresent && checkJacksonAnnotations(prop); + boolean keepSource = prop.getMutationDetection() == MutationDetection.SOURCE; if (type.equals(List.class)) { DocPropertyType docType = getDocType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable()); + return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource); } else { return createJsonObjectMapperType(prop, dbType, docType); } @@ -352,19 +352,19 @@ public final class DefaultTypeManager implements TypeManager { if (type.equals(Set.class)) { DocPropertyType docType = getDocType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable()); + return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource); } else { return createJsonObjectMapperType(prop, dbType, docType); } } if (type.equals(Map.class)) { if (!hasJacksonAnnotations && isMapValueTypeObject(genericType)) { - return ScalarTypeJsonMap.typeFor(postgres, dbType); + return ScalarTypeJsonMap.typeFor(postgres, dbType, keepSource); } else { return createJsonObjectMapperType(prop, dbType, DocPropertyType.OBJECT); } } - if (objectMapperPresent) { + if (objectMapperPresent && prop.getMutationDetection() == MutationDetection.DEFAULT) { if (type.equals(JsonNode.class)) { switch (dbType) { case Types.VARCHAR: @@ -426,7 +426,7 @@ public final class DefaultTypeManager implements TypeManager { if (objectMapper == null) { throw new IllegalArgumentException("Type [" + type + "] unsupported for @DbJson mapping - Jackson ObjectMapper not present"); } - return ScalarTypeJsonObjectMapper.createTypeFor(jsonManager, (AnnotatedField) prop.getJacksonField(), dbType, docType); + return ScalarTypeJsonObjectMapper.createTypeFor(jsonManager, prop, dbType, docType); } /** @@ -557,7 +557,7 @@ public final class DefaultTypeManager implements TypeManager { // no override or further mapping required return scalarType; } - ScalarTypeEnum scalarEnum = (ScalarTypeEnum)scalarType; + ScalarTypeEnum scalarEnum = (ScalarTypeEnum) scalarType; if (scalarEnum != null && !scalarEnum.isOverrideBy(type)) { if (type != null && !scalarEnum.isCompatible(type)) { throw new IllegalStateException("Error mapping Enum type:" + enumType + " It is mapped using 2 different modes when only one is supported (ORDINAL, STRING or an Ebean mapping)"); @@ -674,7 +674,7 @@ public final class DefaultTypeManager implements TypeManager { private Object initObjectMapper(DatabaseConfig config) { Object objectMapper = config.getObjectMapper(); if (objectMapper == null) { - objectMapper = new ObjectMapper(); + objectMapper = InitObjectMapper.init(); config.setObjectMapper(objectMapper); } return objectMapper; 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 7d62a8391..2e2d2cc31 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 @@ -10,7 +10,7 @@ import java.sql.Types; /** * Used to map enum values to database integer values. */ -public class EnumToDbIntegerMap extends EnumToDbValueMap { +final class EnumToDbIntegerMap extends EnumToDbValueMap { @Override public int getDbType() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbStringMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbStringMap.java index 05b0f8991..062749580 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbStringMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbStringMap.java @@ -9,7 +9,7 @@ import java.sql.Types; /** * Used to map Enum values to database string/varchar values. */ -public class EnumToDbStringMap extends EnumToDbValueMap { +final class EnumToDbStringMap extends EnumToDbValueMap { @Override public int getDbType() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbValueMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbValueMap.java index 08240cabc..92ebc9334 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbValueMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/EnumToDbValueMap.java @@ -15,26 +15,22 @@ import java.util.LinkedHashMap; * Enum gets converter to. *

*/ -public abstract class EnumToDbValueMap { +abstract class EnumToDbValueMap { - public static EnumToDbValueMap create(boolean integerType) { + static EnumToDbValueMap create(boolean integerType) { return integerType ? new EnumToDbIntegerMap() : new EnumToDbStringMap(); } final LinkedHashMap keyMap; - final LinkedHashMap valueMap; - final HashMap nameMap; - final boolean allowNulls; - final boolean isIntegerType; /** * Construct with allowNulls defaulting to false. */ - public EnumToDbValueMap() { + EnumToDbValueMap() { this(false, false); } @@ -46,7 +42,7 @@ public abstract class EnumToDbValueMap { * value is found. *

*/ - public EnumToDbValueMap(boolean allowNulls, boolean isIntegerType) { + EnumToDbValueMap(boolean allowNulls, boolean isIntegerType) { this.allowNulls = allowNulls; this.isIntegerType = isIntegerType; this.keyMap = new LinkedHashMap<>(); @@ -58,7 +54,7 @@ public abstract class EnumToDbValueMap { * Return true if this is mapping to integers, false * if mapping to Strings. */ - public boolean isIntegerType() { + boolean isIntegerType() { return isIntegerType; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/InitObjectMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/InitObjectMapper.java new file mode 100644 index 000000000..7daee8bd5 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/InitObjectMapper.java @@ -0,0 +1,22 @@ +package io.ebeaninternal.server.type; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Initialise the Jackson ObjectMapper. + */ +final class InitObjectMapper { + + /** + * Create and return the default ObjectMapper. + */ + static Object init() { + SimpleModule module = new SimpleModule(); + module.addAbstractTypeMapping(Set.class, LinkedHashSet.class); + return new ObjectMapper().registerModule(module); + } +} 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 index a6f8a8636..fd4373062 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/IsoJsonDateTimeParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/IsoJsonDateTimeParser.java @@ -4,7 +4,7 @@ import java.time.Instant; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; -class IsoJsonDateTimeParser { +final class IsoJsonDateTimeParser { private static final DateTimeFormatter ISO_MILLIS = new DateTimeFormatterBuilder() .parseCaseInsensitive() diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/JacksonTypeHelper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/JacksonTypeHelper.java index 1e1db244d..7d2d5b3e1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/JacksonTypeHelper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/JacksonTypeHelper.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.type; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.introspect.AnnotatedField; -class JacksonTypeHelper { +final class JacksonTypeHelper { private final AnnotatedField field; private final ObjectMapper objectMapper; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/LongToTimestampConverter.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/LongToTimestampConverter.java deleted file mode 100644 index e396602d4..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/LongToTimestampConverter.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.ebeaninternal.server.type; - -import io.ebean.config.ScalarTypeConverter; - -import java.sql.Timestamp; - -public class LongToTimestampConverter implements ScalarTypeConverter { - - @Override - public Long getNullValue() { - return null; - } - - @Override - public Timestamp unwrapValue(Long beanType) { - - return new Timestamp(beanType); - } - - @Override - public Long wrapValue(Timestamp scalarType) { - - return scalarType.getTime(); - } - - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java index d422b493f..768c7a751 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/PostgresHelper.java @@ -4,19 +4,19 @@ import org.postgresql.util.PGobject; import java.sql.SQLException; -public class PostgresHelper { +public final class PostgresHelper { /** * The Postgres JSON DB type. */ - public static final String JSON_TYPE = "json"; + static final String JSON_TYPE = "json"; /** * The Postgres JSONB DB type. */ - public static final String JSONB_TYPE = "jsonb"; + static final String JSONB_TYPE = "jsonb"; - public static final String INET_TYPE = "inet"; + static final String INET_TYPE = "inet"; public static Object asInet(String value) throws SQLException { return asObject(INET_TYPE, value); @@ -26,7 +26,6 @@ public class PostgresHelper { * Construct and return Postgres specific PG object. */ public static Object asObject(String pgType, String rawJson) throws SQLException { - PGobject pgo = new PGobject(); pgo.setType(pgType); pgo.setValue(rawJson); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java index 9763a5667..b85c8e688 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java @@ -20,22 +20,29 @@ import java.util.Calendar; public class RsetDataReader implements DataReader { private static final int bufferSize = 512; - static final int clobBufferSize = 512; - static final int stringInitialSize = 512; private final DataTimeZone dataTimeZone; - private final ResultSet rset; - protected int pos; + private String json; public RsetDataReader(DataTimeZone dataTimeZone, ResultSet rset) { this.dataTimeZone = dataTimeZone; this.rset = rset; } + @Override + public void pushJson(String json) { + this.json = json; + } + + @Override + public String popJson() { + return json; + } + @Override public void close() throws SQLException { rset.close(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReaderIndexed.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReaderIndexed.java index 9ebeab367..773a19bb8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReaderIndexed.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReaderIndexed.java @@ -7,7 +7,7 @@ import java.sql.ResultSet; /** * A DataReader with indexed positions for the properties to read specifically for RawSql use. */ -public class RsetDataReaderIndexed extends RsetDataReader { +public final class RsetDataReaderIndexed extends RsetDataReader { private final int[] rsetIndexPositions; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarHelp.java index cf561e426..5bfcf1a8e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarHelp.java @@ -6,12 +6,12 @@ import java.io.IOException; /** * Utility methods for ScalarTypes. */ -public class ScalarHelp { +final class ScalarHelp { /** * Write the string content as UTF with the proceeding boolean true indicating the non-null. */ - public static void writeUTF(DataOutput dataOutput, String content) throws IOException { + static void writeUTF(DataOutput dataOutput, String content) throws IOException { dataOutput.writeBoolean(true); dataOutput.writeUTF(content); } 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 6ee64d5cf..f0b0ad855 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 @@ -28,7 +28,7 @@ import static java.util.Collections.EMPTY_LIST; * Type mapped for DB ARRAY type (Postgres only effectively). */ @SuppressWarnings("rawtypes") -public class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTypeArray { +class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTypeArray { static PlatformArrayTypeFactory factory() { return new Factory(); 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 f8b30a7a0..c9bc3a3f2 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 @@ -19,7 +19,7 @@ import static java.util.Collections.EMPTY_LIST; * H2 database support for DB ARRAY. */ @SuppressWarnings("rawtypes") -class ScalarTypeArrayListH2 extends ScalarTypeArrayList { +final class ScalarTypeArrayListH2 extends ScalarTypeArrayList { static PlatformArrayTypeFactory factory() { return new ScalarTypeArrayListH2.Factory(); 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 90f592428..666d52b10 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 @@ -29,7 +29,7 @@ import static java.util.Collections.EMPTY_SET; * Type mapped for DB ARRAY type (Postgres only effectively). */ @SuppressWarnings({"rawtypes", "unchecked"}) -public class ScalarTypeArraySet extends ScalarTypeArrayBase implements ScalarTypeArray { +class ScalarTypeArraySet extends ScalarTypeArrayBase implements ScalarTypeArray { static PlatformArrayTypeFactory factory() { return new Factory(); 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 cd7f7cf98..1d5c78553 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 @@ -19,7 +19,7 @@ import static java.util.Collections.EMPTY_SET; * H2 database support for DB ARRAY. */ @SuppressWarnings("rawtypes") -class ScalarTypeArraySetH2 extends ScalarTypeArraySet { +final class ScalarTypeArraySetH2 extends ScalarTypeArraySet { static PlatformArrayTypeFactory factory() { return new ScalarTypeArraySetH2.Factory(); 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 index a6a0675a0..5d2bb45e9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBase.java @@ -6,15 +6,13 @@ import io.ebean.core.type.ScalarType; /** * Base ScalarType object. */ -public abstract class ScalarTypeBase implements ScalarType { +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) { + ScalarTypeBase(Class type, boolean jdbcNative, int jdbcType) { this.type = type; this.jdbcNative = jdbcNative; this.jdbcType = jdbcType; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java index f752da1d4..4e55d34de 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDate.java @@ -18,7 +18,7 @@ import java.sql.Types; /** * Base class for Date types. */ -public abstract class ScalarTypeBaseDate extends ScalarTypeBase { +abstract class ScalarTypeBaseDate extends ScalarTypeBase { protected final JsonConfig.Date mode; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java index c296b2e1f..aa1670df7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseDateTime.java @@ -21,11 +21,11 @@ import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.parseIso; /** * Base type for DateTime types. */ -public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { +abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { protected final JsonConfig.DateTime mode; - public ScalarTypeBaseDateTime(JsonConfig.DateTime mode, Class type, boolean jdbcNative, int jdbcType) { + ScalarTypeBaseDateTime(JsonConfig.DateTime mode, Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); this.mode = mode; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java index 78e26c4c0..7fd7d974e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBaseVarchar.java @@ -17,13 +17,13 @@ import java.sql.Types; * Base ScalarType for types which converts to and from a VARCHAR database * column. */ -public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { +abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { - public ScalarTypeBaseVarchar(Class type) { + ScalarTypeBaseVarchar(Class type) { super(type, false, Types.VARCHAR); } - public ScalarTypeBaseVarchar(Class type, boolean jdbcNative, int jdbcType) { + ScalarTypeBaseVarchar(Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); } 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 58dc1e720..0a3e98b6c 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 @@ -17,9 +17,9 @@ import java.sql.Types; /** * ScalarType for BigDecimal. */ -public class ScalarTypeBigDecimal extends ScalarTypeBase { +class ScalarTypeBigDecimal extends ScalarTypeBase { - public ScalarTypeBigDecimal() { + ScalarTypeBigDecimal() { super(BigDecimal.class, true, Types.DECIMAL); } 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 93a688e94..56bc180a9 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 @@ -21,9 +21,9 @@ import java.sql.Types; * This may or may not be a native jdbc type depending on the database and jdbc driver. *

*/ -public class ScalarTypeBoolean { +public final class ScalarTypeBoolean { - public static class Native extends BooleanBase { + public static final class Native extends BooleanBase { /** * Native Boolean database type. @@ -75,7 +75,7 @@ public class ScalarTypeBoolean { * type.boolean.dbtype="bit" in the ebean configuration *

*/ - static class BitBoolean extends BooleanBase { + static final class BitBoolean extends BooleanBase { /** * Native Boolean database type. @@ -124,7 +124,7 @@ public class ScalarTypeBoolean { /** * Converted to/from an Integer in the Database. */ - static class IntBoolean extends BooleanBase { + static final class IntBoolean extends BooleanBase { private final Integer trueValue; private final Integer falseValue; @@ -211,7 +211,7 @@ public class ScalarTypeBoolean { /** * Converted to/from an Integer in the Database. */ - static class StringBoolean extends BooleanBase { + static final class StringBoolean extends BooleanBase { private final String trueValue; private final String falseValue; 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 5d0660930..250bb1006 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 @@ -18,7 +18,7 @@ import java.sql.Types; /** * ScalarType for Byte. */ -public class ScalarTypeByte extends ScalarTypeBase { +final class ScalarTypeByte extends ScalarTypeBase { public ScalarTypeByte() { super(Byte.class, true, Types.TINYINT); 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 202ade97e..437c626f8 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 @@ -17,7 +17,7 @@ import java.sql.SQLException; */ public abstract class ScalarTypeBytesBase extends ScalarTypeBase { - protected ScalarTypeBytesBase(boolean jdbcNative, int jdbcType) { + ScalarTypeBytesBase(boolean jdbcNative, int jdbcType) { super(byte[].class, jdbcNative, jdbcType); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBinary.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBinary.java index 8567c808f..45e143aff 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBinary.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBinary.java @@ -8,9 +8,9 @@ import java.sql.Types; /** * ScalarType for Types.BINARY to byte[]. */ -public class ScalarTypeBytesBinary extends ScalarTypeBytesBase { +final class ScalarTypeBytesBinary extends ScalarTypeBytesBase { - public ScalarTypeBytesBinary() { + ScalarTypeBytesBinary() { super(true, Types.BINARY); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBlob.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBlob.java index 5ad02618f..88ba70876 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBlob.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesBlob.java @@ -8,9 +8,9 @@ import java.sql.Types; /** * ScalarType for BLOB. */ -public class ScalarTypeBytesBlob extends ScalarTypeBytesBase { +final class ScalarTypeBytesBlob extends ScalarTypeBytesBase { - public ScalarTypeBytesBlob() { + ScalarTypeBytesBlob() { super(true, Types.BLOB); } 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 9b81acfde..df8b32ba9 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 @@ -16,10 +16,9 @@ import java.sql.SQLException; /** * Encrypted ScalarType that wraps a byte[] types. */ -public class ScalarTypeBytesEncrypted implements ScalarType { +public final class ScalarTypeBytesEncrypted implements ScalarType { private final ScalarTypeBytesBase baseType; - private final DataEncryptSupport dataEncryptSupport; public ScalarTypeBytesEncrypted(ScalarTypeBytesBase baseType, DataEncryptSupport dataEncryptSupport) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesLongVarbinary.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesLongVarbinary.java index 8d1b87cf9..7b561a302 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesLongVarbinary.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesLongVarbinary.java @@ -8,9 +8,9 @@ import java.sql.Types; /** * ScalarType for Longvarbinary. */ -public class ScalarTypeBytesLongVarbinary extends ScalarTypeBytesBase { +final class ScalarTypeBytesLongVarbinary extends ScalarTypeBytesBase { - public ScalarTypeBytesLongVarbinary() { + ScalarTypeBytesLongVarbinary() { super(true, Types.LONGVARBINARY); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesVarbinary.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesVarbinary.java index 3e9b68790..dc61c87f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesVarbinary.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeBytesVarbinary.java @@ -8,9 +8,9 @@ import java.sql.Types; /** * ScalarType for Types.VARBINARY to byte[]. */ -public class ScalarTypeBytesVarbinary extends ScalarTypeBytesBase { +final class ScalarTypeBytesVarbinary extends ScalarTypeBytesBase { - public ScalarTypeBytesVarbinary() { + ScalarTypeBytesVarbinary() { super(true, Types.VARBINARY); } 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 c0c67e7f8..9028523b4 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 @@ -16,9 +16,9 @@ import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.formatIso; /** * ScalarType for java.util.Calendar. */ -public class ScalarTypeCalendar extends ScalarTypeBaseDateTime { +final class ScalarTypeCalendar extends ScalarTypeBaseDateTime { - public ScalarTypeCalendar(JsonConfig.DateTime mode, int jdbcType) { + ScalarTypeCalendar(JsonConfig.DateTime mode, int jdbcType) { super(mode, Calendar.class, false, jdbcType); } 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 509506298..6be7012b6 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 @@ -10,9 +10,9 @@ import java.sql.Types; /** * ScalarType for char. */ -public class ScalarTypeChar extends ScalarTypeBaseVarchar { +final class ScalarTypeChar extends ScalarTypeBaseVarchar { - public ScalarTypeChar() { + ScalarTypeChar() { super(char.class, false, Types.VARCHAR); } 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 dedb38838..869614f9d 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 @@ -13,9 +13,9 @@ import java.sql.Types; /** * ScalarType for char[]. */ -public class ScalarTypeCharArray extends ScalarTypeBaseVarchar { +final class ScalarTypeCharArray extends ScalarTypeBaseVarchar { - public ScalarTypeCharArray() { + ScalarTypeCharArray() { super(char[].class, false, Types.VARCHAR); } 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 1d303a157..6c9f18b82 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 @@ -10,7 +10,7 @@ import java.sql.Types; /** * ScalarType for Cidr to Varchar or Postgres CIDR. */ -public abstract class ScalarTypeCidr extends ScalarTypeBaseVarchar { +abstract class ScalarTypeCidr extends ScalarTypeBaseVarchar { ScalarTypeCidr() { super(Cidr.class, false, ExtraDbTypes.CIDR); @@ -42,7 +42,7 @@ public abstract class ScalarTypeCidr extends ScalarTypeBaseVarchar { /** * Cidr to Varchar. */ - public static class Varchar extends ScalarTypeCidr { + static final class Varchar extends ScalarTypeCidr { @Override public void bind(DataBinder binder, Cidr value) throws SQLException { @@ -57,7 +57,7 @@ public abstract class ScalarTypeCidr extends ScalarTypeBaseVarchar { /** * Cidr to Postgres CIDR. */ - public static class Postgres extends ScalarTypeCidr { + static final class Postgres extends ScalarTypeCidr { @Override public void bind(DataBinder binder, Cidr value) throws 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 112e08459..44fb1c475 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 @@ -4,12 +4,9 @@ import javax.persistence.PersistenceException; /** * ScalarType for Class that persists it to VARCHAR column. - * - * @author emcgreal - * @author rbygrave */ @SuppressWarnings({"rawtypes"}) -public class ScalarTypeClass extends ScalarTypeBaseVarchar { +final class ScalarTypeClass extends ScalarTypeBaseVarchar { public ScalarTypeClass() { super(Class.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java index f2df74f00..7903a76ea 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java @@ -8,13 +8,13 @@ import java.sql.Types; /** * ScalarType for String. */ -public class ScalarTypeClob extends ScalarTypeStringBase { +class ScalarTypeClob extends ScalarTypeStringBase { ScalarTypeClob(boolean jdbcNative, int jdbcType) { super(jdbcNative, jdbcType); } - public ScalarTypeClob() { + ScalarTypeClob() { super(true, Types.CLOB); } 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 6ed58b133..194e43c32 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 @@ -5,9 +5,9 @@ import java.util.Currency; /** * ScalarType for java.util.Currency which converts to and from a VARCHAR database column. */ -public class ScalarTypeCurrency extends ScalarTypeBaseVarchar { +final class ScalarTypeCurrency extends ScalarTypeBaseVarchar { - public ScalarTypeCurrency() { + ScalarTypeCurrency() { super(Currency.class); } 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 b9d49586f..84d7330da 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 @@ -12,9 +12,9 @@ import java.sql.Types; /** * ScalarType for java.sql.Date. */ -public class ScalarTypeDate extends ScalarTypeBaseDate { +final class ScalarTypeDate extends ScalarTypeBaseDate { - public ScalarTypeDate(JsonConfig.Date mode) { + ScalarTypeDate(JsonConfig.Date mode) { super(mode, Date.class, true, Types.DATE); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDayOfWeek.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDayOfWeek.java index 39c8ada61..b0c8b3e7f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDayOfWeek.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeDayOfWeek.java @@ -11,7 +11,7 @@ import java.time.DayOfWeek; /** * ScalarType mapping for Month enum. */ -public class ScalarTypeDayOfWeek extends ScalarTypeEnumWithMapping { +final class ScalarTypeDayOfWeek extends ScalarTypeEnumWithMapping { static final EnumToDbIntegerMap beanDbMap = new EnumToDbIntegerMap(); @@ -22,7 +22,7 @@ public class ScalarTypeDayOfWeek extends ScalarTypeEnumWithMapping { } } - public ScalarTypeDayOfWeek() { + ScalarTypeDayOfWeek() { super(beanDbMap, DayOfWeek.class, 1); } 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 14f825413..5877c5d4a 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 @@ -16,9 +16,9 @@ import java.sql.Types; /** * ScalarType for Double and double. */ -public class ScalarTypeDouble extends ScalarTypeBase { +final class ScalarTypeDouble extends ScalarTypeBase { - public ScalarTypeDouble() { + ScalarTypeDouble() { super(Double.class, true, Types.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 4632160d9..8e34afe27 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 @@ -19,21 +19,21 @@ import java.time.Duration; /** * ScalarType for java.time.Duration (with seconds precision). */ -public class ScalarTypeDuration extends ScalarTypeBase { +class ScalarTypeDuration extends ScalarTypeBase { - public ScalarTypeDuration() { + ScalarTypeDuration() { super(Duration.class, false, Types.BIGINT); } - protected ScalarTypeDuration(int jdbcType) { + ScalarTypeDuration(int jdbcType) { super(Duration.class, false, jdbcType); } - public BigDecimal convertToBigDecimal(Duration value) { + BigDecimal convertToBigDecimal(Duration value) { return (value == null) ? null : DecimalUtils.toDecimal(value); } - public Duration convertFromBigDecimal(BigDecimal value) { + Duration convertFromBigDecimal(BigDecimal value) { return (value == null) ? null : DecimalUtils.toDuration(value); } 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 faeca10a5..9ba27cc6c 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 @@ -15,9 +15,9 @@ import java.time.Duration; * Stored in the DB as DECIMAL value. *

*/ -public class ScalarTypeDurationWithNanos extends ScalarTypeDuration { +final class ScalarTypeDurationWithNanos extends ScalarTypeDuration { - public ScalarTypeDurationWithNanos() { + ScalarTypeDurationWithNanos() { super(Types.DECIMAL); } 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 ba9a44b20..1a552d11a 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 @@ -12,12 +12,10 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -public class ScalarTypeEncryptedWrapper implements ScalarType, LocalEncryptedType { +public final class ScalarTypeEncryptedWrapper implements ScalarType, LocalEncryptedType { private final ScalarType wrapped; - private final DataEncryptSupport dataEncryptSupport; - private final ScalarTypeBytesBase byteArrayType; public ScalarTypeEncryptedWrapper(ScalarType wrapped, ScalarTypeBytesBase byteArrayType, DataEncryptSupport dataEncryptSupport) { 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 4c8a5e645..8545bc9a7 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 @@ -28,17 +28,17 @@ import java.util.Set; * Ebean specific @EnumMapping. *

*/ -public class ScalarTypeEnumStandard { +final class ScalarTypeEnumStandard { @SuppressWarnings({"rawtypes", "unchecked"}) - public static class StringEnum extends EnumBase implements ScalarTypeEnum { + static final class StringEnum extends EnumBase implements ScalarTypeEnum { private final int length; /** * Create a ScalarTypeEnum. */ - public StringEnum(Class enumType) { + StringEnum(Class enumType) { super(enumType, false, Types.VARCHAR); this.length = maxValueLength(enumType); } @@ -63,15 +63,12 @@ public class ScalarTypeEnumStandard { } private int maxValueLength(Class enumType) { - int maxLen = 0; - Object[] ea = enumType.getEnumConstants(); for (Object anEa : ea) { Enum e = (Enum) anEa; maxLen = Math.max(maxLen, e.name().length()); } - return maxLen; } @@ -120,14 +117,14 @@ public class ScalarTypeEnumStandard { } @SuppressWarnings({"rawtypes", "unchecked"}) - public static class OrdinalEnum extends EnumBase implements ScalarTypeEnum { + static final class OrdinalEnum extends EnumBase implements ScalarTypeEnum { private final Object[] enumArray; /** * Create a ScalarTypeEnum. */ - public OrdinalEnum(Class enumType) { + OrdinalEnum(Class enumType) { super(enumType, false, Types.INTEGER); this.enumArray = EnumSet.allOf(enumType).toArray(); } @@ -203,11 +200,11 @@ public class ScalarTypeEnumStandard { } @SuppressWarnings({"rawtypes", "unchecked"}) - public abstract static class EnumBase extends ScalarTypeBase { + abstract static class EnumBase extends ScalarTypeBase { protected final Class enumType; - public EnumBase(Class type, boolean jdbcNative, int jdbcType) { + EnumBase(Class type, boolean jdbcNative, int jdbcType) { super(type, jdbcNative, jdbcType); this.enumType = type; } 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 598889f49..cafee64f7 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 @@ -14,25 +14,23 @@ import java.util.Set; * Additional control over mapping to DB values. */ @SuppressWarnings({"unchecked", "rawtypes"}) -public class ScalarTypeEnumWithMapping extends ScalarTypeEnumStandard.EnumBase implements ScalarType, ScalarTypeEnum { +class ScalarTypeEnumWithMapping extends ScalarTypeEnumStandard.EnumBase implements ScalarType, ScalarTypeEnum { private final EnumToDbValueMap beanDbMap; - private final int length; - private final boolean withConstraint; /** * Create with an explicit mapping of bean to database values. */ - public ScalarTypeEnumWithMapping(EnumToDbValueMap beanDbMap, Class enumType, int length, boolean withConstraint) { + ScalarTypeEnumWithMapping(EnumToDbValueMap beanDbMap, Class enumType, int length, boolean withConstraint) { super(enumType, false, beanDbMap.getDbType()); this.beanDbMap = beanDbMap; this.length = length; this.withConstraint = withConstraint; } - public ScalarTypeEnumWithMapping(EnumToDbValueMap beanDbMap, Class enumType, int length) { + ScalarTypeEnumWithMapping(EnumToDbValueMap beanDbMap, Class enumType, int length) { this(beanDbMap, enumType, length, true); } 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 4dfa68a24..2aa96dba5 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 @@ -25,29 +25,26 @@ import java.sql.Types; /** * ScalarType for streaming between a File and the database. */ -public class ScalarTypeFile extends ScalarTypeBase { +final class ScalarTypeFile extends ScalarTypeBase { private static final Logger logger = LoggerFactory.getLogger(ScalarTypeFile.class); private final String prefix; - private final String suffix; - private final File directory; - private final int bufferSize; /** * Construct with reasonable defaults of Blob and 8096 buffer size. */ - public ScalarTypeFile() { + ScalarTypeFile() { this(Types.LONGVARBINARY, "db-", null, null, 8096); } /** * Create the ScalarTypeFile. */ - public ScalarTypeFile(int jdbcType, String prefix, String suffix, File directory, int bufferSize) { + ScalarTypeFile(int jdbcType, String prefix, String suffix, File directory, int bufferSize) { super(File.class, false, jdbcType); this.prefix = prefix; this.suffix = suffix; @@ -76,15 +73,12 @@ public class ScalarTypeFile extends ScalarTypeBase { if (is == null) { return null; } - try { // stream from db into our temp file File tempFile = File.createTempFile(prefix, suffix, directory); OutputStream os = getOutputStream(tempFile); pump(is, os); - return tempFile; - } catch (IOException e) { throw new SQLException("Error reading db file 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 e9f8e1306..fd13f2082 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 @@ -16,9 +16,9 @@ import java.sql.Types; /** * ScalarType for Float and float. */ -public class ScalarTypeFloat extends ScalarTypeBase { +final class ScalarTypeFloat extends ScalarTypeBase { - public ScalarTypeFloat() { + ScalarTypeFloat() { super(Float.class, true, Types.REAL); } 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 9252afe6e..122fdcc5a 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 @@ -10,7 +10,7 @@ import java.sql.Types; /** * ScalarType for Inet to Varchar or Postgres INET. */ -public abstract class ScalarTypeInet extends ScalarTypeBaseVarchar { +abstract class ScalarTypeInet extends ScalarTypeBaseVarchar { ScalarTypeInet(int jdbcType) { super(Inet.class, false, jdbcType); @@ -42,7 +42,7 @@ public abstract class ScalarTypeInet extends ScalarTypeBaseVarchar { /** * Inet to Varchar. */ - public static class Varchar extends ScalarTypeInet { + public static final class Varchar extends ScalarTypeInet { Varchar() { super(Types.VARCHAR); @@ -61,7 +61,7 @@ public abstract class ScalarTypeInet extends ScalarTypeBaseVarchar { /** * Inet to Postgres INET. */ - public static class Postgres extends ScalarTypeInet { + public static final class Postgres extends ScalarTypeInet { Postgres() { super(ExtraDbTypes.INET); 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 1de5e1db7..166a81280 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 @@ -7,9 +7,9 @@ import java.net.InetAddress; /** * ScalarType for java.net.URI which converts to and from a VARCHAR database column. */ -public class ScalarTypeInetAddress extends ScalarTypeBaseVarchar { +final class ScalarTypeInetAddress extends ScalarTypeBaseVarchar { - public ScalarTypeInetAddress() { + ScalarTypeInetAddress() { super(InetAddress.class); } 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 086f4fd45..a4ff9074d 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 @@ -11,9 +11,9 @@ import java.sql.Types; /** * ScalarType for InetAddress to Postgres INET. */ -public class ScalarTypeInetAddressPostgres extends ScalarTypeBaseVarchar { +final class ScalarTypeInetAddressPostgres extends ScalarTypeBaseVarchar { - public ScalarTypeInetAddressPostgres() { + ScalarTypeInetAddressPostgres() { super(InetAddress.class, false, ExtraDbTypes.INET); } 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 dd78f4a65..d3fbee011 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 @@ -9,9 +9,9 @@ import java.time.Instant; /** * ScalarType for java.sql.Timestamp. */ -public class ScalarTypeInstant extends ScalarTypeBaseDateTime { +final class ScalarTypeInstant extends ScalarTypeBaseDateTime { - public ScalarTypeInstant(JsonConfig.DateTime mode) { + ScalarTypeInstant(JsonConfig.DateTime mode) { super(mode, Instant.class, false, Types.TIMESTAMP); } 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 0d343d05b..172522224 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 @@ -17,11 +17,9 @@ import java.sql.Types; /** * ScalarType for Integer and int. */ -public class ScalarTypeInteger extends ScalarTypeBase { +final class ScalarTypeInteger extends ScalarTypeBase { - public static ScalarTypeInteger INSTANCE = new ScalarTypeInteger(); - - private ScalarTypeInteger() { + ScalarTypeInteger() { super(Integer.class, true, Types.INTEGER); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java index bebd64de7..9a7990a6d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java @@ -11,12 +11,12 @@ import java.sql.Types; * ScalarType for Joda DateMidnight. This maps to a JDBC Date. */ @SuppressWarnings("deprecation") -public class ScalarTypeJodaDateMidnight extends ScalarTypeBaseDate { +final class ScalarTypeJodaDateMidnight extends ScalarTypeBaseDate { /** * Instantiates a new scalar type joda date midnight. */ - public ScalarTypeJodaDateMidnight(JsonConfig.Date mode) { + ScalarTypeJodaDateMidnight(JsonConfig.Date mode) { super(mode, org.joda.time.DateMidnight.class, false, Types.DATE); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java index f8d9816ae..0291f31dd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaDateTime.java @@ -11,9 +11,9 @@ import java.time.Instant; /** * ScalarType for Joda DateTime. This maps to a JDBC Timestamp. */ -public class ScalarTypeJodaDateTime extends ScalarTypeBaseDateTime { +final class ScalarTypeJodaDateTime extends ScalarTypeBaseDateTime { - public ScalarTypeJodaDateTime(JsonConfig.DateTime mode) { + ScalarTypeJodaDateTime(JsonConfig.DateTime mode) { super(mode, DateTime.class, false, Types.TIMESTAMP); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java index 4727f1d58..a7f385442 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java @@ -11,9 +11,9 @@ import java.sql.Types; /** * ScalarType for Joda LocalDate. This maps to a JDBC Date. */ -public class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { +final class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { - public ScalarTypeJodaLocalDate(JsonConfig.Date mode) { + ScalarTypeJodaLocalDate(JsonConfig.Date mode) { super(mode, LocalDate.class, false, Types.DATE); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java index bb5db7e37..913d290be 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java @@ -11,9 +11,9 @@ import java.time.Instant; /** * ScalarType for Joda LocalDateTime. This maps to a JDBC Timestamp. */ -public class ScalarTypeJodaLocalDateTime extends ScalarTypeBaseDateTime { +final class ScalarTypeJodaLocalDateTime extends ScalarTypeBaseDateTime { - public ScalarTypeJodaLocalDateTime(JsonConfig.DateTime mode) { + ScalarTypeJodaLocalDateTime(JsonConfig.DateTime mode) { super(mode, LocalDateTime.class, false, Types.TIMESTAMP); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java index bb8f5070b..785069345 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java @@ -20,9 +20,9 @@ import java.sql.Types; /** * ScalarType for Joda LocalTime. This maps to a JDBC Time. */ -public class ScalarTypeJodaLocalTime extends ScalarTypeBase { +class ScalarTypeJodaLocalTime extends ScalarTypeBase { - public ScalarTypeJodaLocalTime() { + ScalarTypeJodaLocalTime() { super(LocalTime.class, false, Types.TIME); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java index 1cf2656a0..e19af274e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalTimeUTC.java @@ -13,9 +13,9 @@ import java.sql.Types; /** * ScalarType for Joda LocalTime. This maps to a JDBC Time. */ -public class ScalarTypeJodaLocalTimeUTC extends ScalarTypeJodaLocalTime { +final class ScalarTypeJodaLocalTimeUTC extends ScalarTypeJodaLocalTime { - public ScalarTypeJodaLocalTimeUTC() { + ScalarTypeJodaLocalTimeUTC() { super(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java index 5d3e3ee4e..5c319c6ef 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaPeriod.java @@ -5,9 +5,9 @@ import org.joda.time.Period; /** * ScalarType for Joda Period stored as DB VARCHAR */ -public class ScalarTypeJodaPeriod extends ScalarTypeBaseVarchar { +final class ScalarTypeJodaPeriod extends ScalarTypeBaseVarchar { - public ScalarTypeJodaPeriod() { + ScalarTypeJodaPeriod() { super(Period.class); } 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 a196085a6..71179dba7 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 @@ -19,47 +19,47 @@ import java.util.List; /** * Types for mapping List in JSON format to DB types VARCHAR, JSON and JSONB. */ -public class ScalarTypeJsonList { +final class ScalarTypeJsonList { /** * Return the appropriate ScalarType based requested dbType and if Postgres. */ - public static ScalarType typeFor(boolean postgres, int dbType, DocPropertyType docType, boolean nullable) { + static ScalarType typeFor(boolean postgres, int dbType, DocPropertyType docType, boolean nullable, boolean keepSource) { if (postgres) { switch (dbType) { case DbPlatformType.JSONB: - return new ScalarTypeJsonList.JsonB(docType, nullable); + return new ScalarTypeJsonList.JsonB(docType, nullable, keepSource); case DbPlatformType.JSON: - return new ScalarTypeJsonList.Json(docType, nullable); + return new ScalarTypeJsonList.Json(docType, nullable, keepSource); } } - return new ScalarTypeJsonList.Varchar(docType, nullable); + return new ScalarTypeJsonList.Varchar(docType, nullable, keepSource); } /** * List mapped to DB VARCHAR. */ - public static class Varchar extends ScalarTypeJsonList.Base { - public Varchar(DocPropertyType docType, boolean nullable) { - super(Types.VARCHAR, docType, nullable); + static final class Varchar extends ScalarTypeJsonList.Base { + Varchar(DocPropertyType docType, boolean nullable, boolean keepSource) { + super(Types.VARCHAR, docType, nullable, keepSource); } } /** * List mapped to Postgres JSON. */ - private static class Json extends ScalarTypeJsonList.PgBase { - public Json(DocPropertyType docType, boolean nullable) { - super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE, docType, nullable); + private final static class Json extends ScalarTypeJsonList.PgBase { + Json(DocPropertyType docType, boolean nullable, boolean keepSource) { + super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE, docType, nullable, keepSource); } } /** * List mapped to Postgres JSONB. */ - private static class JsonB extends ScalarTypeJsonList.PgBase { - public JsonB(DocPropertyType docType, boolean nullable) { - super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE, docType, nullable); + private static final class JsonB extends ScalarTypeJsonList.PgBase { + JsonB(DocPropertyType docType, boolean nullable, boolean keepSource) { + super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE, docType, nullable, keepSource); } } @@ -68,14 +68,24 @@ public class ScalarTypeJsonList { */ @SuppressWarnings("rawtypes") private abstract static class Base extends ScalarTypeJsonCollection { + final boolean keepSource; - public Base(int dbType, DocPropertyType docType, boolean nullable) { + private Base(int dbType, DocPropertyType docType, boolean nullable, boolean keepSource) { super(List.class, dbType, docType, nullable); + this.keepSource = keepSource; } @Override - public List read(DataReader reader) throws SQLException { + public final boolean isJsonMapper() { + return keepSource; + } + + @Override + public final List read(DataReader reader) throws SQLException { String json = reader.getString(); + if (keepSource) { + reader.pushJson(json); + } try { // parse JSON into modifyAware list return EJson.parseList(json, true); @@ -85,17 +95,15 @@ public class ScalarTypeJsonList { } @Override - public void bind(DataBinder binder, List value) throws SQLException { + public final void bind(DataBinder binder, List value) throws SQLException { + String rawJson = keepSource ? binder.popJson() : null; + if (rawJson == null && value != null) { + rawJson = formatValue(value); + } if (value == null) { bindNull(binder); - } else if (value.isEmpty()) { - binder.setString("[]"); } else { - try { - binder.setString(EJson.write(value)); - } catch (IOException e) { - throw new SQLException("Failed to format List into JSON content", e); - } + bindRawJson(binder, rawJson); } } @@ -108,8 +116,12 @@ public class ScalarTypeJsonList { } } + protected void bindRawJson(DataBinder binder, String rawJson) throws SQLException { + binder.setString(rawJson); + } + @Override - public String formatValue(List value) { + public final String formatValue(List value) { try { return EJson.write(value); } catch (IOException e) { @@ -118,7 +130,7 @@ public class ScalarTypeJsonList { } @Override - public List parse(String value) { + public final List parse(String value) { try { return EJson.parseList(value, false); } catch (IOException e) { @@ -127,12 +139,12 @@ public class ScalarTypeJsonList { } @Override - public List jsonRead(JsonParser parser) throws IOException { + public final List jsonRead(JsonParser parser) throws IOException { return EJson.parseList(parser, parser.getCurrentToken()); } @Override - public void jsonWrite(JsonGenerator writer, List value) throws IOException { + public final void jsonWrite(JsonGenerator writer, List value) throws IOException { EJson.write(value, writer); } } @@ -144,23 +156,18 @@ public class ScalarTypeJsonList { final String pgType; - PgBase(int jdbcType, String pgType, DocPropertyType docType, boolean nullable) { - super(jdbcType, docType, nullable); + PgBase(int jdbcType, String pgType, DocPropertyType docType, boolean nullable, boolean keepSource) { + super(jdbcType, docType, nullable, keepSource); this.pgType = pgType; } - @SuppressWarnings("rawtypes") @Override - public void bind(DataBinder binder, List value) throws SQLException { - if (value == null) { - bindNull(binder); - } else { - binder.setObject(PostgresHelper.asObject(pgType, formatValue(value))); - } + protected final void bindRawJson(DataBinder binder, String rawJson) throws SQLException { + binder.setObject(PostgresHelper.asObject(pgType, rawJson)); } @Override - protected void bindNull(DataBinder binder) throws SQLException { + protected final void bindNull(DataBinder binder) throws SQLException { binder.setObject(PostgresHelper.asObject(pgType, nullable ? null : "[]")); } } 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 6dd4f900b..93ecdab79 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 @@ -9,12 +9,7 @@ import io.ebean.core.type.DocPropertyType; import io.ebean.text.TextException; import io.ebean.text.json.EJson; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; +import java.io.*; import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.sql.Types; @@ -24,97 +19,110 @@ import java.util.Map; * Type which maps Map to various DB types (Clob, Varchar, Blob) in JSON format. */ @SuppressWarnings("rawtypes") -public abstract class ScalarTypeJsonMap extends ScalarTypeBase { - - private static final ScalarTypeJsonMap CLOB = new ScalarTypeJsonMap.Clob(); - private static final ScalarTypeJsonMap BLOB = new ScalarTypeJsonMap.Blob(); - private static final ScalarTypeJsonMap VARCHAR = new ScalarTypeJsonMap.Varchar(); - private static final ScalarTypeJsonMap JSON = new ScalarTypeJsonMapPostgres.JSON(); - private static final ScalarTypeJsonMap JSONB = new ScalarTypeJsonMapPostgres.JSONB(); +abstract class ScalarTypeJsonMap extends ScalarTypeBase { /** * Return the ScalarType for the requested dbType and postgres. */ - public static ScalarTypeJsonMap typeFor(boolean postgres, int dbType) { + static ScalarTypeJsonMap typeFor(boolean postgres, int dbType, boolean keepSource) { switch (dbType) { case Types.VARCHAR: - return VARCHAR; + return new ScalarTypeJsonMap.Varchar(keepSource); case Types.BLOB: - return BLOB; + return new ScalarTypeJsonMap.Blob(keepSource); case Types.CLOB: - return CLOB; + return new ScalarTypeJsonMap.Clob(keepSource); case DbPlatformType.JSONB: - return postgres ? JSONB : CLOB; + return postgres ? new ScalarTypeJsonMapPostgres.JSONB(keepSource) : new ScalarTypeJsonMap.Clob(keepSource); case DbPlatformType.JSON: - return postgres ? JSON : CLOB; + return postgres ? new ScalarTypeJsonMapPostgres.JSON(keepSource) : new ScalarTypeJsonMap.Clob(keepSource); default: throw new IllegalStateException("Unknown dbType " + dbType); } } - public static class Clob extends ScalarTypeJsonMap { - - public Clob() { - super(Types.CLOB); + private static final class Clob extends ScalarTypeJsonMap { + Clob(boolean keepSource) { + super(Types.CLOB, keepSource); } @Override - public Map read(DataReader reader) throws SQLException { - String content = reader.getStringFromStream(); - if (content == null) { - return null; - } - return parse(content); + protected String readJson(DataReader reader) throws SQLException { + return reader.getStringFromStream(); } } - public static class Varchar extends ScalarTypeJsonMap { - - public Varchar() { - super(Types.VARCHAR); + private static final class Varchar extends ScalarTypeJsonMap { + Varchar(boolean keepSource) { + super(Types.VARCHAR, keepSource); } } - public static class Blob extends ScalarTypeJsonMap { - public Blob() { - super(Types.BLOB); + private static final class Blob extends ScalarTypeJsonMap { + Blob(boolean keepSource) { + super(Types.BLOB, keepSource); } @Override public Map read(DataReader reader) throws SQLException { InputStream is = reader.getBinaryStream(); if (is == null) { + if (keepSource) { + reader.pushJson(null); + } return null; } try { - try (InputStreamReader inputStreamReader = new InputStreamReader(is)) { - return parse(inputStreamReader); + if (keepSource) { + StringWriter jsonBuffer = new StringWriter(); + try (InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8)) { + transferTo(streamReader, jsonBuffer); + } + String rawJson = jsonBuffer.toString(); + reader.pushJson(rawJson); + return parse(rawJson); + } else { + try (InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8)) { + return parse(streamReader); + } } } catch (IOException e) { throw new SQLException("Error reading Blob stream from DB", e); } } - @Override - public void bind(DataBinder binder, Map value) throws SQLException { - if (value == null) { - binder.setNull(Types.BLOB); - } else { - String rawJson = formatValue(value); - binder.setBytes(rawJson.getBytes(StandardCharsets.UTF_8)); + private static void transferTo(Reader reader, Writer out) throws IOException { + char[] buffer = new char[2048]; + int nRead; + while ((nRead = reader.read(buffer, 0, 2048)) >= 0) { + out.write(buffer, 0, nRead); } } + + @Override + protected void bindNull(DataBinder binder) throws SQLException { + binder.setNull(Types.BLOB); + } + + @Override + protected void bindJson(DataBinder binder, String rawJson) throws SQLException { + binder.setBytes(rawJson.getBytes(StandardCharsets.UTF_8)); + } + } - public ScalarTypeJsonMap(int jdbcType) { + final boolean keepSource; + + ScalarTypeJsonMap(int jdbcType, boolean keepSource) { super(Map.class, false, jdbcType); + this.keepSource = keepSource; } /** * Map is a mutable type. Use the isDirty() method to check for dirty state. */ @Override - public boolean isMutable() { + public final boolean isMutable() { return true; } @@ -126,37 +134,60 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { return TypeJsonManager.checkIsDirty(value); } + @Override + public final boolean isJsonMapper() { + return keepSource; + } + @Override public Map read(DataReader reader) throws SQLException { - String rawJson = reader.getString(); + String rawJson = readJson(reader); + if (keepSource) { + reader.pushJson(rawJson); + } if (rawJson == null) { return null; } return parse(rawJson); } - @Override - public void bind(DataBinder binder, Map value) throws SQLException { - if (value == null) { - binder.setNull(Types.VARCHAR); - } else { - String rawJson = formatValue(value); - binder.setString(rawJson); - } + protected String readJson(DataReader reader) throws SQLException { + return reader.getString(); } @Override - public Object toJdbcType(Object value) { + public final void bind(DataBinder binder, Map value) throws SQLException { + String rawJson = keepSource ? binder.popJson() : null; + if (rawJson == null && value != null) { + rawJson = formatValue(value); + } + if (value == null) { + bindNull(binder); + } else { + bindJson(binder, rawJson); + } + } + + protected void bindNull(DataBinder binder) throws SQLException { + binder.setNull(Types.VARCHAR); + } + + protected void bindJson(DataBinder binder, String rawJson) throws SQLException { + binder.setString(rawJson); + } + + @Override + public final Object toJdbcType(Object value) { return value; } @Override - public Map toBeanType(Object value) { + public final Map toBeanType(Object value) { return (Map) value; } @Override - public String formatValue(Map v) { + public final String formatValue(Map v) { try { return EJson.write(v); } catch (IOException e) { @@ -165,7 +196,7 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public Map parse(String value) { + public final Map parse(String value) { try { // return a modify aware map return EJson.parseObject(value, true); @@ -174,7 +205,7 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { } } - public Map parse(Reader reader) { + public final Map parse(Reader reader) { try { // return a modify aware map return EJson.parseObject(reader, true); @@ -184,17 +215,17 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public Map convertFromMillis(long dateTime) { + public final Map convertFromMillis(long dateTime) { throw new RuntimeException("Should never be called"); } @Override - public boolean isDateTimeCapable() { + public final boolean isDateTimeCapable() { return false; } @Override - public Map readData(DataInput dataInput) throws IOException { + public final Map readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; } else { @@ -203,7 +234,7 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public void writeData(DataOutput dataOutput, Map map) throws IOException { + public final void writeData(DataOutput dataOutput, Map map) throws IOException { if (map == null) { dataOutput.writeBoolean(false); } else { @@ -212,17 +243,17 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { } @Override - public void jsonWrite(JsonGenerator writer, Map value) throws IOException { + public final void jsonWrite(JsonGenerator writer, Map value) throws IOException { EJson.write(value, writer); } @Override - public Map jsonRead(JsonParser parser) throws IOException { + public final Map jsonRead(JsonParser parser) throws IOException { return EJson.parseObject(parser, parser.getCurrentToken()); } @Override - public DocPropertyType getDocType() { + public final DocPropertyType getDocType() { 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 87eecc5f9..ae33fa0e4 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 @@ -4,44 +4,46 @@ import io.ebean.config.dbplatform.DbPlatformType; import io.ebean.core.type.DataBinder; import java.sql.SQLException; -import java.util.Map; /** * Support for the Postgres DB types JSON and JSONB. */ -public abstract class ScalarTypeJsonMapPostgres extends ScalarTypeJsonMap { +abstract class ScalarTypeJsonMapPostgres extends ScalarTypeJsonMap { - final String postgresType; + private final String postgresType; - ScalarTypeJsonMapPostgres(int jdbcType, String postgresType) { - super(jdbcType); + ScalarTypeJsonMapPostgres(int jdbcType, String postgresType, boolean keepSource) { + super(jdbcType, keepSource); this.postgresType = postgresType; } - @SuppressWarnings("rawtypes") @Override - public void bind(DataBinder binder, Map value) throws SQLException { - String rawJson = (value == null) ? null : formatValue(value); + protected final void bindNull(DataBinder binder) throws SQLException { + binder.setObject(PostgresHelper.asObject(postgresType, null)); + } + + @Override + protected final void bindJson(DataBinder binder, String rawJson) throws SQLException { binder.setObject(PostgresHelper.asObject(postgresType, rawJson)); } /** * ScalarType mapping java Map type to Postgres JSON database type. */ - public static class JSON extends ScalarTypeJsonMapPostgres { + static final class JSON extends ScalarTypeJsonMapPostgres { - public JSON() { - super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE); + JSON(boolean keepSource) { + super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE, keepSource); } } /** * ScalarType mapping java Map type to Postgres JSONB database type. */ - public static class JSONB extends ScalarTypeJsonMapPostgres { + static final class JSONB extends ScalarTypeJsonMapPostgres { - public JSONB() { - super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE); + JSONB(boolean keepSource) { + super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE, keepSource); } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java index 5ff3ef99a..675328de5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNode.java @@ -22,14 +22,14 @@ import java.sql.Types; /** * Type which maps Jackson's JsonNode to various DB types (Clob, Varchar, Blob) in JSON format. */ -public abstract class ScalarTypeJsonNode extends ScalarTypeBase { +abstract class ScalarTypeJsonNode extends ScalarTypeBase { /** * Clob storage based implementation. */ - public static class Clob extends ScalarTypeJsonNode { + static final class Clob extends ScalarTypeJsonNode { - public Clob(ObjectMapper objectMapper) { + Clob(ObjectMapper objectMapper) { super(objectMapper, Types.CLOB); } @@ -46,7 +46,7 @@ public abstract class ScalarTypeJsonNode extends ScalarTypeBase { /** * Varchar storage based implementation. */ - public static class Varchar extends ScalarTypeJsonNode { + static final class Varchar extends ScalarTypeJsonNode { public Varchar(ObjectMapper objectMapper) { super(objectMapper, Types.VARCHAR); @@ -56,9 +56,9 @@ public abstract class ScalarTypeJsonNode extends ScalarTypeBase { /** * Blob storage based implementation. */ - public static class Blob extends ScalarTypeJsonNode { + static class Blob extends ScalarTypeJsonNode { - public Blob(ObjectMapper objectMapper) { + Blob(ObjectMapper objectMapper) { super(objectMapper, Types.BLOB); } @@ -91,7 +91,7 @@ public abstract class ScalarTypeJsonNode extends ScalarTypeBase { */ final ObjectMapper objectMapper; - public ScalarTypeJsonNode(ObjectMapper objectMapper, int jdbcType) { + ScalarTypeJsonNode(ObjectMapper objectMapper, int jdbcType) { super(JsonNode.class, false, jdbcType); this.objectMapper = objectMapper; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java index f24178aab..b23252367 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonNodePostgres.java @@ -10,10 +10,9 @@ import java.sql.SQLException; /** * Support for mapping JsonNode to Postgres DB types JSON and JSONB. */ -public abstract class ScalarTypeJsonNodePostgres extends ScalarTypeJsonNode { +abstract class ScalarTypeJsonNodePostgres extends ScalarTypeJsonNode { final ObjectMapper objectMapper; - final String postgresType; ScalarTypeJsonNodePostgres(ObjectMapper objectMapper, int jdbcType, String postgresType) { @@ -31,7 +30,7 @@ public abstract class ScalarTypeJsonNodePostgres extends ScalarTypeJsonNode { /** * ScalarType mapping JsonNode to Postgres JSON database type. */ - public static class JSON extends ScalarTypeJsonNodePostgres { + static final class JSON extends ScalarTypeJsonNodePostgres { public JSON(ObjectMapper objectMapper) { super(objectMapper, DbPlatformType.JSON, PostgresHelper.JSON_TYPE); @@ -41,7 +40,7 @@ public abstract class ScalarTypeJsonNodePostgres extends ScalarTypeJsonNode { /** * ScalarType mapping JsonNode to Postgres JSONB database type. */ - public static class JSONB extends ScalarTypeJsonNodePostgres { + static final class JSONB extends ScalarTypeJsonNodePostgres { public JSONB(ObjectMapper objectMapper) { super(objectMapper, DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java index 5e24412b5..5cda3f921 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java @@ -7,14 +7,13 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.introspect.AnnotatedField; +import io.ebean.annotation.MutationDetection; 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.text.TextException; -import io.ebeaninternal.json.ModifyAwareList; -import io.ebeaninternal.json.ModifyAwareMap; -import io.ebeaninternal.json.ModifyAwareSet; +import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; import javax.persistence.PersistenceException; import java.io.DataInput; @@ -22,93 +21,94 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import java.util.List; -import java.util.Map; -import java.util.Set; /** * Supports @DbJson properties using Jackson ObjectMapper. */ -class ScalarTypeJsonObjectMapper { +final class ScalarTypeJsonObjectMapper { /** * Create and return the appropriate ScalarType. */ - static ScalarType createTypeFor(TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { - Class type = field.getRawType(); - if (Set.class.equals(type)) { - return new OmSet(jsonManager, field, dbType, docType); + static ScalarType createTypeFor(TypeJsonManager jsonManager, DeployBeanProperty prop, int dbType, DocPropertyType docType) { + AnnotatedField field = (AnnotatedField) prop.getJacksonField(); + MutationDetection mode = prop.getMutationDetection(); + if (mode == MutationDetection.NONE) { + return new NoMutationDetection(jsonManager, field, dbType, docType); + } else if (mode != MutationDetection.DEFAULT) { + return new GenericObject(jsonManager, field, dbType, docType); } - if (List.class.equals(type)) { - return new OmList(jsonManager, field, dbType, docType); - } - if (Map.class.equals(type)) { - return new OmMap(jsonManager, field, dbType); - } - return new GenericObject(jsonManager, field, dbType, type); + // using the global default MutationDetection mode (defaults to HASH) + prop.setMutationDetection(jsonManager.mutationDetection()); + return new GenericObject(jsonManager, field, dbType, docType); } /** - * Maps any type (Object) using Jackson ObjectMapper. + * No mutation detection on this json property. */ - private static class GenericObject extends Base { + private static final class NoMutationDetection extends Base { - GenericObject(TypeJsonManager jsonManager, AnnotatedField field, int dbType, Class rawType) { - super(Object.class, jsonManager, field, dbType, DocPropertyType.OBJECT, rawType); - } - } - - /** - * Type for Sets wrapping the ObjectMapper Set as a ModifyAwareSet. - */ - @SuppressWarnings("rawtypes") - private static class OmSet extends Base { - - OmSet(TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { - super(Set.class, jsonManager, field, dbType, docType); + NoMutationDetection(TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { + super(Object.class, jsonManager, field, dbType, docType); } @Override - @SuppressWarnings("unchecked") - public Set read(DataReader reader) throws SQLException { - Set value = super.read(reader); - return value == null ? null : new ModifyAwareSet(value); + public boolean isMutable() { + return false; + } + + @Override + public boolean isDirty(Object value) { + return false; } } /** - * Type for Lists wrapping the ObjectMapper List as a ModifyAwareList. + * Supports HASH and SOURCE dirty detection modes. */ - @SuppressWarnings("rawtypes") - private static class OmList extends Base { + private static final class GenericObject extends Base { - OmList(TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { - super(List.class, jsonManager, field, dbType, docType); + GenericObject(TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { + super(Object.class, jsonManager, field, dbType, docType); } @Override - @SuppressWarnings("unchecked") - public List read(DataReader reader) throws SQLException { - List value = super.read(reader); - return value == null ? null : new ModifyAwareList(value); - } - } - - /** - * Type for Map wrapping the ObjectMapper Map as a ModifyAwareMap. - */ - @SuppressWarnings("rawtypes") - private static class OmMap extends Base { - - OmMap(TypeJsonManager jsonManager, AnnotatedField field, int dbType) { - super(Map.class, jsonManager, field, dbType, DocPropertyType.OBJECT); + public boolean isJsonMapper() { + return true; } @Override - @SuppressWarnings("unchecked") - public Map read(DataReader reader) throws SQLException { - Map value = super.read(reader); - return value == null ? null : new ModifyAwareMap(value); + public Object read(DataReader reader) throws SQLException { + String json = reader.getString(); + // pushJson such that we MD5 and store on EntityBeanIntercept later + reader.pushJson(json); + if (json == null || json.isEmpty()) { + return null; + } + try { + return objectReader.readValue(json, deserType); + } catch (IOException e) { + throw new TextException("Failed to parse JSON [{}] as " + deserType, json, e); + } + } + + @Override + public void bind(DataBinder binder, Object value) throws SQLException { + // popJson as dirty detection already converted to json string + String rawJson = binder.popJson(); + if (rawJson == null && value != null) { + rawJson = formatValue(value); // not expected, need to check? + } + if (pgType != null) { + binder.setObject(PostgresHelper.asObject(pgType, rawJson)); + } else { + if (value == null) { + // use varchar, otherwise SqlServer/db2 will fail with 'Invalid JDBC data type 5.001.' + binder.setNull(Types.VARCHAR); + } else { + binder.setString(rawJson); + } + } } } @@ -118,44 +118,27 @@ class ScalarTypeJsonObjectMapper { */ private static abstract class Base extends ScalarTypeBase { - private final ObjectWriter objectWriter; - private final ObjectMapper objectReader; - private final JavaType deserType; - private final String pgType; + protected final ObjectWriter objectWriter; + protected final ObjectMapper objectReader; + protected final JavaType deserType; + protected final String pgType; private final DocPropertyType docType; - private final TypeJsonManager.DirtyHandler dirtyHandler; Base(Class cls, TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType) { - this(cls, jsonManager, field, dbType, docType, cls); - } - - Base(Class cls, TypeJsonManager jsonManager, AnnotatedField field, int dbType, DocPropertyType docType, Class rawType) { super(cls, false, dbType); this.objectReader = jsonManager.objectMapper(); this.pgType = jsonManager.postgresType(dbType); this.docType = docType; - this.dirtyHandler = jsonManager.dirtyHandler(cls, rawType); final JacksonTypeHelper helper = new JacksonTypeHelper(field, objectReader); this.deserType = helper.type(); this.objectWriter = helper.objectWriter(); } - /** - * Consider as a mutable type. Use the isDirty() method to check for dirty state. - */ @Override public boolean isMutable() { return true; } - /** - * Return true if the value should be considered dirty (and included in an update). - */ - @Override - public boolean isDirty(Object value) { - return dirtyHandler.isDirty(value); - } - @Override public T read(DataReader reader) throws SQLException { String json = reader.getString(); @@ -184,20 +167,20 @@ class ScalarTypeJsonObjectMapper { } @Override - public Object toJdbcType(Object value) { + public final Object toJdbcType(Object value) { // no type conversion supported return value; } @Override @SuppressWarnings("unchecked") - public T toBeanType(Object value) { + public final T toBeanType(Object value) { // no type conversion supported return (T) value; } @Override - public String formatValue(T value) { + public final String formatValue(T value) { try { return objectWriter.writeValueAsString(value); } catch (JsonProcessingException e) { @@ -206,7 +189,7 @@ class ScalarTypeJsonObjectMapper { } @Override - public T parse(String value) { + public final T parse(String value) { try { return objectReader.readValue(value, deserType); } catch (IOException e) { @@ -215,32 +198,32 @@ class ScalarTypeJsonObjectMapper { } @Override - public DocPropertyType getDocType() { + public final DocPropertyType getDocType() { return docType; } @Override - public boolean isDateTimeCapable() { + public final boolean isDateTimeCapable() { return false; } @Override - public T convertFromMillis(long dateTime) { + public final T convertFromMillis(long dateTime) { throw new IllegalStateException("Not supported"); } @Override - public T jsonRead(JsonParser parser) throws IOException { + public final T jsonRead(JsonParser parser) throws IOException { return objectReader.readValue(parser, deserType); } @Override - public void jsonWrite(JsonGenerator writer, T value) throws IOException { + public final void jsonWrite(JsonGenerator writer, T value) throws IOException { objectWriter.writeValue(writer, value); } @Override - public T readData(DataInput dataInput) throws IOException { + public final T readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; } else { @@ -249,7 +232,7 @@ class ScalarTypeJsonObjectMapper { } @Override - public void writeData(DataOutput dataOutput, T value) throws IOException { + public final void writeData(DataOutput dataOutput, T value) throws IOException { if (value == null) { dataOutput.writeBoolean(false); } else { 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 d95adb572..50cc7f0b3 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 @@ -21,63 +21,71 @@ import java.util.Set; /** * Types for mapping List in JSON format to DB types VARCHAR, JSON and JSONB. */ -public class ScalarTypeJsonSet { +final class ScalarTypeJsonSet { /** * Return the appropriate ScalarType for the requested dbType and Postgres. */ - public static ScalarType typeFor(boolean postgres, int dbType, DocPropertyType docPropertyType, boolean nullable) { + static ScalarType typeFor(boolean postgres, int dbType, DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { if (postgres) { switch (dbType) { case DbPlatformType.JSONB: - return new ScalarTypeJsonSet.JsonB(docPropertyType, nullable); + return new ScalarTypeJsonSet.JsonB(docPropertyType, nullable, keepSource); case DbPlatformType.JSON: - return new ScalarTypeJsonSet.Json(docPropertyType, nullable); + return new ScalarTypeJsonSet.Json(docPropertyType, nullable, keepSource); } } - return new ScalarTypeJsonSet.Varchar(docPropertyType, nullable); + return new ScalarTypeJsonSet.Varchar(docPropertyType, nullable, keepSource); } /** * List mapped to DB VARCHAR. */ - public static class Varchar extends ScalarTypeJsonSet.Base { - public Varchar(DocPropertyType docPropertyType, boolean nullable) { - super(Types.VARCHAR, docPropertyType, nullable); + static final class Varchar extends ScalarTypeJsonSet.Base { + public Varchar(DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { + super(Types.VARCHAR, docPropertyType, nullable, keepSource); } } /** * List mapped to Postgres JSON. */ - private static class Json extends ScalarTypeJsonSet.PgBase { - public Json(DocPropertyType docPropertyType, boolean nullable) { - super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE, docPropertyType, nullable); + private static final class Json extends ScalarTypeJsonSet.PgBase { + private Json(DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { + super(DbPlatformType.JSON, PostgresHelper.JSON_TYPE, docPropertyType, nullable, keepSource); } } /** * List mapped to Postgres JSONB. */ - private static class JsonB extends ScalarTypeJsonSet.PgBase { - public JsonB(DocPropertyType docPropertyType, boolean nullable) { - super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE, docPropertyType, nullable); + private static final class JsonB extends ScalarTypeJsonSet.PgBase { + private JsonB(DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { + super(DbPlatformType.JSONB, PostgresHelper.JSONB_TYPE, docPropertyType, nullable, keepSource); } } - /** - * Base class for List handling. - */ @SuppressWarnings("rawtypes") private abstract static class Base extends ScalarTypeJsonCollection { - public Base(int dbType, DocPropertyType docPropertyType, boolean nullable) { + final boolean keepSource; + + private Base(int dbType, DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { super(Set.class, dbType, docPropertyType, nullable); + this.keepSource = keepSource; } @Override - public Set read(DataReader reader) throws SQLException { + public final boolean isJsonMapper() { + return keepSource; + } + + @Override + public final Set read(DataReader reader) throws SQLException { String json = reader.getString(); + if (keepSource) { + reader.pushJson(json); + } try { // parse JSON into modifyAware list return EJson.parseSet(json, true); @@ -87,17 +95,15 @@ public class ScalarTypeJsonSet { } @Override - public void bind(DataBinder binder, Set value) throws SQLException { + public final void bind(DataBinder binder, Set value) throws SQLException { + String rawJson = keepSource ? binder.popJson() : null; + if (rawJson == null && value != null) { + rawJson = formatValue(value); + } if (value == null) { bindNull(binder); - } else if (value.isEmpty()) { - binder.setString("[]"); } else { - try { - binder.setString(EJson.write(value)); - } catch (IOException e) { - throw new SQLException("Failed to format Set into JSON content", e); - } + bindRawJson(binder, rawJson); } } @@ -110,8 +116,12 @@ public class ScalarTypeJsonSet { } } + protected void bindRawJson(DataBinder binder, String rawJson) throws SQLException { + binder.setString(rawJson); + } + @Override - public String formatValue(Set value) { + public final String formatValue(Set value) { try { return EJson.write(value); } catch (IOException e) { @@ -120,7 +130,7 @@ public class ScalarTypeJsonSet { } @Override - public Set parse(String value) { + public final Set parse(String value) { try { return convertList(EJson.parseList(value)); } catch (IOException e) { @@ -129,12 +139,12 @@ public class ScalarTypeJsonSet { } @Override - public Set jsonRead(JsonParser parser) throws IOException { + public final Set jsonRead(JsonParser parser) throws IOException { return convertList(EJson.parseList(parser, parser.getCurrentToken())); } @Override - public void jsonWrite(JsonGenerator writer, Set value) throws IOException { + public final void jsonWrite(JsonGenerator writer, Set value) throws IOException { EJson.write(value, writer); } @@ -151,23 +161,18 @@ public class ScalarTypeJsonSet { final String pgType; - PgBase(int jdbcType, String pgType, DocPropertyType docPropertyType, boolean nullable) { - super(jdbcType, docPropertyType, nullable); + PgBase(int jdbcType, String pgType, DocPropertyType docPropertyType, boolean nullable, boolean keepSource) { + super(jdbcType, docPropertyType, nullable, keepSource); this.pgType = pgType; } - @SuppressWarnings("rawtypes") @Override - public void bind(DataBinder binder, Set value) throws SQLException { - if (value == null) { - bindNull(binder); - } else { - binder.setObject(PostgresHelper.asObject(pgType, formatValue(value))); - } + protected final void bindRawJson(DataBinder binder, String rawJson) throws SQLException { + binder.setObject(PostgresHelper.asObject(pgType, rawJson)); } @Override - protected void bindNull(DataBinder binder) throws SQLException { + protected final void bindNull(DataBinder binder) throws SQLException { binder.setObject(PostgresHelper.asObject(pgType, nullable ? null : "[]")); } } 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 eca6102fa..286818c37 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 @@ -13,9 +13,9 @@ import java.time.ZonedDateTime; /** * ScalarType for java.time.LocalDate. This maps to a JDBC Date. */ -public class ScalarTypeLocalDate extends ScalarTypeBaseDate { +final class ScalarTypeLocalDate extends ScalarTypeBaseDate { - public ScalarTypeLocalDate(JsonConfig.Date mode) { + ScalarTypeLocalDate(JsonConfig.Date mode) { super(mode, LocalDate.class, false, Types.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 12b884e82..5e43af855 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 @@ -14,9 +14,9 @@ import java.time.ZoneId; /** * ScalarType for java.sql.Timestamp. */ -public class ScalarTypeLocalDateTime extends ScalarTypeBaseDateTime { +final class ScalarTypeLocalDateTime extends ScalarTypeBaseDateTime { - public ScalarTypeLocalDateTime(JsonConfig.DateTime mode) { + ScalarTypeLocalDateTime(JsonConfig.DateTime mode) { super(mode, LocalDateTime.class, false, Types.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 42997622e..f851bdcfa 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 @@ -19,13 +19,13 @@ import java.time.LocalTime; /** * ScalarType for java.time.LocalTime stored as JDBC Time. */ -public class ScalarTypeLocalTime extends ScalarTypeBase { +class ScalarTypeLocalTime extends ScalarTypeBase { - public ScalarTypeLocalTime() { + ScalarTypeLocalTime() { super(LocalTime.class, false, Types.TIME); } - protected ScalarTypeLocalTime(int jdbcTtype) { + ScalarTypeLocalTime(int jdbcTtype) { super(LocalTime.class, false, jdbcTtype); } 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 0633fe19c..237c2f633 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 @@ -11,9 +11,9 @@ import java.time.LocalTime; /** * ScalarType for java.time.LocalTime stored with Nanos as DB BIGINT type. */ -public class ScalarTypeLocalTimeWithNanos extends ScalarTypeLocalTime { +final class ScalarTypeLocalTimeWithNanos extends ScalarTypeLocalTime { - public ScalarTypeLocalTimeWithNanos() { + ScalarTypeLocalTimeWithNanos() { super(Types.BIGINT); } 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 438ddaf6a..88190593a 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 @@ -5,9 +5,9 @@ import java.util.Locale; /** * ScalarType for java.util.Currency which converts to and from a VARCHAR database column. */ -public class ScalarTypeLocale extends ScalarTypeBaseVarchar { +final class ScalarTypeLocale extends ScalarTypeBaseVarchar { - public ScalarTypeLocale() { + ScalarTypeLocale() { super(Locale.class); } 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 26c272f54..5287c5fd5 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 @@ -16,9 +16,9 @@ import java.sql.Types; /** * ScalarType for Long and long. */ -public class ScalarTypeLong extends ScalarTypeBase { +final class ScalarTypeLong extends ScalarTypeBase { - public ScalarTypeLong() { + ScalarTypeLong() { super(Long.class, true, Types.BIGINT); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java deleted file mode 100644 index 3a48dd786..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.ebeaninternal.server.type; - -import io.ebean.config.JsonConfig; - -import java.sql.Timestamp; - -public class ScalarTypeLongToTimestamp extends ScalarTypeWrapper { - - public ScalarTypeLongToTimestamp(JsonConfig.DateTime mode) { - super(Long.class, new ScalarTypeTimestamp(mode), new LongToTimestampConverter()); - } -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongVarchar.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongVarchar.java index 9bde5947f..6b7dcecb8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongVarchar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLongVarchar.java @@ -5,7 +5,7 @@ import java.sql.Types; /** * ScalarType for String. */ -public class ScalarTypeLongVarchar extends ScalarTypeClob { +final class ScalarTypeLongVarchar extends ScalarTypeClob { public ScalarTypeLongVarchar() { super(true, Types.LONGVARCHAR); 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 bb101706f..aa6d7d4b5 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 @@ -17,9 +17,9 @@ import java.sql.Types; /** * ScalarType for java.math.BigInteger. */ -public class ScalarTypeMathBigInteger extends ScalarTypeBase { +final class ScalarTypeMathBigInteger extends ScalarTypeBase { - public ScalarTypeMathBigInteger() { + ScalarTypeMathBigInteger() { super(BigInteger.class, false, Types.BIGINT); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonth.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonth.java index 2707c88f1..1b1403230 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonth.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeMonth.java @@ -11,10 +11,9 @@ import java.time.Month; /** * ScalarType mapping for Month enum. */ -public class ScalarTypeMonth extends ScalarTypeEnumWithMapping { +final class ScalarTypeMonth extends ScalarTypeEnumWithMapping { static final EnumToDbIntegerMap beanDbMap = new EnumToDbIntegerMap(); - static { Month[] values = Month.values(); for (Month value : values) { @@ -22,7 +21,7 @@ public class ScalarTypeMonth extends ScalarTypeEnumWithMapping { } } - public ScalarTypeMonth() { + ScalarTypeMonth() { super(beanDbMap, Month.class, 1); } 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 acebb04e9..eb26a84b9 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 @@ -21,24 +21,14 @@ import java.time.MonthDay; * Note that the year used should be a leap year. *

*/ -public class ScalarTypeMonthDay extends ScalarTypeBase { - - protected final int year; - - /** - * Construct with a year of 2000 (which is a leap year). - */ - public ScalarTypeMonthDay() { - this(2000); // Year 2000 is a leap year - } +final class ScalarTypeMonthDay extends ScalarTypeBase { /** * Construct with a base year. The year should be a leap year to * allow the 29th Feb value. */ - public ScalarTypeMonthDay(int year) { + ScalarTypeMonthDay() { super(MonthDay.class, false, Types.DATE); - this.year = year; } private MonthDay convertFromDate(Date ts) { 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 b68f3eba9..f7e151238 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 @@ -13,11 +13,11 @@ import static io.ebeaninternal.server.type.IsoJsonDateTimeParser.formatIso; /** * ScalarType for java.sql.Timestamp. */ -public class ScalarTypeOffsetDateTime extends ScalarTypeBaseDateTime { +final class ScalarTypeOffsetDateTime extends ScalarTypeBaseDateTime { private final ZoneId zoneId; - public ScalarTypeOffsetDateTime(JsonConfig.DateTime mode, ZoneId zoneId) { + ScalarTypeOffsetDateTime(JsonConfig.DateTime mode, ZoneId zoneId) { super(mode, OffsetDateTime.class, false, Types.TIMESTAMP); this.zoneId = zoneId; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetTime.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetTime.java index 2cb3a6f35..e1f241b51 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetTime.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeOffsetTime.java @@ -5,9 +5,9 @@ import java.time.OffsetTime; /** * ScalarType for java.time.OffsetTime stored as DB VARCHAR */ -public class ScalarTypeOffsetTime extends ScalarTypeBaseVarchar { +final class ScalarTypeOffsetTime extends ScalarTypeBaseVarchar { - public ScalarTypeOffsetTime() { + ScalarTypeOffsetTime() { super(OffsetTime.class); } 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 c5ca8951d..a5e318881 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 @@ -8,9 +8,9 @@ import java.nio.file.Paths; /** * ScalarType for java.nio.file.Path which converts to and from a VARCHAR database column. */ -public class ScalarTypePath extends ScalarTypeBaseVarchar { +final class ScalarTypePath extends ScalarTypeBaseVarchar { - public ScalarTypePath() { + ScalarTypePath() { super(Path.class); } 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 573ba6e5c..9b0175173 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 @@ -5,9 +5,9 @@ import java.time.Period; /** * ScalarType for Joda Period stored as DB VARCHAR */ -public class ScalarTypePeriod extends ScalarTypeBaseVarchar { +final class ScalarTypePeriod extends ScalarTypeBaseVarchar { - public ScalarTypePeriod() { + ScalarTypePeriod() { super(Period.class); } 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 14d2c50d3..69b3d8a5b 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 @@ -20,9 +20,9 @@ import java.util.Map; * Postgres Hstore type which maps Map to a single 'HStore column' in the DB. */ @SuppressWarnings("rawtypes") -public class ScalarTypePostgresHstore extends ScalarTypeBase { +final class ScalarTypePostgresHstore extends ScalarTypeBase { - public ScalarTypePostgresHstore() { + ScalarTypePostgresHstore() { super(Map.class, false, DbPlatformType.HSTORE); } 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 43d7dac80..b3205b747 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 @@ -17,9 +17,9 @@ import java.sql.Types; /** * ScalarType for Short and short. */ -public class ScalarTypeShort extends ScalarTypeBase { +final class ScalarTypeShort extends ScalarTypeBase { - public ScalarTypeShort() { + ScalarTypeShort() { super(Short.class, true, Types.SMALLINT); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeString.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeString.java index 3ee87d9d9..d57bf253b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeString.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeString.java @@ -5,7 +5,7 @@ import java.sql.Types; /** * ScalarType for String. */ -public class ScalarTypeString extends ScalarTypeStringBase { +public final class ScalarTypeString extends ScalarTypeStringBase { public static final ScalarTypeString INSTANCE = new ScalarTypeString(); 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 50b0d980d..d0ea5a278 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 @@ -16,7 +16,7 @@ import java.sql.Types; /** * Base ScalarType for String type using Varchar, Clob and LongVarchar. */ -public abstract class ScalarTypeStringBase extends ScalarTypeBase { +abstract class ScalarTypeStringBase extends ScalarTypeBase { ScalarTypeStringBase(boolean jdbcNative, int jdbcType) { super(String.class, jdbcNative, jdbcType); 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 4664d79ed..8328edfbe 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 @@ -17,9 +17,9 @@ import java.sql.Types; /** * ScalarType for java.sql.Time. */ -public class ScalarTypeTime extends ScalarTypeBase