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-parentio.ebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTebean api
@@ -50,7 +50,7 @@
io.ebeanebean-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.
+ *
+ *
*/
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-parentio.ebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOT
@@ -26,7 +26,7 @@
io.ebeanebean-core
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTprovided
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-parentio.ebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTebean bom
@@ -14,12 +14,12 @@
1.0
- 1.0
- 12.4.0
+ 1.1
+ 12.11.04.17.0
- 12.10.0
- 12.10.0
+ 12.11.0
+ 12.11.0
@@ -81,88 +81,88 @@
io.ebeanebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-api
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-core
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-core-type
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-ddl-generator
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-externalmapping-api
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-externalmapping-xml
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-autotune
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-querybean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanquerybean-generator
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTprovidedio.ebeankotlin-querybean-generator
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTprovidedio.ebeanebean-test
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTtestio.ebeanebean-postgis
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-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-parentio.ebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTebean-core-type
@@ -16,7 +16,7 @@
io.ebeanebean-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-parentio.ebean
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTebean-core
@@ -20,22 +20,13 @@
-
db2
+
- com.ibm.jdbc
- db2jcc4
- 4.23.42
+ com.ibm.db2
+ jcc
+ 11.5.5.0test
@@ -52,13 +43,13 @@
io.avajeclasspath-scanner
- 4.2
+ 6.0io.ebeanebean-migration-auto
- 1.0
+ 1.1
@@ -72,7 +63,7 @@
io.ebeanebean-ddl-generator
- 12.9.4-RC1
+ 12.11.0test
@@ -87,19 +78,19 @@
io.ebeanebean-api
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-core-type
- 12.10.1-SNAPSHOT
+ 12.11.2-SNAPSHOTio.ebeanebean-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
*/
-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