diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index 72fbfe3ae..b6adad05d 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean api diff --git a/ebean-api/src/main/java/io/ebean/BeanState.java b/ebean-api/src/main/java/io/ebean/BeanState.java index da8c24d81..daf163cc7 100644 --- a/ebean-api/src/main/java/io/ebean/BeanState.java +++ b/ebean-api/src/main/java/io/ebean/BeanState.java @@ -118,4 +118,9 @@ public interface BeanState { */ @Nullable Map getLoadErrors(); + + /** + * Return the sort order value for an order column. + */ + int getSortOrder(); } 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 527860200..9924bf4f7 100644 --- a/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java +++ b/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java @@ -1232,7 +1232,8 @@ public final class EntityBeanIntercept implements Serializable { if (mutableNext == null) { return null; } - return mutableNext[propertyIndex].content(); + final MutableValueNext next = mutableNext[propertyIndex]; + return next != null ? next.content() : null; } } diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml index c47f7fe08..c244053d2 100644 --- a/ebean-autotune/pom.xml +++ b/ebean-autotune/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT @@ -26,7 +26,7 @@ io.ebean ebean-core - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT provided diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index fff064c90..6468059fe 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean bom @@ -12,16 +12,6 @@ ebean-bom pom - - 1.0 - 1.1 - 12.11.0 - 4.1 - 7.0 - 12.11.0 - 12.11.0 - - @@ -81,88 +71,88 @@ io.ebean ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-api - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core-type - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-ddl-generator - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-api - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-xml - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-autotune - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-querybean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean querybean-generator - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT provided io.ebean kotlin-querybean-generator - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT provided io.ebean ebean-test - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT test io.ebean ebean-postgis - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-redis - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index d8eab3e25..10c45ea74 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean-core-type @@ -16,7 +16,7 @@ io.ebean ebean-api - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index 5324aec82..66eb107fb 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -3,7 +3,7 @@ ebean-parent io.ebean - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT ebean-core @@ -78,19 +78,19 @@ io.ebean ebean-api - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-core-type - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT io.ebean ebean-externalmapping-api - 12.11.1-SNAPSHOT + 12.11.2-SNAPSHOT @@ -293,7 +293,7 @@ io.ebean ebean-maven-plugin - 12.10.0 + ${ebean-maven-plugin.version} test 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 64a0a0287..7c5264892 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -13,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). */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java index 4a6eac324..062932af2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java @@ -9,7 +9,7 @@ import java.util.List; * 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 class BindValuesKey { +public final class BindValuesKey { private final List values = new ArrayList<>(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java index bfe9d5b84..2c896e2fb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupMany.java @@ -11,10 +11,9 @@ import java.util.Set; /** * Used for bean cache lookup with where ids in expression. */ -public class CacheIdLookupMany implements CacheIdLookup { +public final class CacheIdLookupMany implements CacheIdLookup { private final IdInExpression idInExpression; - private int remaining; public CacheIdLookupMany(IdInExpression idInExpression) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java index 47ee89c4b..bfc55b5c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/CacheIdLookupSingle.java @@ -7,7 +7,7 @@ import java.util.List; /** * Used for bean cache lookup with a single id value. */ -public class CacheIdLookupSingle implements CacheIdLookup { +public final class CacheIdLookupSingle implements CacheIdLookup { private final Object idValue; private boolean found; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java index 9e184ad61..0d3c72db7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java @@ -6,7 +6,7 @@ import io.ebean.annotation.Platform; * Helper to indicate that an EbeanServer should come up offline * typically for DDL generation purposes. */ -public class DbOffline { +public final class DbOffline { private static final String KEY = "ebean.dboffline"; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java b/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java index 5d6f79527..57280b9f3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ExtraMetrics.java @@ -8,7 +8,7 @@ import io.ebean.metric.TimedMetric; /** * Extra metrics collected to measure internal behaviour. */ -public class ExtraMetrics { +public final class ExtraMetrics { private final TimedMetric bindCapture; private final TimedMetric planCollect; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java index faddb7bee..a207f3c57 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java @@ -3,7 +3,7 @@ package io.ebeaninternal.api; /** * A hash key for a query including both the query plan and bind values. */ -public class HashQuery { +public final class HashQuery { private final CQueryPlanKey planHash; private final BindValuesKey bindValuesKey; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java b/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java index cb7643c65..7356fbc01 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HelpScopeTrans.java @@ -6,7 +6,7 @@ import io.ebean.TxScope; /** * Helper object to make AOP generated code simpler. */ -public class HelpScopeTrans { +public final class HelpScopeTrans { private static boolean enabled = true; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java b/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java index 9d72463a5..a763182b2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/LoadBeanRequest.java @@ -13,16 +13,12 @@ import java.util.Set; /** * Request for loading ManyToOne and OneToOne relationships. */ -public class LoadBeanRequest extends LoadRequest { +public final class LoadBeanRequest extends LoadRequest { private final List batch; - private final LoadBeanBuffer loadBuffer; - private final String lazyLoadProperty; - private final boolean loadCache; - private boolean loadedFromCache; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java b/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java index 0343b8579..cd49558d6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/LoadManyRequest.java @@ -15,16 +15,13 @@ import java.util.List; /** * Request for loading Associated Many Beans. */ -public class LoadManyRequest extends LoadRequest { +public final class LoadManyRequest extends LoadRequest { private static final Logger logger = LoggerFactory.getLogger(LoadManyRequest.class); private final List> batch; - private final LoadManyBuffer loadContext; - private final boolean onlyIds; - private final boolean loadCache; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java b/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java index 0c6b128a2..91fc49d21 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ManyWhereJoins.java @@ -17,16 +17,13 @@ import java.util.TreeSet; * Holds the joins needs to support the many where predicates. * These joins are independent of any 'fetch' joins on the many. */ -public class ManyWhereJoins implements Serializable { +public final class ManyWhereJoins implements Serializable { private static final long serialVersionUID = -6490181101871795417L; private final TreeMap joins = new TreeMap<>(); - private List formulaJoinProperties; - private boolean aggregation; - /** * 'Mode' indicating that joins added while this is true are required to be outer joins. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java b/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java deleted file mode 100644 index e1b930769..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/api/Monitor.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.ebeaninternal.api; - -import java.io.Serializable; - -/** - * Object used as a synchronization monitor that is serializable. - */ -public class Monitor implements Serializable { - - private static final long serialVersionUID = -2741687226680981940L; - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java index aff59771b..61514bc66 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntryBasic.java @@ -11,7 +11,7 @@ import java.util.Map; /** * Natural key entry with name value pairs for each of the properties making up the key. */ -class NaturalKeyEntryBasic implements NaturalKeyEntry { +final class NaturalKeyEntryBasic implements NaturalKeyEntry { private final Map map = new HashMap<>(); private final String key; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java index 0fa7bef62..0ad6e9343 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEntrySimple.java @@ -1,6 +1,6 @@ package io.ebeaninternal.api; -class NaturalKeyEntrySimple implements NaturalKeyEntry { +final class NaturalKeyEntrySimple implements NaturalKeyEntry { private final String key; private final Object val; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java index e7a6218df..3933c2f4b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyEq.java @@ -3,7 +3,7 @@ package io.ebeaninternal.api; /** * A property value pair in a natural key lookup. */ -public class NaturalKeyEq { +public final class NaturalKeyEq { final String property; final Object value; diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java index 6966787d5..a8b4d348d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeyQueryData.java @@ -11,28 +11,22 @@ import java.util.Set; /** * Collects the data for processing the natural key cache processing. */ -public class NaturalKeyQueryData { +public final class NaturalKeyQueryData { private final BeanNaturalKey naturalKey; - /** * Only one of IN or IN PAIRS is allowed. */ private boolean hasIn; - // IN Pairs clause - only one allowed private String inProperty0, inProperty1; private List inPairs; - // IN clause - only one allowed private List inValues; private String inProperty; - // normal EQ expressions private List eqList; - private NaturalKeySet set; - private int hitCount; public NaturalKeyQueryData(BeanNaturalKey naturalKey) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java index cf31afbf9..89b5ae484 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NaturalKeySet.java @@ -4,8 +4,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; -public class NaturalKeySet { - +public final class NaturalKeySet { private final Map map = new LinkedHashMap<>(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java index 2f7162c70..33ee06b54 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryBindCapture.java @@ -2,7 +2,7 @@ package io.ebeaninternal.api; import io.ebeaninternal.server.type.bindcapture.BindCapture; -class NoopQueryBindCapture implements SpiQueryBindCapture { +final class NoopQueryBindCapture implements SpiQueryBindCapture { @Override public boolean collectFor(long timeMicros) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java index 813121f92..9c6a54952 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/NoopQueryPlanManager.java @@ -6,7 +6,7 @@ import io.ebean.meta.QueryPlanRequest; import java.util.Collections; import java.util.List; -class NoopQueryPlanManager implements QueryPlanManager { +final class NoopQueryPlanManager implements QueryPlanManager { @Override public void setDefaultThreshold(long thresholdMicros) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java b/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java index a333008e9..eeb51221e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/PlatformMatch.java @@ -3,7 +3,7 @@ package io.ebeaninternal.api; import io.ebean.annotation.Platform; import io.ebean.util.StringHelper; -public class PlatformMatch { +public final class PlatformMatch { /** * Return true if the script platforms is a match/supported for the given platform. @@ -15,7 +15,6 @@ public class PlatformMatch { if (platforms == null || platforms.trim().isEmpty()) { return true; } - // match on base platform name and platform name for (String name : StringHelper.splitNames(platforms)) { if (name.equalsIgnoreCase(platform.base().name()) || name.equalsIgnoreCase(platform.name())) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java b/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java index 2b11732b0..ab63e09d4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/PropertyJoin.java @@ -5,16 +5,9 @@ import io.ebeaninternal.server.query.SqlJoinType; /** * Represents a join required for a given property and whether than needs to be an outer join. */ -public class PropertyJoin { +public final class PropertyJoin { - /** - * The property name. - */ private final String property; - - /** - * Set to true if the property needs to be an outer join. - */ private final SqlJoinType joinType; public PropertyJoin(String property, SqlJoinType joinType) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java b/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java index 631b6dfb8..f3ca6555f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopeTrans.java @@ -7,7 +7,7 @@ import java.util.ArrayList; /** * Used internally to handle the scoping of transactions for methods. */ -public class ScopeTrans { +public final class ScopeTrans { private static final int OPCODE_ATHROW = 191; @@ -15,43 +15,32 @@ public class ScopeTrans { * The transaction in scope (can be null). */ private final SpiTransaction transaction; - /** * If true by default rollback on Checked exceptions. */ private final boolean rollbackOnChecked; - /** * True if the transaction was created and hence should be committed * on finally if it hasn't already been rolled back. */ private final boolean created; - /** * Explicit set of Exceptions that DO NOT cause a rollback to occur. */ private final ArrayList> noRollbackFor; - /** * Explicit set of Exceptions that DO cause a rollback to occur. */ private final ArrayList> rollbackFor; - private Boolean restoreBatch; - private Boolean restoreBatchOnCascade; - private int restoreBatchSize; - private Boolean restoreBatchGeneratedKeys; - private boolean restoreBatchFlushOnQuery; - /** * Flag set when a rollback has occurred. */ private boolean rolledBack; - /** * Flag set when nested commit has occurred. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java index f5a1db07b..383746f13 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -10,15 +10,13 @@ import javax.persistence.PersistenceException; * * These can be nested and internally they are pushed and popped from a stack. */ -public class ScopedTransaction extends SpiTransactionProxy { +public final class ScopedTransaction extends SpiTransactionProxy { private final TransactionScopeManager manager; - /** * Stack of 'nested' transactions. */ private final ArrayStack stack = new ArrayStack<>(); - private ScopeTrans current; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java index e02397a75..203827820 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionValidation.java @@ -8,10 +8,9 @@ import java.util.Set; /** * Property expression validation request for a given root bean type. */ -public class SpiExpressionValidation { +public final class SpiExpressionValidation { private final BeanType desc; - private final LinkedHashSet unknown = new LinkedHashSet<>(); public SpiExpressionValidation(BeanType desc) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java index 52d87d23e..22a5ba904 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/TransactionEvent.java @@ -20,7 +20,7 @@ import java.util.List; * to the TransactionEventManager. *

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

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

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

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

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

*/ -public class DefaultChangeLogPrepare implements ChangeLogPrepare { +public final class DefaultChangeLogPrepare implements ChangeLogPrepare { /** * Just return true to send change set through to the logger. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java index a6208a703..e7a7bf303 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/changelog/DefaultChangeLogRegister.java @@ -14,10 +14,9 @@ import java.util.Set; /** * Default implementation of ChangeLogRegister. */ -public class DefaultChangeLogRegister implements ChangeLogRegister { +public final class DefaultChangeLogRegister implements ChangeLogRegister { private static final BasicFilter INCLUDE_INSERTS = new BasicFilter(true); - private static final BasicFilter EXCLUDE_INSERTS = new BasicFilter(false); private final boolean defaultInsertsInclude; @@ -31,20 +30,16 @@ public class DefaultChangeLogRegister implements ChangeLogRegister { @Override public ChangeLogFilter getChangeFilter(Class beanType) { - ChangeLog changeLog = getChangeLog(beanType); if (changeLog == null) { return null; } - String[] updatesThatInclude = changeLog.updatesThatInclude(); if (updatesThatInclude.length == 0) { return insertModeInclude(changeLog.inserts()) ? INCLUDE_INSERTS : EXCLUDE_INSERTS; } - Set updateProps = new HashSet<>(); Collections.addAll(updateProps, updatesThatInclude); - return new UpdateFilter(insertModeInclude(changeLog.inserts()), updateProps); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/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..5bedf1355 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; @@ -94,4 +94,8 @@ public class DefaultBeanState implements BeanState { return intercept.getLoadErrors(); } + @Override + public int getSortOrder() { + return intercept.getSortOrder(); + } } 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 2c8bbfecc..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()); } 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 20d7ec223..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(); 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/DumpMetrics.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java index 5274b4ced..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; 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 4bc1e5035..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,7 +29,6 @@ class DumpMetricsData { } private void collect(ServerMetrics serverMetrics) { - final List timedMetrics = serverMetrics.timedMetrics(); final List countMetrics = serverMetrics.countMetrics(); final List queryMetrics = serverMetrics.queryMetrics(); 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 90200f79b..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; 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/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/deploy/AssocOneHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java index 6f7f0bb75..c2ed2a472 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelp.java @@ -14,9 +14,7 @@ import java.sql.SQLException; abstract class AssocOneHelp { final BeanPropertyAssocOne property; - private final BeanDescriptor target; - private final String path; AssocOneHelp(BeanPropertyAssocOne property) { @@ -58,19 +56,16 @@ abstract class AssocOneHelp { * Read and return the bean. */ Object read(DbReadContext ctx) throws SQLException { - // Support for Inheritance hierarchy on exported OneToOne ? Object id = property.targetIdBinder.read(ctx); if (id == null) { return null; } - PersistenceContext pc = ctx.getPersistenceContext(); Object existing = target.contextGet(pc, id); if (existing != null) { return existing; } - boolean disableLazyLoading = ctx.isDisableLazyLoading(); Object ref = target.contextRef(pc, ctx.isReadOnly(), disableLazyLoading, id); if (!disableLazyLoading) { @@ -79,7 +74,6 @@ abstract class AssocOneHelp { return ref; } - /** * Read setting values into the bean. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpEmbedded.java index afc910528..228dbb599 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpEmbedded.java @@ -32,7 +32,6 @@ final class AssocOneHelpEmbedded extends AssocOneHelp { @Override Object read(DataReader reader) throws SQLException { - EntityBean embeddedBean = property.targetDescriptor.createEntityBean(); boolean notNull = false; for (BeanProperty property : property.embeddedProps) { @@ -63,9 +62,7 @@ final class AssocOneHelpEmbedded extends AssocOneHelp { @Override Object read(DbReadContext ctx) throws SQLException { - EntityBean embeddedBean = property.targetDescriptor.createEntityBean(); - boolean notNull = false; for (BeanProperty property : property.embeddedProps) { Object value = property.readSet(ctx, embeddedBean); 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..cf2f00f28 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,10 +5,9 @@ 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; - private final String softDeletePredicate; AssocOneHelpRefExported(BeanPropertyAssocOne property) { @@ -22,7 +21,6 @@ class AssocOneHelpRefExported extends AssocOneHelp { */ @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { - // set appropriate tableAlias for the exported id columns String relativePrefix = ctx.getRelativePrefix(property.getName()); ctx.pushTableAlias(relativePrefix); @@ -32,7 +30,6 @@ class AssocOneHelpRefExported extends AssocOneHelp { @Override void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { - String relativePrefix = ctx.getRelativePrefix(property.getName()); if (softDelete && !ctx.isIncludeSoftDelete()) { property.tableJoin.addJoin(joinType, relativePrefix, ctx, softDeletePredicate); 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..3018b7e19 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; @@ -29,7 +29,6 @@ class AssocOneHelpRefInherit extends AssocOneHelp { */ @Override Object read(DbReadContext ctx) throws SQLException { - // read discriminator to determine the type InheritInfo rowInheritInfo = inherit.readType(ctx); if (rowInheritInfo == null) { @@ -37,12 +36,10 @@ class AssocOneHelpRefInherit extends AssocOneHelp { property.targetIdBinder.loadIgnore(ctx); return null; } - Object id = property.targetIdBinder.read(ctx); if (id == null) { return null; } - // check transaction context to see if it already exists PersistenceContext pc = ctx.getPersistenceContext(); BeanDescriptor desc = rowInheritInfo.desc(); @@ -50,7 +47,6 @@ class AssocOneHelpRefInherit extends AssocOneHelp { if (existing != null) { return existing; } - // for inheritance hierarchy create the correct type for this row... boolean disableLazyLoading = ctx.isDisableLazyLoading(); Object ref = desc.contextRef(pc, ctx.isReadOnly(), disableLazyLoading, id); @@ -72,7 +68,6 @@ class AssocOneHelpRefInherit extends AssocOneHelp { */ @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { - if (!subQuery) { // add discriminator column String relativePrefix = ctx.getRelativePrefix(property.getName()); 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/BaseCollectionHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BaseCollectionHelp.java index f66ad8e4c..a803e1754 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BaseCollectionHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BaseCollectionHelp.java @@ -13,7 +13,6 @@ abstract class BaseCollectionHelp implements BeanCollectionHelp { final BeanPropertyAssocMany many; private final BeanDescriptor targetDescriptor; final String propertyName; - BeanCollectionLoader loader; BaseCollectionHelp(BeanPropertyAssocMany many) { 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..4c0672a35 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,12 +8,10 @@ import javax.persistence.CascadeType; * This is set to associated Beans, Table joins and List. *

*/ -public class BeanCascadeInfo { +public final class BeanCascadeInfo { private boolean delete; - private boolean save; - private boolean refresh; public void setTypes(CascadeType[] types) { 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..a4cb98e94 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) { @@ -28,7 +25,6 @@ class BeanChangeJson implements BeanDiffVisitor { this.newData = new StringWriter(200); this.newJson = descriptor.createJsonWriter(newData); newJson.writeStartObject(); - if (statelessUpdate) { this.oldJson = null; this.oldData = null; @@ -41,7 +37,6 @@ class BeanChangeJson implements BeanDiffVisitor { @Override public void visit(int position, Object newVal, Object oldVal) { - try { BeanProperty prop = descriptor.propertiesIndex[position]; if (prop.isDbUpdatable()) { @@ -58,7 +53,6 @@ class BeanChangeJson implements BeanDiffVisitor { @Override public void visitPush(int position) { stack.push(descriptor); - BeanPropertyAssocOne embedded = (BeanPropertyAssocOne)descriptor.propertiesIndex[position]; descriptor = embedded.getTargetDescriptor(); newJson.writeStartObject(embedded.getName()); 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..c3bda06be 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,16 +29,14 @@ 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); } - } @SuppressWarnings("unchecked") public static CQueryCollectionAdd create(SpiQuery.Type manyType, OrmQueryRequest request) { - if (manyType == SpiQuery.Type.LIST) { return LIST_HELP; @@ -56,5 +53,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 055f2605a..6541cade1 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 @@ -115,37 +115,23 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private static final Logger logger = LoggerFactory.getLogger(BeanDescriptor.class); - private final ConcurrentHashMap updatePlanCache = new ConcurrentHashMap<>(); - - private final ConcurrentHashMap queryPlanCache = new ConcurrentHashMap<>(); - - private final ConcurrentHashMap elCache = new ConcurrentHashMap<>(); - - private final ConcurrentHashMap elDeployCache = new ConcurrentHashMap<>(); - - private final ConcurrentHashMap> comparatorCache = new ConcurrentHashMap<>(); - - private final ConcurrentHashMap dynamicProperty = new ConcurrentHashMap<>(); - - private final Map namedRawSql; - - private final Map namedQuery; - - private final boolean multiValueSupported; - private boolean batchEscalateOnCascadeInsert; - private boolean batchEscalateOnCascadeDelete; - - private final BeanIudMetrics iudMetrics; - public enum EntityType { ORM, EMBEDDED, VIEW, SQL, DOC } - /** - * The nature/type of this bean. - */ + private final ConcurrentHashMap updatePlanCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap queryPlanCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap elCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap elDeployCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> comparatorCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap dynamicProperty = new ConcurrentHashMap<>(); + private final Map namedRawSql; + private final Map namedQuery; + private final boolean multiValueSupported; + private boolean batchEscalateOnCascadeInsert; + private boolean batchEscalateOnCascadeDelete; + private final BeanIudMetrics iudMetrics; private final EntityType entityType; - /** * Set when Id property is marked with GeneratedValue annotation. */ @@ -153,71 +139,39 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final PlatformIdGenerator idGenerator; private final IdentityMode identityMode; private final IdType idType; - /** * SQL used to return last inserted id. Used for Identity columns where * getGeneratedKeys is not supported. */ private final String selectLastInsertedId; private final String selectLastInsertedIdDraft; - private final boolean autoTunable; - - /** - * The concurrency mode for beans of this type. - */ private final ConcurrencyMode concurrencyMode; - private final IndexDefinition[] indexDefinitions; - private final String[] dependentTables; - - /** - * The base database table. - */ private final String baseTable; private final String baseTableAsOf; private final String baseTableVersionsBetween; private final boolean historySupport; private final TableJoin primaryKeyJoin; - private final BeanProperty softDeleteProperty; private final boolean softDelete; - private final String draftTable; - private final PartitionMeta partitionMeta; private final String storageEngine; - - /** - * DB table comment. - */ private final String dbComment; - - /** - * Set to true if read auditing is on for this bean type. - */ private final boolean readAuditing; - private final boolean draftable; - private final boolean draftableElement; - private final BeanProperty unmappedJson; - private final BeanProperty tenant; - private final BeanProperty draft; - private final BeanProperty draftDirty; - private final LinkedHashMap propMap; - /** * Map of DB column to property path (for nativeSql mapping). */ private final Map columnPath = new HashMap<>(); - /** * Map of related table to assoc property (for nativeSql mapping). */ @@ -235,46 +189,34 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final BeanQueryAdapter queryAdapter; private final BeanFindController beanFinder; private final ChangeLogFilter changeLogFilter; - - /** - * Inheritance information. Server side only. - */ final InheritInfo inheritInfo; - private final boolean abstractType; - private final BeanProperty idProperty; private final int idPropertyIndex; - private final BeanProperty versionProperty; private final int versionPropertyIndex; private final BeanProperty whenModifiedProperty; private final BeanProperty whenCreatedProperty; - /** * Properties that are initialised in the constructor need to be 'unloaded' to support partial object queries. */ private final int[] unloadProperties; - /** * Properties local to this type (not from a super type). */ private final BeanProperty[] propertiesLocal; - /** * Scalar mutable properties (need to dirty check on update). */ private final BeanProperty[] propertiesMutable; private final BeanPropertyAssocOne unidirectional; private final BeanProperty orderColumn; - private final BeanProperty[] propertiesNonMany; private final BeanProperty[] propertiesAggregate; private final BeanPropertyAssocMany[] propertiesMany; private final BeanPropertyAssocMany[] propertiesManySave; private final BeanPropertyAssocMany[] propertiesManyDelete; private final BeanPropertyAssocMany[] propertiesManyToMany; - /** * list of properties that are associated beans and not embedded (Derived). */ @@ -285,10 +227,8 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final BeanPropertyAssocOne[] propertiesOneExportedSave; private final BeanPropertyAssocOne[] propertiesOneExportedDelete; private final BeanPropertyAssocOne[] propertiesEmbedded; - private final BeanProperty[] propertiesBaseScalar; private final BeanProperty[] propertiesTransient; - /** * All non transient properties excluding the id properties. */ @@ -300,21 +240,10 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final boolean idOnlyReference; private BeanNaturalKey beanNaturalKey; - /** - * The bean class name or the table name for MapBeans. - */ + private final String fullName; - - /** - * Flag used to determine if saves can be skipped. - */ private boolean saveRecurseSkippable; - - /** - * Flag used to determine if deletes can be skipped. - */ private boolean deleteRecurseSkippable; - private final EntityBean prototypeEntityBean; private final IdBinder idBinder; @@ -629,11 +558,9 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { } prop.registerColumn(this, null); } - if (unidirectional != null) { unidirectional.initialise(initContext); } - idBinder.initialise(); idBinderInLHSSql = idBinder.getBindIdInSql(baseTableAlias); idBinderIdSql = idBinder.getBindIdSql(baseTableAlias); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 0b547b9a9..7cdaf95df 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -50,38 +50,27 @@ final class BeanDescriptorCacheHelp { private static final Logger natLog = LoggerFactory.getLogger("io.ebean.cache.NATKEY"); private final BeanDescriptor desc; - private final SpiCacheManager cacheManager; - private final CacheOptions cacheOptions; - /** * Flag indicating this bean has no relationships. */ private final boolean cacheSharableBeans; private final boolean invalidateQueryCache; - private final Class beanType; - private final String cacheName; - private final BeanPropertyAssocOne[] propertiesOneImported; private final String[] naturalKey; - private final ServerCache beanCache; private final ServerCache naturalKeyCache; private final ServerCache queryCache; - private final boolean noCaching; - private final SpiCacheControl cacheControl; private final SpiCacheRegion cacheRegion; - /** * Set to true if all persist changes need to notify the cache. */ private boolean cacheNotifyOnAll; - /** * Set to true if delete changes need to notify cache. */ @@ -293,13 +282,11 @@ final class BeanDescriptorCacheHelp { // held as part of the bean cache so skip return false; } - CachedManyIds entry = manyPropGet(parentId, many.getName()); if (entry == null) { // not in cache so return unsuccessful return false; } - EntityBean ownerBean = bc.getOwnerBean(); EntityBeanIntercept ebi = ownerBean._ebean_getIntercept(); PersistenceContext persistenceContext = ebi.getPersistenceContext(); @@ -307,8 +294,13 @@ final class BeanDescriptorCacheHelp { List idList = entry.getIdList(); bc.checkEmptyLazyLoad(); + int i = 0; for (Object id : idList) { - many.add(bc, targetDescriptor.createReference(readOnly, id, persistenceContext)); + final EntityBean ref = targetDescriptor.createReference(readOnly, id, persistenceContext); + if (many.hasOrderColumn()) { + ref._ebean_getIntercept().setSortOrder(++i); + } + many.add(bc, ref); } return true; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorDraftHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorDraftHelp.java index 4609b3b74..f1433dbde 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorDraftHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorDraftHelp.java @@ -14,9 +14,7 @@ import java.util.List; final class BeanDescriptorDraftHelp { private final BeanDescriptor desc; - private final BeanProperty draftDirty; - private final BeanProperty[] resetProperties; BeanDescriptorDraftHelp(BeanDescriptor desc) { @@ -29,16 +27,12 @@ final class BeanDescriptorDraftHelp { * Return the properties that are reset on draft beans after publish. */ private BeanProperty[] resetProperties() { - List list = new ArrayList<>(); - - BeanProperty[] props = desc.propertiesNonMany(); - for (BeanProperty prop : props) { + for (BeanProperty prop : desc.propertiesNonMany()) { if (prop.isDraftReset()) { list.add(prop); } } - return list.toArray(new BeanProperty[0]); } @@ -46,19 +40,15 @@ final class BeanDescriptorDraftHelp { * Set the value of all the 'reset properties' to null on the draft bean. */ boolean draftReset(T draftBean) { - EntityBean draftEntityBean = (EntityBean) draftBean; - if (draftDirty != null) { // set @DraftDirty property to false draftDirty.setValueIntercept(draftEntityBean, false); } - // set to null on all @DraftReset properties for (BeanProperty resetProperty : resetProperties) { resetProperty.setValueIntercept(draftEntityBean, null); } - // return true if the bean is dirty (and should be persisted) return draftEntityBean._ebean_getIntercept().isDirty(); } @@ -71,31 +61,23 @@ final class BeanDescriptorDraftHelp { */ @SuppressWarnings("unchecked") public T publish(T draftBean, T liveBean) { - if (liveBean == null) { liveBean = (T) desc.createEntityBean(); } - EntityBean draft = (EntityBean) draftBean; EntityBean live = (EntityBean) liveBean; - BeanProperty idProperty = desc.getIdProperty(); if (idProperty != null) { idProperty.publish(draft, live); } - - BeanProperty[] props = desc.propertiesNonMany(); - for (BeanProperty prop : props) { + for (BeanProperty prop : desc.propertiesNonMany()) { prop.publish(draft, live); } - - BeanPropertyAssocMany[] many = desc.propertiesMany(); - for (BeanPropertyAssocMany aMany : many) { - if (aMany.getTargetDescriptor().isDraftable()) { - aMany.publishMany(draft, live); + for (BeanPropertyAssocMany many : desc.propertiesMany()) { + if (many.getTargetDescriptor().isDraftable()) { + many.publishMany(draft, live); } } - return liveBean; } @@ -103,20 +85,15 @@ final class BeanDescriptorDraftHelp { * Fetch draftable element relationships. */ void draftQueryOptimise(Query query) { - - BeanPropertyAssocOne[] one = desc.propertiesOne(); - for (BeanPropertyAssocOne anOne : one) { + for (BeanPropertyAssocOne anOne : desc.propertiesOne()) { if (anOne.getTargetDescriptor().isDraftableElement()) { query.fetch(anOne.getName()); } } - - BeanPropertyAssocMany[] many = desc.propertiesMany(); - for (BeanPropertyAssocMany aMany : many) { + for (BeanPropertyAssocMany aMany : desc.propertiesMany()) { if (aMany.getTargetDescriptor().isDraftableElement()) { query.fetch(aMany.getName()); } } - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java index 1d541377d..54803369a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java @@ -15,7 +15,6 @@ import java.util.Arrays; abstract class BeanDescriptorElement extends BeanDescriptor { private final String simpleName; - final ElementHelp elementHelp; BeanDescriptorElement(BeanDescriptorMap owner, DeployBeanDescriptor deploy, ElementHelp elementHelp) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbedded.java index c40a1c156..6758d4b09 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbedded.java @@ -12,12 +12,11 @@ import java.io.IOException; /** * Bean descriptor used with element collection of list/set of embeddable. */ +@SuppressWarnings("rawtypes") class BeanDescriptorElementEmbedded extends BeanDescriptorElement { private final BeanPropertyAssocOne embeddedProperty; - private final EntityBean prototype; - private BeanDescriptor targetDescriptor; BeanDescriptorElementEmbedded(BeanDescriptorMap owner, DeployBeanDescriptor deploy, ElementHelp elementHelp) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java index 670c0c67d..e0ae85be1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementEmbeddedMap.java @@ -18,7 +18,6 @@ import java.util.Map; class BeanDescriptorElementEmbeddedMap extends BeanDescriptorElementEmbedded { private final ScalarType scalarTypeKey; - private final boolean stringKey; BeanDescriptorElementEmbeddedMap(BeanDescriptorMap owner, DeployBeanDescriptor deploy, ElementHelp elementHelp) { @@ -50,7 +49,6 @@ class BeanDescriptorElementEmbeddedMap extends BeanDescriptorElementEmbedded< @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); ElementCollector add = elementHelp.createCollector(); do { @@ -70,7 +68,6 @@ class BeanDescriptorElementEmbeddedMap extends BeanDescriptorElementEmbedded< add.addKeyValue(key, val); } } while (true); - return add.collection(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java index 262f7d8be..13833eb77 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalar.java @@ -40,7 +40,6 @@ class BeanDescriptorElementScalar extends BeanDescriptorElement { @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); ElementCollector add = elementHelp.createCollector(); do { @@ -50,7 +49,6 @@ class BeanDescriptorElementScalar extends BeanDescriptorElement { } add.addElement(scalarType.jsonRead(parser)); } while (true); - return add.collection(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java index a9aabce8b..93a2bcb91 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElementScalarMap.java @@ -49,7 +49,6 @@ class BeanDescriptorElementScalarMap extends BeanDescriptorElement { @Override public Object jsonReadCollection(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - JsonParser parser = readJson.getParser(); ElementCollector add = elementHelp.createCollector(); do { @@ -69,7 +68,6 @@ class BeanDescriptorElementScalarMap extends BeanDescriptorElement { add.addKeyValue(key, val); } } while (true); - return add.collection(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorInitContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorInitContext.java index ec9c19044..9ce861569 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorInitContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorInitContext.java @@ -7,7 +7,6 @@ class BeanDescriptorInitContext { private final Map withHistoryTables; private final Map draftTables; private final String asOfViewSuffix; - private String embeddedPrefix; BeanDescriptorInitContext(Map withHistoryTables, Map draftTables, String asOfViewSuffix) { 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..091a5a579 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(); @@ -145,10 +133,8 @@ class BeanDescriptorJsonHelp { } unmappedProperties.put(key, EJson.parse(parser)); } - } else if (JsonToken.END_OBJECT == event) { break; - } else { throw new RuntimeException("Unexpected token " + event + " - expecting key or end_object at: " + parser.getCurrentLocation()); } 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..6261ab73c 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); @@ -136,19 +107,16 @@ public class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeMana private final int queryPlanTTLSeconds; private int entityBeanCount; private List> immutableDescriptorList; - /** * Map of base tables to 'with history views' used to support 'as of' queries. */ private final Map asOfTableMap = new HashMap<>(); - /** * Map of base tables to 'draft' tables. */ private final Map draftTableMap = new HashMap<>(); // temporary collections used during startup and then cleared - private Map, DeployBeanInfo> deployInfoMap = new HashMap<>(); private Set> embeddedIdTypes = new HashSet<>(); private List> embeddedBeans = new ArrayList<>(); @@ -326,11 +294,9 @@ public class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeMana readInheritedIdGenerators(); // creates the BeanDescriptors readEntityRelationships(); - List> list = new ArrayList<>(descMap.values()); list.sort(beanDescComparator); immutableDescriptorList = Collections.unmodifiableList(list); - initialiseAll(); readForeignKeys(); readTableToDescriptor(); @@ -340,12 +306,9 @@ public class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTypeMana embeddedIdTypes = null; embeddedBeans = null; deployInfoMap = null; - return asOfTableMap; - } catch (BeanNotEnhancedException e) { throw e; - } catch (RuntimeException e) { logger.error("Error in deployment", e); throw e; @@ -905,7 +868,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 5def0dc64..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. 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 413d0b460..74e75702a 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 @@ -69,150 +69,76 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { * Flag to mark this is the id property. */ private final boolean id; - private final boolean importedPrimaryKey; - /** * Flag to make this as a dummy property for unidirecitonal relationships. */ private final boolean unidirectionalShadow; - /** * Flag set if this maps to the inheritance discriminator column */ private final boolean discriminator; - /** * Flag to mark the property as embedded. This could be on * BeanPropertyAssocOne rather than here. Put it here for checking Id type * (embedded or not). */ final boolean embedded; - - /** - * Flag indicating if this the version property. - */ private final boolean version; - private final boolean naturalKey; - - /** - * Set if this property is nullable. - */ private final boolean nullable; - private final boolean unique; - /** * Is this property include in database resultSet. */ private final boolean dbRead; - /** * Include in DB insert. */ private final boolean dbInsertable; - /** * Include in DB update. */ private final boolean dbUpdatable; - /** - * True if the property is based on a SECONDARY table. - */ private final boolean secondaryTable; - private final TableJoin secondaryTableJoin; private final String secondaryTableJoinPrefix; - - /** - * The property is inherited from a super class. - */ private final boolean inherited; - private final Class owningType; - private final boolean local; - - /** - * True if the property is a Clob, Blob LongVarchar or LongVarbinary. - */ private final boolean lob; - private final boolean fetchEager; - final boolean isTransient; /** * The logical bean property name. */ final String name; - final int propertyIndex; - - /** - * The reflected field. - */ private final Field field; - - /** - * The bean type. - */ private final Class propertyType; - private final String dbBind; - - /** - * The database column. This can include quoted identifiers. - */ final String dbColumn; - private final String elPrefix; final String elPlaceHolder; final String elPlaceHolderEncrypted; - - /** - * Select part of a SQL Formula used to populate this property. - */ private final String sqlFormulaSelect; - - /** - * Join part of a SQL Formula. - */ final String sqlFormulaJoin; - private final String aggregation; - private final boolean formula; - - /** - * Set to true if stored encrypted. - */ private final boolean dbEncrypted; - private final boolean localEncrypted; - private final int dbEncryptedType; - - /** - * The jdbc data type this maps to. - */ private final int dbType; - final boolean excludedFromHistory; - /** * Generator for insert or update timestamp etc. */ private final GeneratedProperty generatedProperty; - private final BeanPropertyGetter getter; - private final BeanPropertySetter setter; - final BeanDescriptor descriptor; - /** * Used for non-jdbc native types (java.util.Date Enums etc). Converts from * logical to jdbc types. @@ -221,54 +147,39 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { final ScalarType scalarType; private final DocPropertyOptions docOptions; - /** * The length or precision for DB column. */ private final int dbLength; - /** * The scale for DB column (decimal). */ private final int dbScale; - /** * Deployment defined DB column definition. */ private final String dbColumnDefn; - /** * DB Column default value for DDL definition (FALSE, NOW etc). */ private final String dbColumnDefault; private final List dbMigrationInfos; - /** * Database DDL column comment. */ private final String dbComment; - private final DbEncryptFunction dbEncryptFunction; - private int deployOrder; - final boolean jsonSerialize; final boolean jsonDeserialize; private final boolean unmappedJson; private final boolean tenantId; - private final boolean draft; - private final boolean draftOnly; - private final boolean draftDirty; - private final boolean draftReset; - private final boolean softDelete; - private final String softDeleteDbSet; - private final String softDeleteDbPredicate; public BeanProperty(DeployBeanProperty deploy) { @@ -574,9 +485,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { ctx.appendFormulaSelect(aggregation); } else if (formula) { ctx.appendFormulaSelect(sqlFormulaSelect); - } else if (!isTransient && !ignoreDraftOnlyProperty(ctx.isDraftQuery())) { - if (secondaryTableJoin != null) { ctx.pushTableAlias(ctx.getRelativePrefix(secondaryTableJoinPrefix)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java index 739021196..33304f5f9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssoc.java @@ -43,48 +43,34 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree * so as to avoid a dependency loop between BeanDescriptors. */ BeanDescriptor targetDescriptor; - IdBinder targetIdBinder; - InheritInfo targetInheritInfo; - String targetIdProperty; - /** * Derived list of exported property and matching foreignKey */ ExportedProperty[] exportedProperties; - /** * Persist settings. */ final BeanCascadeInfo cascadeInfo; - /** * Join between the beans. */ final TableJoin tableJoin; - final PropertyForeignKey foreignKey; - /** * The type of the joined bean. */ private final Class targetType; - /** * The join table information. */ final BeanTable beanTable; - final String mappedBy; - private final String docStoreDoc; - private final String extraWhere; - private final int fetchPreference; - private boolean saveRecurseSkippable; /** @@ -98,7 +84,6 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree this.mappedBy = InternString.intern(deploy.getMappedBy()); this.docStoreDoc = deploy.getDocStoreDoc(); this.tableJoin = new TableJoin(deploy.getTableJoin()); - this.targetType = deploy.getTargetType(); this.cascadeInfo = deploy.getCascadeInfo(); this.fetchPreference = deploy.getFetchPreference(); @@ -173,10 +158,8 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree * Create a ElPropertyValue for a *ToOne or *ToMany. */ ElPropertyValue createElPropertyValue(String propName, String remainder, ElPropertyChainBuilder chain, boolean propertyDeploy) { - // associated or embedded bean BeanDescriptor embDesc = getTargetDescriptor(); - if (chain == null) { chain = new ElPropertyChainBuilder(isEmbedded(), propName); } @@ -300,7 +283,6 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree * Return true if the unique id properties are all not null for this bean. */ public boolean hasId(EntityBean bean) { - BeanDescriptor targetDesc = getTargetDescriptor(); BeanProperty idProp = targetDesc.getIdProperty(); // all the unique properties are non-null @@ -339,7 +321,6 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree */ @Override public void docStoreInclude(boolean includeByDefault, DocStructure docStructure) { - String embeddedDoc = getDocStoreDoc(); if (embeddedDoc == null) { // not annotated so use include by default @@ -367,17 +348,14 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree @Override public void docStoreMapping(DocMappingBuilder mapping, String prefix) { - if (mapping.includesPath(prefix, name)) { String fullName = SplitName.add(prefix, name); DocPropertyType type = isMany() ? DocPropertyType.LIST : DocPropertyType.OBJECT; DocPropertyMapping nested = new DocPropertyMapping(name, type); - mapping.push(nested); targetDescriptor.docStoreMapping(mapping, fullName); mapping.pop(); - if (!nested.getChildren().isEmpty()) { mapping.add(nested); } @@ -444,20 +422,16 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree * descriptor back to local database columns in the TableJoin. */ ImportedId createImportedId(BeanPropertyAssoc owner, BeanDescriptor target, TableJoin join) { - BeanProperty idProp = target.getIdProperty(); BeanProperty[] others = target.propertiesBaseScalar(); - if (descriptor.isRawSqlBased()) { String dbColumn = owner.getDbColumn(); return new ImportedIdSimple(owner, dbColumn, null, idProp, 0); } - - TableJoinColumn[] cols = join.columns(); - if (idProp == null) { return null; } + TableJoinColumn[] cols = join.columns(); if (!idProp.isEmbedded()) { // simple single scalar id if (cols.length != 1) { @@ -473,42 +447,34 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree BeanPropertyAssocOne embProp = (BeanPropertyAssocOne) idProp; BeanProperty[] embBaseProps = embProp.getTargetDescriptor().propertiesBaseScalar(); ImportedIdSimple[] scalars = createImportedList(owner, cols, embBaseProps, others); - return new ImportedIdEmbedded(owner, embProp, scalars); } } private ImportedIdSimple[] createImportedList(BeanPropertyAssoc owner, TableJoinColumn[] cols, BeanProperty[] props, BeanProperty[] others) { - ArrayList list = new ArrayList<>(cols.length); - for (TableJoinColumn col : cols) { list.add(createImportedScalar(owner, col, props, others)); } - return ImportedIdSimple.sort(list); } private ImportedIdSimple createImportedScalar(BeanPropertyAssoc owner, TableJoinColumn col, BeanProperty[] props, BeanProperty[] others) { - String matchColumn = col.getForeignDbColumn(); String localColumn = col.getLocalDbColumn(); String localSqlFormula = col.getLocalSqlFormula(); boolean insertable = col.isInsertable(); boolean updateable = col.isUpdateable(); - for (int j = 0; j < props.length; j++) { if (props[j].getDbColumn().equalsIgnoreCase(matchColumn)) { return new ImportedIdSimple(owner, localColumn, localSqlFormula, props[j], j, insertable, updateable); } } - for (int j = 0; j < others.length; j++) { if (others[j].getDbColumn().equalsIgnoreCase(matchColumn)) { return new ImportedIdSimple(owner, localColumn, localSqlFormula, others[j], j + props.length, insertable, updateable); } } - String msg = "Error with the Join on [" + getFullBeanName() + "]. Could not find the local match for [" + matchColumn + "] "//in table["+searchTable+"]?" + " Perhaps an error in a @JoinColumn"; @@ -530,10 +496,8 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree } private void flatten(List bindValues, Object parentId) { - if (isExportedSimple()) { bindValues.add(parentId); - } else { EntityBean parent = (EntityBean) parentId; for (ExportedProperty exportedProperty : exportedProperties) { @@ -543,7 +507,6 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree } void bindParentIds(DefaultSqlUpdate delete, List parentIds) { - if (isExportedSimple()) { delete.setParameter(new MultiValueWrapper(parentIds)); } else { @@ -556,7 +519,6 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree } void bindParentId(DefaultSqlUpdate sqlUpd, Object parentId) { - if (isExportedSimple()) { sqlUpd.setParameter(parentId); return; @@ -595,12 +557,9 @@ public abstract class BeanPropertyAssoc extends BeanProperty implements STree * Find and return the exported property matching to this property. */ ExportedProperty findMatch(boolean embedded, BeanProperty prop, String matchColumn, TableJoin tableJoin) { - String searchTable = tableJoin.getTable(); - for (TableJoinColumn column : tableJoin.columns()) { String matchTo = column.getLocalDbColumn(); - if (matchColumn.equalsIgnoreCase(matchTo)) { String foreignCol = column.getForeignDbColumn(); return new ExportedProperty(embedded, foreignCol, prop); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index c823e9a7e..37e5b7990 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -43,7 +43,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST private static final Logger logger = LoggerFactory.getLogger(BeanPropertyAssocMany.class); private final BeanPropertyAssocManyJsonHelp jsonHelp; - /** * Join for manyToMany intersection table. */ @@ -51,72 +50,46 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST private final String intersectionPublishTable; private final String intersectionDraftTable; private final boolean orphanRemoval; - private IntersectionTable intersectionTable; - /** * For ManyToMany this is the Inverse join used to build reference queries. */ final TableJoin inverseJoin; - /** * Flag to indicate that this is a unidirectional relationship. */ private final boolean unidirectional; - private final boolean o2mJoinTable; - /** * Flag to indicate that the target has a order column to auto populate. */ private final boolean hasOrderColumn; - /** * Flag to indicate manyToMany relationship. */ private final boolean manyToMany; - private final boolean elementCollection; - /** * Descriptor for the 'target' when the property maps to an element collection. */ final BeanDescriptor elementDescriptor; - /** * Order by used when fetch joining the associated many. */ private final String fetchOrderBy; - /** * Order by used when lazy loading the associated many. */ private String lazyFetchOrderBy; - private final String mapKey; - - /** - * The type of the many, set, list or map. - */ private final ManyType manyType; - private final ModifyListenMode modifyListenMode; - private BeanProperty mapKeyProperty; - - /** - * Property on the 'child' bean that links back to the 'master'. - */ private BeanPropertyAssocOne childMasterProperty; - private String childMasterIdProperty; - private boolean embeddedExportedProperties; - private BeanCollectionHelp help; - private ImportedId importedId; - private BeanPropertyAssocManySqlHelp sqlHelp; /** @@ -234,6 +207,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST /** * Return the underlying collection of beans. */ + @SuppressWarnings("rawtypes") public Collection getRawCollection(EntityBean bean) { return help.underlying(getVal(bean)); } @@ -399,8 +373,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } /** - * Return the mode for listening to modifications to collections for this - * association. + * Return the mode for listening to modifications to collections for this association. */ public ModifyListenMode getModifyListenMode() { return modifyListenMode; @@ -470,8 +443,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST sb.append(getExtraWhere().replace("${ta}", "x")); } } - - if (softDelete) { String alias = hasJoinTable() ? "x2" : "x"; sb.append(" and ").append(targetDescriptor.getSoftDeletePredicate(alias)); @@ -606,7 +577,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST if (!manyToMany && childMasterProperty != null) { // bidirectional in the sense that the 'master' property // exists on the 'detail' bean - childMasterProperty.setValue(child, parent); + childMasterProperty.setValueIntercept(child, parent); } } @@ -720,7 +691,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST *

* Note that childMasterProperty will be null if a field is used instead of * a ManyToOne bean association. - *

*/ private BeanPropertyAssocOne initChildMasterProperty() { if (unidirectional) { @@ -907,7 +877,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST // add new relationship (Map not allowed here) liveVal.addBean(targetDescriptor.createReference(id, null)); } - } else { // recursively publish the OneToMany child bean T newLive = targetDescriptor.publish(bean, liveBean); @@ -917,7 +886,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } } } - // anything remaining should be deleted (so remove from modify aware collection) Collection values = liveBeansAsMap.values(); for (T value : values) { @@ -930,7 +898,6 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST liveVal.size(); Collection liveBeans = liveVal.getActualDetails(); Map liveMap = new LinkedHashMap<>(); - for (Object liveBean : liveBeans) { Object id = targetDescriptor.getId((EntityBean) liveBean); liveMap.put(id, (T) liveBean); @@ -1072,7 +1039,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST public void bindElementValue(SqlUpdate insert, Object value) { targetDescriptor.bindElementValue(insert, value); } - + /** * Returns true, if we must create a m2m join table. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java index d448c157c..b84889833 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java @@ -17,7 +17,6 @@ class BeanPropertyAssocManyJsonHelp { * The associated many property. */ private final BeanPropertyAssocMany many; - /** * Helper used to read json for transient 'many' properties. */ @@ -36,7 +35,6 @@ class BeanPropertyAssocManyJsonHelp { * Read the JSON for this property. */ public void jsonRead(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - if (!this.many.jsonDeserialize) { return; } @@ -59,7 +57,6 @@ class BeanPropertyAssocManyJsonHelp { * Read a Transient property using Jackson ObjectMapper. */ private void jsonReadTransientUsingObjectMapper(SpiJsonReader readJson, EntityBean parentBean) throws IOException { - if (jsonTransient == null) { throw new IllegalStateException("Jackson ObjectMapper is required to read this Transient property " + many.getFullBeanName()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java index 5b05b3261..cc43cb9e7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonTransient.java @@ -20,9 +20,7 @@ class BeanPropertyAssocManyJsonTransient { * Use Jackson ObjectMapper to read the transient 'many' property. */ void jsonReadUsingObjectMapper(BeanPropertyAssocMany many, SpiJsonReader readJson, EntityBean parentBean) throws IOException { - ObjectMapper mapper = readJson.getObjectMapper(); - ManyType manyType = many.getManyType(); Object value; @@ -32,13 +30,11 @@ class BeanPropertyAssocManyJsonTransient { JavaType target = typeFactory.constructType(many.getTargetType()); MapType jacksonType = typeFactory.constructMapType(LinkedHashMap.class, TypeFactory.unknownType(), target); value = mapper.readValue(readJson.getParser(), jacksonType); - } else { // read list or set using Jackson object mapper CollectionType jacksonType = mapper.getTypeFactory().constructCollectionType(manyType.getCollectionType(), many.getTargetType()); value = mapper.readValue(readJson.getParser(), jacksonType); } - many.setValue(parentBean, value); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java index 06a2a2145..8a5eade8b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java @@ -7,6 +7,7 @@ import io.ebeaninternal.api.SpiSqlUpdate; import io.ebeaninternal.server.deploy.visitor.BaseTablePropertyVisitor; import io.ebeaninternal.server.deploy.visitor.VisitProperties; import io.ebeaninternal.server.core.DefaultSqlUpdate; +import io.ebeaninternal.server.util.Str; import java.util.List; @@ -44,7 +45,6 @@ class BeanPropertyAssocManySqlHelp { } private String elementCollectionInsert() { - StringBuilder sb = new StringBuilder(200); sb.append("insert into ").append(many.targetTable()).append(" ("); append(sb); @@ -55,7 +55,6 @@ class BeanPropertyAssocManySqlHelp { appendBind(sb, exportedProperties.length, true); appendBind(sb, cols.colCount, false); sb.append(")"); - return sb.toString(); } @@ -66,7 +65,6 @@ class BeanPropertyAssocManySqlHelp { private static class Cols extends BaseTablePropertyVisitor { int colCount; - private final StringBuilder sb; private Cols(StringBuilder sb) { @@ -97,7 +95,6 @@ class BeanPropertyAssocManySqlHelp { } String lazyFetchOrderBy(String fetchOrderBy) { - // derive lazyFetchOrderBy StringBuilder sb = new StringBuilder(50); for (int i = 0; i < exportedProperties.length; i++) { @@ -116,21 +113,17 @@ class BeanPropertyAssocManySqlHelp { * Add a where clause to the query for a given list of parent Id's. */ void addWhereParentIdIn(SpiQuery query, List parentIds) { - String tableAlias = hasJoinTable ? "int_." : "t0."; if (hasJoinTable) { query.setM2MIncludeJoin(many.inverseJoin); } String rawWhere = deriveWhereParentIdSql(true, tableAlias); String expr = descriptor.getParentIdInExpr(parentIds.size(), rawWhere); - many.bindParentIdsIn(expr, parentIds, query); } List findIdsByParentId(Object parentId, Transaction t, List excludeDetailIds, boolean hard) { - String rawWhere = deriveWhereParentIdSql(false, ""); - SpiEbeanServer server = descriptor.getEbeanServer(); SpiQuery q = many.newQuery(server); many.bindParentIdEq(rawWhere, parentId, q); @@ -140,15 +133,12 @@ class BeanPropertyAssocManySqlHelp { if (excludeDetailIds != null && !excludeDetailIds.isEmpty()) { q.where().not(q.getExpressionFactory().idIn(excludeDetailIds)); } - return server.findIds(q, t); } List findIdsByParentIdList(List parentIds, Transaction t, List excludeDetailIds, boolean hard) { - String rawWhere = deriveWhereParentIdSql(true, ""); String inClause = buildInClauseBinding(parentIds.size(), exportedPropertyBindProto); - String expr = rawWhere + inClause; SpiEbeanServer server = descriptor.getEbeanServer(); @@ -161,7 +151,6 @@ class BeanPropertyAssocManySqlHelp { if (excludeDetailIds != null && !excludeDetailIds.isEmpty()) { q.where().not(q.getExpressionFactory().idIn(excludeDetailIds)); } - return server.findIds(q, t); } @@ -172,12 +161,8 @@ class BeanPropertyAssocManySqlHelp { } SpiSqlUpdate deleteByParentIdList(List parentIds) { - - StringBuilder sb = new StringBuilder(100); - sb.append(deleteByParentIdInSql); - sb.append(buildInClauseBinding(parentIds.size(), exportedPropertyBindProto)); - - DefaultSqlUpdate delete = new DefaultSqlUpdate(sb.toString()); + String sql = Str.add(deleteByParentIdInSql, buildInClauseBinding(parentIds.size(), exportedPropertyBindProto)); + DefaultSqlUpdate delete = new DefaultSqlUpdate(sql); many.bindParentIds(delete, parentIds); return delete; } @@ -202,17 +187,14 @@ class BeanPropertyAssocManySqlHelp { } private String deriveWhereParentIdSql(boolean inClause, String tableAlias) { - StringBuilder sb = new StringBuilder(); - if (inClause) { sb.append("("); } for (int i = 0; i < exportedProperties.length; i++) { String fkColumn = exportedProperties[i].getForeignDbColumn(); if (i > 0) { - String s = inClause ? "," : " and "; - sb.append(s); + sb.append(inClause ? "," : " and "); } sb.append(tableAlias).append(fkColumn); if (!inClause) { @@ -226,7 +208,6 @@ class BeanPropertyAssocManySqlHelp { } private String buildInClauseBinding(int size, String bindProto) { - if (descriptor.isSimpleId()) { return descriptor.getIdBinder().getIdInValueExpr(false, size); } 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 9a69b8c9c..3b3c5946c 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 @@ -47,16 +47,11 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr private final boolean primaryKeyJoin; private AssocOneHelp localHelp; - final BeanProperty[] embeddedProps; - private final HashMap embeddedPropsMap; - ImportedId importedId; - private String deleteByParentIdSql; private String deleteByParentIdInSql; - private BeanPropertyAssocMany relationshipProperty; private boolean cacheNotifyRelationship; @@ -72,14 +67,12 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr */ public BeanPropertyAssocOne(BeanDescriptorMap owner, BeanDescriptor descriptor, DeployBeanPropertyAssocOne deploy) { - super(descriptor, deploy); primaryKeyExport = deploy.isPrimaryKeyExport(); primaryKeyJoin = deploy.isPrimaryKeyJoin(); oneToOne = deploy.isOneToOne(); oneToOneExported = deploy.isOneToOneExported(); orphanRemoval = deploy.isOrphanRemoval(); - if (embedded) { // Overriding of the columns and use table alias of owning BeanDescriptor BeanEmbeddedMeta overrideMeta = BeanEmbeddedMetaFactory.create(owner, deploy); @@ -126,7 +119,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr private void initialiseAssocOne(String embeddedPrefix) { localHelp = createHelp(embedded, oneToOneExported, embeddedPrefix); - if (!isTransient) { //noinspection StatementWithEmptyBody if (embedded || descriptor.isDocStoreOnly()) { @@ -143,10 +135,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr + " - joining to " + foreignJoinColumn + " and not " + foreignIdColumn); } } - } else { exportedProperties = createExported(); - String delStmt = "delete from " + targetDescriptor.getBaseTable() + " where "; deleteByParentIdSql = delStmt + deriveWhereParentIdSql(false); deleteByParentIdInSql = delStmt + deriveWhereParentIdSql(true); @@ -198,7 +188,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr * Clear part of the L2 relationship cache for this property. */ void cacheDelete(boolean clear, EntityBean bean, CacheChangeSet changeSet) { - if (cacheNotifyRelationship) { if (clear) { changeSet.addManyClear(targetDescriptor, relationshipProperty.getName()); @@ -224,7 +213,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr @Override public ElPropertyValue buildElPropertyValue(String propName, String remainder, ElPropertyChainBuilder chain, boolean propertyDeploy) { - if (embedded) { BeanProperty embProp = embeddedPropsMap.get(remainder); if (embProp == null) { @@ -236,10 +224,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } chain.add(this); chain.setEmbedded(true); - return chain.add(embProp).build(); } - return createElPropertyValue(propName, remainder, chain, propertyDeploy); } @@ -264,7 +250,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private SqlUpdate deleteByParentId(Object parentId) { - DefaultSqlUpdate delete = new DefaultSqlUpdate(deleteByParentIdSql); bindParentId(delete, parentId); return delete; @@ -279,9 +264,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private List findIdsByParentId(Object parentId, Transaction t) { - String rawWhere = deriveWhereParentIdSql(false); - SpiEbeanServer server = server(); Query q = server.find(getPropertyType()); bindParentIdEq(rawWhere, parentId, q); @@ -289,15 +272,12 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private List findIdsByParentIdList(List parentIds, Transaction t) { - String rawWhere = deriveWhereParentIdSql(true); String inClause = getIdBinder().getIdInValueExpr(false, parentIds.size()); String expr = rawWhere + inClause; - SpiEbeanServer server = server(); Query q = server.find(getPropertyType()); bindParentIdsIn(expr, parentIds, q); - return server.findIds(q, t); } @@ -321,7 +301,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr BeanProperty idProperty = target.getIdProperty(); desc.registerColumn(dbColumn, SplitName.add(basePath, idProperty.getName())); } - desc.registerTable(target.getBaseTable(), this); } } @@ -337,9 +316,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr @Override public void buildRawSqlSelectChain(String prefix, List selectChain) { - prefix = SplitName.add(prefix, name); - if (!embedded) { InheritInfo inheritInfo = targetDescriptor.getInheritInfo(); if (inheritInfo != null) { @@ -355,7 +332,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr + ". Probably a missing @OneToOne mapping annotation on this relationship?"); } targetIdBinder.buildRawSqlSelectChain(prefix, selectChain); - } else { for (BeanProperty embeddedProp : embeddedProps) { embeddedProp.buildRawSqlSelectChain(prefix, selectChain); @@ -387,7 +363,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr @Override public void diff(String prefix, Map map, EntityBean newBean, EntityBean oldBean) { - Object newEmb = (newBean == null) ? null : getValue(newBean); Object oldEmb = (oldBean == null) ? null : getValue(oldBean); if (newEmb == null && oldEmb == null) { @@ -395,7 +370,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } String nextPrefix = (prefix == null) ? name : prefix + "." + name; - if (embedded) { BeanDescriptor targetDescriptor = getTargetDescriptor(); targetDescriptor.diff(nextPrefix, map, (EntityBean) newEmb, (EntityBean) oldEmb); @@ -545,7 +519,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr return !embedded; } - /** * Create a bean of the target type to be used as an embeddedId * value. @@ -569,9 +542,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private String deriveWhereParentIdSql(boolean inClause) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < exportedProperties.length; i++) { String fkColumn = exportedProperties[i].getForeignDbColumn(); if (i > 0) { @@ -590,13 +561,9 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr * Create the array of ExportedProperty used to build reference objects. */ private ExportedProperty[] createExported() { - BeanProperty idProp = descriptor.getIdProperty(); - ArrayList list = new ArrayList<>(); - if (idProp != null && idProp.isEmbedded()) { - BeanPropertyAssocOne one = (BeanPropertyAssocOne) idProp; BeanDescriptor targetDesc = one.getTargetDescriptor(); BeanProperty[] emIds = targetDesc.propertiesBaseScalar(); @@ -608,13 +575,11 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr // not found as individual scalar properties e.printStackTrace(); } - } else { if (idProp != null) { list.add(findMatch(false, idProp)); } } - return list.toArray(new ExportedProperty[0]); } @@ -622,11 +587,9 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr * Find the matching foreignDbColumn for a given local property. */ private ExportedProperty findMatch(boolean embeddedProp, BeanProperty prop) { - return findMatch(embeddedProp, prop, prop.getDbColumn(), tableJoin); } - @Override public void appendSelect(DbSqlContext ctx, boolean subQuery) { if (!isTransient) { @@ -744,7 +707,6 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr */ @Override public void jsonWriteForInsert(SpiJsonWriter writeJson, EntityBean bean) throws IOException { - if (!jsonSerialize) { return; } @@ -763,13 +725,11 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private void jsonWriteBean(SpiJsonWriter writeJson, Object value) throws IOException { - if (value instanceof EntityBean) { if (embedded) { writeJson.writeFieldName(name); BeanDescriptor refDesc = descriptor.getBeanDescriptor(value.getClass()); refDesc.jsonWriteForInsert(writeJson, (EntityBean) value); - } else { jsonWriteTargetId(writeJson, (EntityBean) value); } @@ -790,15 +750,12 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr @Override public void jsonWrite(SpiJsonWriter writeJson, EntityBean bean) throws IOException { - if (!jsonSerialize) { return; } - Object value = getValueIntercept(bean); if (value == null) { writeJson.writeNullField(name); - } else { if (!writeJson.isParentBean(value)) { // Hmmm, not writing complex non-entity bean @@ -829,12 +786,10 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr * Set the parent bean to the child bean if it has not already been set. */ public void setParentBeanToChild(EntityBean parent, EntityBean child) { - if (primaryKeyExport) { Object parentId = descriptor.getId(parent); targetDescriptor.convertSetId(parentId, child); } - if (mappedBy != null) { BeanProperty beanProperty = targetDescriptor.getBeanProperty(mappedBy); if (beanProperty != null && beanProperty.getValue(child) == null) { 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/BeanPropertyJsonMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java index fdea2e449..bb234664f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java @@ -5,6 +5,7 @@ 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; @@ -18,7 +19,7 @@ import java.util.Objects; /** * Handle json property with MutationDetection of SOURCE or HASH only. */ -public class BeanPropertyJsonMapper extends BeanPropertyJsonBasic { +public final class BeanPropertyJsonMapper extends BeanPropertyJsonBasic { private final boolean sourceDetection; @@ -105,6 +106,19 @@ public class BeanPropertyJsonMapper extends BeanPropertyJsonBasic { } } + @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; 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..dbaecc265 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,15 +11,14 @@ import java.util.List; /** * Default implementation for creating BeanControllers. */ -class BeanQueryAdapterManager { +final class BeanQueryAdapterManager { private static final Logger logger = LoggerFactory.getLogger(BeanQueryAdapterManager.class); private final List list; BeanQueryAdapterManager(BootupClasses bootupClasses) { - - list = bootupClasses.getBeanQueryAdapters(); + this.list = bootupClasses.getBeanQueryAdapters(); } int getRegisterCount() { @@ -30,7 +29,6 @@ class BeanQueryAdapterManager { * Return the BeanPersistController for a given entity type. */ void addQueryAdapter(DeployBeanDescriptor deployDesc) { - for (BeanQueryAdapter c : list) { if (c.isRegisterFor(deployDesc.getBeanType())) { logger.debug("BeanQueryAdapter on[{}] {}", deployDesc.getFullName(), c.getClass().getName()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelp.java index 4acc23347..f275d0988 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanSetHelp.java @@ -40,7 +40,6 @@ public class BeanSetHelp extends BaseCollectionHelp { beanSet.setActualSet(new LinkedHashSet<>()); } return beanSet; - } else { throw new RuntimeException("Unhandled type " + bc); } @@ -62,7 +61,6 @@ public class BeanSetHelp extends BaseCollectionHelp { @Override public BeanCollection createReference(EntityBean parentBean) { - BeanSet beanSet = new BeanSet<>(loader, parentBean, propertyName); beanSet.setModifyListening(many.getModifyListenMode()); return beanSet; @@ -70,18 +68,14 @@ public class BeanSetHelp extends BaseCollectionHelp { @Override public void refresh(SpiEbeanServer server, Query query, Transaction t, EntityBean parentBean) { - BeanSet newBeanSet = (BeanSet) server.findSet(query, t); refresh(newBeanSet, parentBean); } @Override public void refresh(BeanCollection bc, EntityBean parentBean) { - BeanSet newBeanSet = (BeanSet) bc; - Set current = (Set) many.getValue(parentBean); - newBeanSet.setModifyListening(many.getModifyListenMode()); if (current == null) { // the currentList is null? Not really expecting this... @@ -101,7 +95,6 @@ public class BeanSetHelp extends BaseCollectionHelp { @Override public void jsonWrite(SpiJsonWriter ctx, String name, Object collection, boolean explicitInclude) throws IOException { - Set set; if (collection instanceof BeanCollection) { BeanSet bc = (BeanSet) collection; 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..ecd0b7a37 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; /** @@ -91,11 +85,9 @@ public class BeanTable { } public void createJoinColumn(String foreignKeyPrefix, DeployTableJoin join, boolean reverse, String sqlFormulaSelect) { - if (idProperty == null) { return; } - if (idProperty instanceof BeanPropertyAssocOne) { BeanPropertyAssocOne assocOne = (BeanPropertyAssocOne) idProperty; BeanProperty[] props = assocOne.getProperties(); @@ -108,13 +100,11 @@ public class BeanTable { } private void addToJoin(String foreignKeyPrefix, DeployTableJoin join, boolean reverse, String sqlFormulaSelect, boolean complexKey, BeanProperty prop) { - String lc = prop.getDbColumn(); String fk = lc; if (foreignKeyPrefix != null) { fk = owner.getNamingConvention().getForeignKey(foreignKeyPrefix, fk); } - if (complexKey) { // just to copy the column name rather than prefix with the foreignKeyPrefix. // I think that with complex keys this is the more common approach. @@ -124,7 +114,6 @@ public class BeanTable { if (sqlFormulaSelect != null) { fk = sqlFormulaSelect; } - DeployTableJoinColumn joinCol = new DeployTableJoinColumn(lc, fk); joinCol.setForeignSqlFormula(sqlFormulaSelect); if (reverse) { 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..cdbdf41be 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,12 +14,11 @@ 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(); private final List list; - private final BeanPersistController[] chain; /** @@ -52,7 +51,7 @@ public class ChainedBeanPersistController implements BeanPersistController { /** * Return the size of the chain. */ - protected int size() { + int size() { return chain.length; } @@ -65,7 +64,6 @@ public class ChainedBeanPersistController implements BeanPersistController { } else { List newList = new ArrayList<>(list); newList.add(c); - return new ChainedBeanPersistController(newList); } } @@ -79,7 +77,6 @@ public class ChainedBeanPersistController implements BeanPersistController { } else { List newList = new ArrayList<>(list); newList.remove(c); - return new ChainedBeanPersistController(newList); } } @@ -102,36 +99,36 @@ public class ChainedBeanPersistController implements BeanPersistController { @Override public void postDelete(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - aChain.postDelete(request); + for (BeanPersistController controller : chain) { + controller.postDelete(request); } } @Override public void postInsert(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - aChain.postInsert(request); + for (BeanPersistController controller : chain) { + controller.postInsert(request); } } @Override public void postUpdate(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - aChain.postUpdate(request); + for (BeanPersistController controller : chain) { + controller.postUpdate(request); } } @Override public void postSoftDelete(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - aChain.postSoftDelete(request); + for (BeanPersistController controller : chain) { + controller.postSoftDelete(request); } } @Override public boolean preDelete(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - if (!aChain.preDelete(request)) { + for (BeanPersistController controller : chain) { + if (!controller.preDelete(request)) { return false; } } @@ -140,8 +137,8 @@ public class ChainedBeanPersistController implements BeanPersistController { @Override public boolean preSoftDelete(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - if (!aChain.preSoftDelete(request)) { + for (BeanPersistController controller : chain) { + if (!controller.preSoftDelete(request)) { return false; } } @@ -150,15 +147,15 @@ public class ChainedBeanPersistController implements BeanPersistController { @Override public void preDelete(BeanDeleteIdRequest request) { - for (BeanPersistController aChain : chain) { - aChain.preDelete(request); + for (BeanPersistController controller : chain) { + controller.preDelete(request); } } @Override public boolean preInsert(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - if (!aChain.preInsert(request)) { + for (BeanPersistController controller : chain) { + if (!controller.preInsert(request)) { return false; } } @@ -167,8 +164,8 @@ public class ChainedBeanPersistController implements BeanPersistController { @Override public boolean preUpdate(BeanPersistRequest request) { - for (BeanPersistController aChain : chain) { - if (!aChain.preUpdate(request)) { + for (BeanPersistController controller : chain) { + if (!controller.preUpdate(request)) { return false; } } @@ -178,15 +175,10 @@ public class ChainedBeanPersistController implements BeanPersistController { /** * Helper to order the BeanPersistController's in a chain. */ - private static class Sorter implements Comparator { - + private static final class Sorter implements Comparator { @Override public int compare(BeanPersistController o1, BeanPersistController o2) { - - int i1 = o1.getExecutionOrder(); - int i2 = o2.getExecutionOrder(); - return Integer.compare(i1, i2); + return Integer.compare(o1.getExecutionOrder(), o2.getExecutionOrder()); } - } } 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..60b1a8bfe 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; /** @@ -25,7 +24,7 @@ public class ChainedBeanPersistListener implements BeanPersistListener { /** * Return the size of the chain. */ - protected int size() { + int size() { return chain.length; } @@ -62,7 +61,6 @@ public class ChainedBeanPersistListener implements BeanPersistListener { } else { List newList = new ArrayList<>(list); newList.add(c); - return new ChainedBeanPersistListener(newList); } } @@ -76,36 +74,35 @@ public class ChainedBeanPersistListener implements BeanPersistListener { } else { List newList = new ArrayList<>(list); newList.remove(c); - return new ChainedBeanPersistListener(newList); } } @Override public void deleted(Object bean) { - for (BeanPersistListener aChain : chain) { - aChain.deleted(bean); + for (BeanPersistListener listener : chain) { + listener.deleted(bean); } } @Override public void softDeleted(Object bean) { - for (BeanPersistListener aChain : chain) { - aChain.softDeleted(bean); + for (BeanPersistListener listener : chain) { + listener.softDeleted(bean); } } @Override public void inserted(Object bean) { - for (BeanPersistListener aChain : chain) { - aChain.inserted(bean); + for (BeanPersistListener listener : chain) { + listener.inserted(bean); } } @Override public void updated(Object bean, Set updatedProperties) { - for (BeanPersistListener aChain : chain) { - aChain.updated(bean, updatedProperties); + for (BeanPersistListener listener : chain) { + listener.updated(bean, updatedProperties); } } } 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..f143cb8a8 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; /** @@ -31,7 +30,6 @@ public class ChainedBeanPostConstructListener implements BeanPostConstructListen } else { List newList = new ArrayList<>(list); newList.add(c); - return new ChainedBeanPostConstructListener(newList); } } @@ -45,18 +43,10 @@ public class ChainedBeanPostConstructListener implements BeanPostConstructListen } else { ArrayList newList = new ArrayList<>(list); newList.remove(c); - return new ChainedBeanPostConstructListener(newList); } } - /** - * Return the size of the chain. - */ - protected int size() { - return chain.length; - } - @Override public boolean isRegisterFor(Class cls) { // never called @@ -68,22 +58,22 @@ public class ChainedBeanPostConstructListener implements BeanPostConstructListen */ @Override public void postConstruct(Object bean) { - for (BeanPostConstructListener aChain : chain) { - aChain.postConstruct(bean); + for (BeanPostConstructListener listener : chain) { + listener.postConstruct(bean); } } @Override public void autowire(Object bean) { - for (BeanPostConstructListener aChain : chain) { - aChain.autowire(bean); + for (BeanPostConstructListener listener : chain) { + listener.autowire(bean); } } @Override public void postCreate(Object bean) { - for (BeanPostConstructListener aChain : chain) { - aChain.postCreate(bean); + for (BeanPostConstructListener listener : chain) { + listener.postCreate(bean); } } } 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..f5803d81a 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; /** @@ -31,7 +30,6 @@ public class ChainedBeanPostLoad implements BeanPostLoad { } else { List newList = new ArrayList<>(list); newList.add(c); - return new ChainedBeanPostLoad(newList); } } @@ -45,18 +43,10 @@ public class ChainedBeanPostLoad implements BeanPostLoad { } else { List newList = new ArrayList<>(list); newList.remove(c); - return new ChainedBeanPostLoad(newList); } } - /** - * Return the size of the chain. - */ - protected int size() { - return chain.length; - } - @Override public boolean isRegisterFor(Class cls) { // never called @@ -68,8 +58,8 @@ public class ChainedBeanPostLoad implements BeanPostLoad { */ @Override public void postLoad(Object bean) { - for (BeanPostLoad aChain : chain) { - aChain.postLoad(bean); + for (BeanPostLoad postLoad : chain) { + postLoad.postLoad(bean); } } } 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..ef0aea684 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; /** @@ -38,7 +37,6 @@ public class ChainedBeanQueryAdapter implements BeanQueryAdapter { } else { List newList = new ArrayList<>(list); newList.add(c); - return new ChainedBeanQueryAdapter(newList); } } @@ -52,12 +50,10 @@ public class ChainedBeanQueryAdapter implements BeanQueryAdapter { } else { List newList = new ArrayList<>(list); newList.remove(c); - return new ChainedBeanQueryAdapter(newList); } } - /** * Return 0 as not used by this Chained adapter. */ @@ -76,9 +72,8 @@ public class ChainedBeanQueryAdapter implements BeanQueryAdapter { @Override public void preQuery(BeanQueryRequest request) { - - for (BeanQueryAdapter aChain : chain) { - aChain.preQuery(request); + for (BeanQueryAdapter adapter : chain) { + adapter.preQuery(request); } } @@ -86,11 +81,9 @@ public class ChainedBeanQueryAdapter implements BeanQueryAdapter { * Helper to order the BeanQueryAdapter's in a chain. */ private static class Sorter implements Comparator { - @Override public int compare(BeanQueryAdapter o1, BeanQueryAdapter o2) { return Integer.compare(o1.getExecutionOrder(), o2.getExecutionOrder()); } - } } 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..d8867e904 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,10 +2,9 @@ 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; - private final String name; public DCacheRegion(String name) { 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..d41f781f5 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; @@ -65,5 +65,4 @@ public class DbMigrationInfo { } } - } 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/DeployParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployParser.java index 9c5245e21..184e7ad18 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployParser.java @@ -35,21 +35,13 @@ public abstract class DeployParser { private static final char OPEN_BRACKET = '('; boolean encrypted; - private String source; - private StringBuilder sb; - private int sourceLength; - private int pos; - String priorWord; - String word; - private char wordTerminator; - private StringBuilder wordBuffer; protected abstract String convertWord(); @@ -66,16 +58,13 @@ public abstract class DeployParser { } public String parse(String source) { - if (source == null) { return null; } - pos = -1; this.source = source; this.sourceLength = source.length(); this.sb = new StringBuilder(source.length() + 20); - while (nextWord()) { if (skipWordConvert()) { sb.append(word); @@ -94,7 +83,6 @@ public abstract class DeployParser { } } } - return sb.toString(); } @@ -103,11 +91,9 @@ public abstract class DeployParser { } private boolean nextWord() { - if (!findWordStart()) { return false; } - wordBuffer = new StringBuilder(); wordBuffer.append(source.charAt(pos)); while (++pos < sourceLength) { @@ -119,9 +105,7 @@ public abstract class DeployParser { break; } } - word = wordBuffer.toString(); - return true; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployPropertyParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployPropertyParser.java index bf98172a2..419d1052e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployPropertyParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployPropertyParser.java @@ -15,15 +15,11 @@ import java.util.Set; public final class DeployPropertyParser extends DeployParser { private static final String JOIN = "join"; - private static final String FROM = "from"; private final BeanDescriptor beanDescriptor; - private final Set includes = new HashSet<>(); - private boolean catchFirst; - private ElPropertyDeploy firstProp; DeployPropertyParser(BeanDescriptor beanDescriptor) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployUpdateParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployUpdateParser.java index 716820922..638029647 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployUpdateParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DeployUpdateParser.java @@ -25,7 +25,6 @@ public final class DeployUpdateParser extends DeployParser { @Override public String convertWord() { - String dbWord = getDeployWord(word); if (dbWord != null) { return dbWord; @@ -35,10 +34,8 @@ public final class DeployUpdateParser extends DeployParser { } private String convertSubword(String currentWord) { - int start = 0; StringBuilder localBuffer = null; - while (true) { int dotPos = currentWord.indexOf('.', start); if (start == 0 && dotPos == -1) { @@ -76,11 +73,9 @@ public final class DeployUpdateParser extends DeployParser { @Override public String getDeployWord(String expression) { - if (expression.equalsIgnoreCase(beanDescriptor.getName())) { return beanDescriptor.getBaseTable(); } - ElPropertyDeploy elProp = beanDescriptor.getElPropertyDeploy(expression); return elProp != null ? elProp.getDbColumn() : null; } 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..0349ac196 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. @@ -28,7 +28,6 @@ class DetermineAggPath { * Parse and return the full path for the aggregation. */ static String path(String aggregation) { - // aggregations always have a form of sum(), avg(), max(), count() etc // so find the first open bracket int start = aggregation.indexOf('('); @@ -49,7 +48,6 @@ class DetermineAggPath { return ch == '.' || Character.isJavaIdentifierPart(ch); } - /** * Helper class holding aggregation path segments. */ 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/DynamicPropertyAggregationFormula.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java index 3bfa064b5..970145632 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java @@ -12,11 +12,8 @@ import javax.persistence.PersistenceException; class DynamicPropertyAggregationFormula extends DynamicPropertyBase { private final String parsedFormula; - private final boolean aggregate; - final BeanProperty asTarget; - private final String alias; DynamicPropertyAggregationFormula(String name, ScalarType scalarType, String parsedFormula, boolean aggregate, BeanProperty asTarget, String alias) { 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..b9a8f008d 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,8 @@ package io.ebeaninternal.server.deploy; import io.ebeaninternal.server.query.SqlBeanLoad; -public class DynamicPropertyAggregationFormulaMTO extends DynamicPropertyAggregationFormula { +@SuppressWarnings("rawtypes") +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 49dfccdc8..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) { 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..72db83564 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 @@ -7,14 +7,11 @@ import io.ebeaninternal.server.core.InternString; * The Exported foreign key and property. *

* 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) { @@ -44,7 +41,6 @@ class ExportedProperty { * in preference to a parentProperty.idProperty = value. * Just using the foreign database column avoids triggering * a join to the 'parent' table. - *

*/ public String getForeignDbColumn() { return foreignDbColumn; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java index 43c4dc872..bd294d145 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java @@ -13,19 +13,12 @@ final class FormulaPropertyPath { private static final String DISTINCT_ = "distinct "; private final BeanDescriptor descriptor; - private final String formula; - private final String outerFunction; - private final String internalExpression; - private final ElPropertyDeploy firstProp; - private final String parsedAggregation; - private boolean countDistinct; - private String cast; private String alias; @@ -36,7 +29,6 @@ final class FormulaPropertyPath { FormulaPropertyPath(BeanDescriptor descriptor, String formula, String path) { this.descriptor = descriptor; this.formula = formula; - int openBracket = formula.indexOf('('); int closeBracket = formula.lastIndexOf(')'); if (openBracket == -1 || closeBracket == -1) { @@ -49,7 +41,6 @@ final class FormulaPropertyPath { // ::CastType as foo parseSuffix(formula.substring(closeBracket + 1).trim()); } - DeployPropertyParser parser = descriptor.parser().setCatchFirst(true); String parsed = parser.parse(internalExpression); if (path != null) { @@ -105,7 +96,6 @@ final class FormulaPropertyPath { } STreeProperty build() { - if (cast != null) { ScalarType scalarType = descriptor.getScalarType(cast); if (scalarType == null) { @@ -122,7 +112,6 @@ final class FormulaPropertyPath { if (firstProp == null) { throw new IllegalStateException("unable to determine scalarType of formula [" + formula + "] for type " + descriptor + " - maybe use a cast like ::String ?"); } - // determine scalarType based on first property found by parser final BeanProperty property = firstProp.getBeanProperty(); if (!property.isAssocId()) { @@ -133,13 +122,12 @@ final class FormulaPropertyPath { } private DynamicPropertyAggregationFormula create(ScalarType scalarType) { - String logicalName = logicalName(); return new DynamicPropertyAggregationFormula(logicalName, scalarType, parsedAggregation, isAggregate(), target(logicalName), alias); } + @SuppressWarnings("rawtypes") private DynamicPropertyAggregationFormula createManyToOne(BeanProperty property) { - String logicalName = logicalName(); return new DynamicPropertyAggregationFormulaMTO((BeanPropertyAssocOne) property, logicalName, parsedAggregation, isAggregate(), target(logicalName), alias); } 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..2985170bf 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,61 +17,45 @@ 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)); this.discriminatorValue = deploy.getDiscriminatorObjectValue(); this.discriminatorStringValue = deploy.getDiscriminatorStringValue(); - this.discriminatorType = deploy.getDiscriminatorType(parent); this.discriminatorLength = deploy.getColumnLength(parent); this.columnDefn = deploy.getColumnDefn(); this.where = InternString.intern(deploy.getWhere()); - if (r == null) { // this is a root node root = this; discMap = new HashMap<>(); typeMap = new HashMap<>(); registerWithRoot(this); - } else { this.root = r; // register with the root node... @@ -85,7 +69,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 +79,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 +172,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 +180,6 @@ public class InheritInfo { return prop; } } - return null; } @@ -208,7 +187,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 +204,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 +218,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..bc325d2a5 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,26 +6,20 @@ 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. */ private final String localDbColumn; - private final String localSqlFormula; - /** * The foreign database column name. */ private final String foreignDbColumn; - private final String foreignSqlFormula; - private final boolean insertable; - private final boolean updateable; - /** * Hash for including in a query plan */ 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..e08582257 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,12 @@ 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 +26,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 +33,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..583a9b02e 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) { @@ -61,5 +61,4 @@ public class GeneratedInsertJodaTime { } - } 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..0f81b4060 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) { @@ -53,7 +45,6 @@ public class GeneratedPropertyFactory { generatedWhoCreated = null; generatedWhoModified = null; } - numberTypes.add(Integer.class.getName()); numberTypes.add(int.class.getName()); numberTypes.add(Long.class.getName()); @@ -63,7 +54,6 @@ public class GeneratedPropertyFactory { numberTypes.add(Double.class.getName()); numberTypes.add(double.class.getName()); numberTypes.add(BigDecimal.class.getName()); - if (idGenerators != null) { for (IdGenerator idGenerator : idGenerators) { idGeneratorMap.put(idGenerator.getName(), new CustomIdGenerator(idGenerator)); @@ -88,17 +78,14 @@ public class GeneratedPropertyFactory { } private void setCounter(DeployBeanProperty property) { - counterFactory.setCounter(property); } public void setInsertTimestamp(DeployBeanProperty property) { - insertFactory.setInsertTimestamp(property); } public void setUpdateTimestamp(DeployBeanProperty property) { - updateFactory.setUpdateTimestamp(property); } @@ -130,7 +117,7 @@ public class GeneratedPropertyFactory { /** * Wraps the custom IdGenerator to implement PlatformIdGenerator. */ - private static class CustomIdGenerator implements PlatformIdGenerator { + private static final class CustomIdGenerator implements PlatformIdGenerator { private final IdGenerator generator; @@ -159,7 +146,7 @@ public class GeneratedPropertyFactory { } } - private static class DummyCurrentUser implements CurrentUserProvider { + private static final class DummyCurrentUser implements CurrentUserProvider { @Override public Object currentUser() { throw new RuntimeException("never called"); 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..bb9dbc5f9 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<>(); @@ -25,7 +25,6 @@ class InsertTimestampFactory { GeneratedInsertLong longTime = new GeneratedInsertLong(); map.put(Long.class, longTime); map.put(long.class, longTime); - map.put(Instant.class, new GeneratedInsertJavaTime.InstantDT()); map.put(LocalDateTime.class, new GeneratedInsertJavaTime.LocalDT()); map.put(OffsetDateTime.class, new GeneratedInsertJavaTime.OffsetDT()); @@ -37,7 +36,6 @@ class InsertTimestampFactory { } void setInsertTimestamp(DeployBeanProperty property) { - property.setGeneratedProperty(createInsertTimestamp(property)); } @@ -45,13 +43,11 @@ class InsertTimestampFactory { * Create the insert GeneratedProperty depending on the property type. */ GeneratedProperty createInsertTimestamp(DeployBeanProperty property) { - Class propType = property.getPropertyType(); GeneratedProperty generatedProperty = map.get(propType); if (generatedProperty != null) { return generatedProperty; } - throw new PersistenceException("Generated Insert Timestamp not supported on " + propType.getName()); } 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..f8dc413b9 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<>(); @@ -25,12 +25,10 @@ class UpdateTimestampFactory { GeneratedUpdateLong longTime = new GeneratedUpdateLong(); map.put(Long.class, longTime); map.put(long.class, longTime); - map.put(Instant.class, new GeneratedUpdateJavaTime.InstantDT()); map.put(LocalDateTime.class, new GeneratedUpdateJavaTime.LocalDT()); map.put(OffsetDateTime.class, new GeneratedUpdateJavaTime.OffsetDT()); map.put(ZonedDateTime.class, new GeneratedUpdateJavaTime.ZonedDT()); - if (classLoadConfig.isJodaTimePresent()) { map.put(org.joda.time.LocalDateTime.class, new GeneratedUpdateJodaTime.LocalDT()); map.put(org.joda.time.DateTime.class, new GeneratedUpdateJodaTime.DateTimeDT()); @@ -38,7 +36,6 @@ class UpdateTimestampFactory { } void setUpdateTimestamp(DeployBeanProperty property) { - property.setGeneratedProperty(createUpdateTimestamp(property)); } @@ -46,13 +43,11 @@ class UpdateTimestampFactory { * Create the update GeneratedProperty depending on the property type. */ GeneratedProperty createUpdateTimestamp(DeployBeanProperty property) { - Class propType = property.getPropertyType(); GeneratedProperty generatedProperty = map.get(propType); if (generatedProperty != null) { return generatedProperty; } - throw new PersistenceException("Generated update Timestamp not supported on " + propType.getName()); } 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/IdBinderEmpty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java index 3c7785943..af3df49dc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java @@ -16,17 +16,15 @@ import java.util.List; /** * For beans with no id properties AKA report type beans. */ -public final class IdBinderEmpty implements IdBinder { +final class IdBinderEmpty implements IdBinder { private static final String bindIdSql = ""; public IdBinderEmpty() { - } @Override public void initialise() { - } @Override @@ -121,22 +119,18 @@ public final class IdBinderEmpty implements IdBinder { @Override public void bindId(DefaultSqlUpdate sqlUpdate, Object value) { - } @Override public void bindId(DataBind dataBind, Object value) { - } @Override public void addIdInBindValues(DefaultSqlUpdate sqlUpdate, Collection ids) { - } @Override public void addIdInBindValues(SpiExpressionRequest request, Collection ids) { - } @Override @@ -174,7 +168,6 @@ public final class IdBinderEmpty implements IdBinder { @Override public void writeData(DataOutput dataOutput, Object idValue) { - } @Override 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..2dd025cb3 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; @@ -56,7 +52,6 @@ public final class IdBinderSimple implements IdBinder { @Override public String getOrderBy(String pathPrefix, boolean ascending) { - StringBuilder sb = new StringBuilder(); if (pathPrefix != null) { sb.append(pathPrefix).append("."); 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..54581a1be 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) { @@ -34,9 +32,7 @@ public class ImportedIdEmbedded implements ImportedId { @Override public void addFkeys(String name) { - BeanProperty[] embeddedProps = foreignAssocOne.getProperties(); - for (int i = 0; i < imported.length; i++) { String n = name + "." + foreignAssocOne.getName() + "." + embeddedProps[i].getName(); BeanFkeyProperty fkey = new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.getDeployOrder()); @@ -63,7 +59,6 @@ public class ImportedIdEmbedded implements ImportedId { @Override public void dmlAppend(GenerateDmlRequest request) { - boolean update = request.isUpdate(); for (ImportedIdSimple anImported : imported) { if (anImported.isInclude(update)) { @@ -74,7 +69,6 @@ public class ImportedIdEmbedded implements ImportedId { @Override public String importedIdClause() { - StringBuilder sb = new StringBuilder(); for (int i = 0; i < imported.length; i++) { if (i > 0) { @@ -87,9 +81,7 @@ public class ImportedIdEmbedded implements ImportedId { @Override public int bind(int position, SqlUpdate update, EntityBean bean) { - int pos = position; - EntityBean embedded = (EntityBean) foreignAssocOne.getValue(bean); for (ImportedIdSimple anImported : imported) { if (anImported.owner.isUpdateable()) { @@ -102,9 +94,7 @@ public class ImportedIdEmbedded implements ImportedId { @Override public Object bind(BindableRequest request, EntityBean bean) throws SQLException { - Object embeddedId = (bean == null) ? null : foreignAssocOne.getValue(bean); - boolean update = request.isUpdate(); if (embeddedId == null) { for (ImportedIdSimple anImported : imported) { @@ -114,7 +104,6 @@ public class ImportedIdEmbedded implements ImportedId { } // return anything non-null to skip a derived relationship update return Object.class; - } else { EntityBean embedded = (EntityBean) embeddedId; for (ImportedIdSimple anImported : imported) { @@ -129,7 +118,6 @@ public class ImportedIdEmbedded implements ImportedId { @Override public void buildImport(IntersectionRow row, EntityBean other) { - EntityBean embeddedId = (EntityBean) foreignAssocOne.getValue(other); if (embeddedId == null) { throw new PersistenceException("Foreign Key value null?"); @@ -164,7 +152,6 @@ public class ImportedIdEmbedded implements ImportedId { */ @Override public BeanProperty findMatchImport(String matchDbColumn) { - for (ImportedIdSimple anImported : imported) { BeanProperty p = anImported.findMatchImport(matchDbColumn); if (p != null) { 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..362ea51cc 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, @@ -74,9 +62,7 @@ public final class ImportedIdSimple implements ImportedId, Comparable list) { - ImportedIdSimple[] importedIds = list.toArray(new ImportedIdSimple[0]); - // sort into the same order as the BeanProperties Arrays.sort(importedIds, COMPARATOR); return importedIds; @@ -136,13 +122,11 @@ public final class ImportedIdSimple implements ImportedId, Comparable { private static final String I_SCALAOBJECT = "scala.ScalaObject"; private final DatabaseConfig config; - private final BeanDescriptorManager manager; - /** * Map of BeanProperty Linked so as to preserve order. */ private LinkedHashMap propMap = new LinkedHashMap<>(); - private Map namedRawSql; - private Map namedQuery; - private EntityType entityType; - private DeployBeanPropertyAssocOne unidirectional; - private DeployBeanProperty orderColumn; - private Class idClass; - private DeployBeanPropertyAssocOne idClassProperty; - private DeployIdentityMode identityMode = DeployIdentityMode.auto(); - private PlatformIdGenerator idGenerator; - /** * Set true when explicit auto generated Id. */ private boolean idGeneratedValue; - /** * Used with Identity columns but no getGeneratedKeys support. */ private String selectLastInsertedId; private String selectLastInsertedIdDraft; - /** * The concurrency mode for beans of this type. */ private ConcurrencyMode concurrencyMode; - private List indexDefinitions; - private String storageEngine; - /** * The base database table. */ private String baseTable; - private String baseTableAsOf; - private String baseTableVersionsBetween; - private String draftTable; - private String[] dependentTables; - private boolean historySupport; - private boolean readAuditing; - private boolean draftable; - private boolean draftableElement; - private TableName baseTableFull; - private String[] properties; - /** * The EntityBean type used to create new EntityBeans. */ private final Class beanType; - private final List persistControllers = new ArrayList<>(); private final List persistListeners = new ArrayList<>(); private final List queryAdapters = new ArrayList<>(); private final List postLoaders = new ArrayList<>(); private final List postConstructListeners = new ArrayList<>(); - private CacheOptions cacheOptions = CacheOptions.NO_CACHING; - /** * If set overrides the find implementation. Server side only. */ private BeanFindController beanFinder; - /** * Inheritance information. Server side only. */ private InheritInfo inheritInfo; - private String name; - private ChangeLogFilter changeLogFilter; - private String dbComment; - private PartitionMeta partitionMeta; - /** * One of NONE, INDEX or EMBEDDED. */ private boolean docStoreMapped; - private DocStore docStore; - private PathProperties docStorePathProperties; - private String docStoreQueueId; - private String docStoreIndexName; - private String docStoreIndexType; - private DocStoreMode docStorePersist; private DocStoreMode docStoreInsert; private DocStoreMode docStoreUpdate; private DocStoreMode docStoreDelete; - private DeployBeanProperty idProperty; private TableJoin primaryKeyJoin; - private Object jacksonAnnotatedClass; /** 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 5e5455b2f..33d1bf266 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 @@ -55,170 +55,119 @@ public class DeployBeanProperty { * Flag to mark this at part of the unique id. */ private boolean id; - boolean importedPrimaryKey; - /** * Flag to mark the property as embedded. This could be on * BeanPropertyAssocOne rather than here. Put it here for checking Id type * (embedded or not). */ private boolean embedded; - /** * Flag indicating if this the version property. */ private boolean versionColumn; - private boolean fetchEager = true; - /** * Set if this property is nullable. */ private boolean nullable = true; - private boolean unique; - private boolean discriminator; - /** * The length or precision of the DB column. */ private int dbLength; - private int dbScale; - private String dbColumnDefn; - private boolean isTransient; - private boolean localEncrypted; - private boolean jsonSerialize = true; private boolean jsonDeserialize = true; private MutationDetection mutationDetection; - private boolean dbEncrypted; private DbEncryptFunction dbEncryptFunction; - private int dbEncryptedType; - private String dbBind = "?"; - /** * Is this property include in database resultSet. */ private boolean dbRead; - /** * Include this in DB insert. */ private boolean dbInsertable; - /** * Include this in a DB update. */ private boolean dbUpdateable; - private DeployTableJoin secondaryTableJoin; - private String secondaryTableJoinPrefix; - /** * Set to true if this property is based on a secondary table. */ private String secondaryTable; - /** * The type that owns this property. */ private Class owningType; - /** * True if the property is a Clob, Blob LongVarchar or LongVarbinary. */ private boolean lob; - private boolean naturalKey; - /** * The logical bean property name. */ private String name; - /** * The reflected field. */ private Field field; - /** * The bean type. */ private final Class propertyType; - private final Type genericType; - /** * Set for Non-JDBC types to provide logical to db type conversion. */ private ScalarType scalarType; - /** * The database column. This can include quoted identifiers. */ private String dbColumn; - private String aggregationPrefix; private String aggregation; private String aggregationParsed; - private String sqlFormulaSelect; private String sqlFormulaJoin; - /** * The jdbc data type this maps to. */ private int dbType; - private final DeployDocPropertyOptions docMapping = new DeployDocPropertyOptions(); - private int propertyIndex; - private BeanPropertyGetter getter; - private BeanPropertySetter setter; - /** * Generator for insert or update timestamp etc. */ private GeneratedProperty generatedProperty; - final DeployBeanDescriptor desc; - private boolean undirectionalShadow; - private boolean elementProperty; - private int sortOrder; - private boolean excludedFromHistory; - private boolean tenantId; - private boolean draft; private boolean draftOnly; private boolean draftDirty; private boolean draftReset; - private boolean softDelete; private boolean unmappedJson; - private String dbComment; - private String dbColumnDefault; - private List dbMigrationInfos; - private Set metaAnnotations; public DeployBeanProperty(DeployBeanDescriptor desc, Class propertyType, ScalarType scalarType, ScalarTypeConverter typeConverter) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java index be4b77aa0..3461be3bd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java @@ -13,38 +13,29 @@ public abstract class DeployBeanPropertyAssoc extends DeployBeanProperty { * The type of the joined bean. */ Class targetType; - /** * Persist settings. */ final BeanCascadeInfo cascadeInfo = new BeanCascadeInfo(); - /** * The join table information. */ private BeanTable beanTable; - /** * Join between the beans. */ final DeployTableJoin tableJoin = new DeployTableJoin(); - /** * Literal added to where clause of lazy loading query. */ private String extraWhere; - /** * From the deployment mappedBy attribute. */ private String mappedBy; - private String docStoreDoc; - private int fetchPreference = 1000; - private PropertyForeignKey foreignKey; - boolean orphanRemoval; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocMany.java index 606a6d215..c201308e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssocMany.java @@ -17,41 +17,29 @@ public class DeployBeanPropertyAssocMany extends DeployBeanPropertyAssoc { * The type of the many, set, list or map. */ private final ManyType manyType; - ModifyListenMode modifyListenMode = ModifyListenMode.NONE; - /** * Flag to indicate manyToMany relationship. */ private boolean manyToMany; - private boolean o2mJoinTable; - private boolean elementCollection; - /** * Flag to indicate this is a unidirectional relationship. */ private boolean unidirectional; - /** * Join for manyToMany intersection table. */ private DeployTableJoin intersectionJoin; - /** * For ManyToMany this is the Inverse join used to build reference queries. */ private DeployTableJoin inverseJoin; - private String fetchOrderBy; - private String mapKey; - private String intersectionDraftTable; - private DeployOrderColumn orderColumn; - /** * Effectively the dynamically created target descriptor (that doesn't have a mapped type/class per say). */ 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..7f41c028c 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,18 +7,13 @@ import javax.persistence.CascadeType; /** * Property mapped to a joined bean. */ -public class DeployBeanPropertyAssocOne extends DeployBeanPropertyAssoc { +public final class DeployBeanPropertyAssocOne extends DeployBeanPropertyAssoc { private boolean oneToOne; - private boolean oneToOneExported; - private boolean primaryKeyJoin; - private boolean primaryKeyExport; - private DeployBeanEmbedded deployEmbedded; - private String columnPrefix; /** 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 5466d5bca..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 @@ -15,7 +15,7 @@ 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); 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..289b5f471 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,15 +13,13 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; * in a BeanDescriptor. *

*/ -public class DeployBeanTable { +public final class DeployBeanTable { private final Class beanType; - /** * The base table. */ private String baseTable; - private DeployBeanProperty idProperty; /** 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..8a56e8a82 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,25 +15,21 @@ import java.util.Set; * This gets converted into a immutable TableJoin when complete. *

*/ -public class DeployTableJoin { +public final class DeployTableJoin { /** * The joined table. */ private String table; - /** * The type of join. LEFT JOIN etc. */ private SqlJoinType type = SqlJoinType.INNER; - /** * The list of join column pairs. Used to generate the on clause. */ private ArrayList columns = new ArrayList<>(4); - private InheritInfo inheritInfo; - private String extraWhere; /** @@ -146,11 +142,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..7bd82c709 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,30 +8,25 @@ import javax.persistence.JoinColumn; /** * A join pair of local and foreign properties. */ -public class DeployTableJoinColumn { +public final class DeployTableJoinColumn { /** * The local database column name. */ private String localDbColumn; - /** * SQL formula used for local column */ private String localSqlFormula; - /** * The foreign database column name. */ private String foreignDbColumn; - /** * SQL formula used for foreign column */ private String foreignSqlFormula; - private boolean insertable; - private boolean updateable; /** 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..804533565 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); @@ -69,7 +69,6 @@ class AnnotationAssocManys extends AnnotationAssoc { } private void read(DeployBeanPropertyAssocMany prop) { - OneToMany oneToMany = get(prop, OneToMany.class); if (oneToMany != null) { readToOne(oneToMany, prop); @@ -105,27 +104,22 @@ class AnnotationAssocManys extends AnnotationAssoc { if (get(prop, HistoryExclude.class) != null) { prop.setExcludedFromHistory(); } - OrderBy orderBy = get(prop, OrderBy.class); if (orderBy != null) { prop.setFetchOrderBy(orderBy.value()); } - MapKey mapKey = get(prop, MapKey.class); if (mapKey != null) { prop.setMapKey(mapKey.name()); } - Where where = prop.getMetaAnnotationWhere(platform); if (where != null) { prop.setExtraWhere(processFormula(where.clause())); } - FetchPreference fetchPreference = get(prop, FetchPreference.class); if (fetchPreference != null) { prop.setFetchPreference(fetchPreference.value()); } - // check for manually defined joins BeanTable beanTable = prop.getBeanTable(); @@ -147,31 +141,24 @@ class AnnotationAssocManys extends AnnotationAssoc { } else if (prop.isManyToMany()) { checkSelfManyToMany(prop); } - if (prop.getMappedBy() != null) { // the join is derived by reversing the join information // from the mapped by property. // Refer BeanDescriptorManager.readEntityRelationships() return; } - if (prop.isManyToMany()) { manyToManyDefaultJoins(prop); return; } - if (!prop.getTableJoin().hasJoinColumns() && beanTable != null) { - // use naming convention to define join (based on the bean name for this side of relationship) // A unidirectional OneToMany or OneToMany with no mappedBy property - NamingConvention nc = factory.getNamingConvention(); - String fkeyPrefix = null; if (nc.isUseForeignKeyPrefix()) { fkeyPrefix = nc.getColumnFromProperty(descriptor.getBeanType(), descriptor.getName()); } - // Use the owning bean table to define the join BeanTable owningBeanTable = factory.getBeanTable(descriptor.getBeanType()); owningBeanTable.createJoinColumn(fkeyPrefix, prop.getTableJoin(), false, prop.getSqlFormulaSelect()); @@ -186,7 +173,6 @@ class AnnotationAssocManys extends AnnotationAssoc { @SuppressWarnings("unchecked") private void readElementCollection(DeployBeanPropertyAssocMany prop, ElementCollection elementCollection) { - prop.setElementCollection(); if (!elementCollection.targetClass().equals(void.class)) { prop.setTargetType(elementCollection.targetClass()); @@ -199,7 +185,6 @@ class AnnotationAssocManys extends AnnotationAssoc { } CollectionTable collectionTable = get(prop, CollectionTable.class); - String fullTableName = getFullTableName(collectionTable); if (fullTableName == null) { fullTableName = descriptor.getBaseTable()+"_"+ CamelCaseHelper.toUnderscoreFromCamel(prop.getName()); @@ -288,7 +273,6 @@ class AnnotationAssocManys extends AnnotationAssoc { } private void setElementProperty(DeployBeanProperty elementProp, String name, String dbColumn, int sortOrder) { - if (dbColumn == null) { dbColumn = "value"; } @@ -310,7 +294,6 @@ class AnnotationAssocManys extends AnnotationAssoc { *

*/ private void readJoinTable(JoinTable joinTable, DeployBeanPropertyAssocMany prop) { - String intTableName = getFullTableName(joinTable); if (intTableName.isEmpty()) { BeanTable localTable = factory.getBeanTable(descriptor.getBeanType()); @@ -369,9 +352,7 @@ class AnnotationAssocManys extends AnnotationAssoc { *

*/ private void manyToManyDefaultJoins(DeployBeanPropertyAssocMany prop) { - String intTableName = null; - DeployTableJoin intJoin = prop.getIntersectionJoin(); if (intJoin == null) { intJoin = new DeployTableJoin(); @@ -396,8 +377,6 @@ class AnnotationAssocManys extends AnnotationAssoc { } DeployTableJoin destJoin = prop.getTableJoin(); - - if (intJoin.hasJoinColumns() && destJoin.hasJoinColumns()) { // already defined the foreign key columns etc return; @@ -448,7 +427,6 @@ class AnnotationAssocManys extends AnnotationAssoc { } private String getM2MJoinTableName(BeanTable lhsTable, BeanTable rhsTable) { - TableName lhs = new TableName(lhsTable.getBaseTable()); TableName rhs = new TableName(rhsTable.getBaseTable()); TableName joinTable = namingConvention.getM2MJoinTableName(lhs, rhs); 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..6580d841e 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); @@ -231,11 +231,9 @@ public class AnnotationAssocOnes extends AnnotationAssoc { if (!primaryKeyJoin.referencedColumnName().isEmpty()) { log.info("Automatically determining join columns for @PrimaryKeyJoinColumn - Ignoring PrimaryKeyJoinColumn.referencedColumnName attribute [{}] on {}", primaryKeyJoin.referencedColumnName(), prop.getFullBeanName()); } - BeanTable baseBeanTable = factory.getBeanTable(info.getDescriptor().getBeanType()); String localPrimaryKey = baseBeanTable.getIdColumn(); String foreignColumn = getBeanTable(prop).getIdColumn(); - prop.getTableJoin().addJoinColumn(new DeployTableJoinColumn(localPrimaryKey, foreignColumn, false, false)); } 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..4bdf03d5b 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,14 +36,12 @@ 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); private final String asOfViewSuffix; - private final String versionsBetweenSuffix; - private final boolean disableL2Cache; /** @@ -88,7 +86,6 @@ public class AnnotationClass extends AnnotationParser { * Set the table name if it has not already been set. */ private void setTableName() { - if (descriptor.isBaseTableType()) { Class beanType = descriptor.getBeanType(); InheritInfo inheritInfo = descriptor.getInheritInfo(); @@ -109,7 +106,6 @@ public class AnnotationClass extends AnnotationParser { descriptor.setEntityType(EntityType.DOC); descriptor.setName(cls.getSimpleName()); } - Entity entity = typeGet(cls, Entity.class); if (entity != null) { descriptor.setEntityType(EntityType.ORM); @@ -119,12 +115,10 @@ public class AnnotationClass extends AnnotationParser { descriptor.setName(entity.name()); } } - Identity identity = typeGet(cls, Identity.class); if (identity != null) { descriptor.setIdentityMode(identity); } - IdClass idClass = typeGet(cls, IdClass.class); if (idClass != null) { descriptor.setIdClass(idClass.value()); @@ -135,7 +129,6 @@ public class AnnotationClass extends AnnotationParser { descriptor.setEntityType(EntityType.EMBEDDED); descriptor.setName("Embeddable:" + cls.getSimpleName()); } - for (Index index : annotationClassIndexes(cls)) { descriptor.addIndex(new IndexDefinition(convertColumnNames(index.columnNames()), index.name(), index.unique(), index.platforms(), index.concurrent(), index.definition())); @@ -145,7 +138,6 @@ public class AnnotationClass extends AnnotationParser { if (uc != null) { descriptor.addIndex(new IndexDefinition(convertColumnNames(uc.columnNames()))); } - View view = typeGet(cls, View.class); if (view != null) { descriptor.setView(view.name(), view.dependentTables()); @@ -157,42 +149,34 @@ public class AnnotationClass extends AnnotationParser { descriptor.addIndex(new IndexDefinition(convertColumnNames(c.columnNames()))); } } - StorageEngine storage = typeGet(cls, StorageEngine.class); if (storage != null) { descriptor.setStorageEngine(storage.value()); } - DbPartition partition = typeGet(cls, DbPartition.class); if (partition != null) { descriptor.setPartitionMeta(new PartitionMeta(partition.mode(), partition.property())); } - Draftable draftable = typeGet(cls, Draftable.class); if (draftable != null) { descriptor.setDraftable(); } - DraftableElement draftableElement = typeGet(cls, DraftableElement.class); if (draftableElement != null) { descriptor.setDraftableElement(); } - ReadAudit readAudit = typeGet(cls, ReadAudit.class); if (readAudit != null) { descriptor.setReadAuditing(); } - History history = typeGet(cls, History.class); if (history != null) { descriptor.setHistorySupport(); } - DbComment comment = typeGet(cls, DbComment.class); if (comment != null) { descriptor.setDbComment(comment.value()); } - if (!disableL2Cache) { Cache cache = typeGet(cls, Cache.class); if (cache != null) { @@ -204,7 +188,6 @@ public class AnnotationClass extends AnnotationParser { } } } - for (NamedQuery namedQuery : annotationClassNamedQuery(cls)) { descriptor.addNamedQuery(namedQuery.name(), namedQuery.query()); } 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/AnnotationParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java index ea880a18b..3e11d738e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java @@ -20,11 +20,8 @@ import java.util.UUID; public abstract class AnnotationParser extends AnnotationBase { final DeployBeanInfo info; - final DeployBeanDescriptor descriptor; - final Class beanType; - final ReadAnnotationConfig readConfig; AnnotationParser(DeployBeanInfo info, ReadAnnotationConfig readConfig) { @@ -83,7 +80,6 @@ public abstract class AnnotationParser extends AnnotationBase { * Read an AttributeOverrides if they exist for this embedded bean. */ void readEmbeddedAttributeOverrides(DeployBeanPropertyAssocOne prop) { - Set attrOverrides = annotationAttributeOverrides(prop); if (!attrOverrides.isEmpty()) { Map propMap = new HashMap<>(attrOverrides.size()); 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..70a7e666a 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,12 +9,10 @@ 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; - private final DeployBeanDescriptor descriptor; - private DeployBeanPropertyAssoc embeddedId; /** 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..84a0649a1 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,12 +35,11 @@ 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); private final DetermineManyType determineManyType; - private final TypeManager typeManager; public DeployCreateProperties(TypeManager typeManager) { @@ -82,15 +81,12 @@ public class DeployCreateProperties { * columns. */ private void createProperties(DeployBeanDescriptor desc, Class beanType, int level) { - if (beanType.equals(Model.class)) { // ignore all fields on model (_$dbName) return; } - try { Field[] fields = beanType.getDeclaredFields(); - for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (!ignoreField(field)) { @@ -112,16 +108,13 @@ public class DeployCreateProperties { } Class superClass = beanType.getSuperclass(); - if (!superClass.equals(Object.class)) { // recursively add any properties in the inheritance hierarchy // up to the Object.class level... createProperties(desc, superClass, level + 1); } - } catch (PersistenceException ex) { throw ex; - } catch (Exception ex) { throw new PersistenceException(ex); } @@ -129,7 +122,6 @@ public class DeployCreateProperties { @SuppressWarnings({"unchecked"}) private DeployBeanProperty createManyType(DeployBeanDescriptor desc, Class targetType, ManyType manyType) { - try { ScalarType scalarType = typeManager.getScalarType(targetType); if (scalarType != null) { @@ -143,12 +135,10 @@ public class DeployCreateProperties { @SuppressWarnings({"unchecked"}) private DeployBeanProperty createProp(DeployBeanDescriptor desc, Field field) { - Class propertyType = field.getType(); if (isSpecialScalarType(field)) { return new DeployBeanProperty(desc, propertyType, field.getGenericType()); } - // check for Collection type (list, set or map) ManyType manyType = determineManyType.getManyType(propertyType); if (manyType != null) { @@ -163,16 +153,13 @@ public class DeployCreateProperties { } return createManyType(desc, targetType, manyType); } - if (propertyType.isEnum() || propertyType.isPrimitive()) { return new DeployBeanProperty(desc, propertyType, null, null); } - ScalarType scalarType = typeManager.getScalarType(propertyType); if (scalarType != null) { return new DeployBeanProperty(desc, propertyType, scalarType, null); } - if (isTransientField(field)) { // return with no ScalarType (still support JSON features) return new DeployBeanProperty(desc, propertyType, null, null); @@ -219,11 +206,9 @@ public class DeployCreateProperties { * ParameterizedType. */ private Class determineTargetType(Field field) { - Type genType = field.getGenericType(); if (genType instanceof ParameterizedType) { ParameterizedType ptype = (ParameterizedType) genType; - Type[] typeArgs = ptype.getActualTypeArguments(); if (typeArgs.length == 1) { // expecting set or list 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..2dd13f993 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,12 +15,11 @@ import java.util.Map; /** * Builds the InheritInfo deployment information. */ -public class DeployInherit { +public final class DeployInherit { private final Map, DeployInheritInfo> deployMap = new LinkedHashMap<>(); private final Map, InheritInfo> finalMap = new LinkedHashMap<>(); - private final BootupClasses bootupClasses; /** @@ -37,26 +36,21 @@ public class DeployInherit { } private void initialise() { - List> entityList = bootupClasses.getEntities(); - - findInheritClasses(entityList); + findInheritClasses(bootupClasses.getEntities()); buildDeployTree(); buildFinalTree(); } private void findInheritClasses(List> entityList) { - // go through each class and initialise the info object... for (Class cls : entityList) { if (isInheritanceClass(cls)) { - DeployInheritInfo info = createInfo(cls); - deployMap.put(cls, info); + deployMap.put(cls, createInfo(cls)); } } } private void buildDeployTree() { - for (DeployInheritInfo info : deployMap.values()) { if (!info.isRoot()) { DeployInheritInfo parent = getInfo(info.getParent()); @@ -66,7 +60,6 @@ public class DeployInherit { } private void buildFinalTree() { - for (DeployInheritInfo deploy : deployMap.values()) { if (deploy.isRoot()) { // build tree top down... @@ -76,17 +69,14 @@ public class DeployInherit { } private void createFinalInfo(InheritInfo root, InheritInfo parent, DeployInheritInfo deploy) { - InheritInfo node = new InheritInfo(root, parent, deploy); if (parent != null) { parent.addChild(node); } finalMap.put(node.getType(), node); - if (root == null) { root = node; } - // buildFinalChildren(root, child, deploy); for (DeployInheritInfo childDeploy : deploy.children()) { createFinalInfo(root, node, childDeploy); @@ -101,9 +91,7 @@ public class DeployInherit { } private DeployInheritInfo createInfo(Class cls) { - DeployInheritInfo info = new DeployInheritInfo(cls); - Class parent = findParent(cls); if (parent != null) { info.setParent(parent); @@ -121,7 +109,6 @@ public class DeployInherit { info.setColumnLength(da.length()); info.setColumnDefn(da.columnDefinition()); } - if (!info.isAbstract()) { DiscriminatorValue dv = AnnotationUtil.get(cls, DiscriminatorValue.class); // do not search recursive if (dv != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java index fb1a65a54..f82daa987 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. @@ -21,16 +21,12 @@ public class DeployInheritInfo { private String discriminatorStringValue; private Object discriminatorObjectValue; - private int columnType; private String columnName; private int columnLength; private String columnDefn; - private final Class type; - private Class parent; - private final ArrayList children = new ArrayList<>(); /** @@ -207,7 +203,6 @@ public class DeployInheritInfo { } public String getWhere() { - List discList = new ArrayList<>(); appendDiscriminator(discList); return buildWhereLiteral(discList); 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 68cb1c741..74a7bd5b5 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 @@ -26,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. @@ -42,17 +42,11 @@ public class DeployUtil { private static final int DEFAULT_JSON_VARCHAR_LENGTH = 3000; private final NamingConvention namingConvention; - private final TypeManager typeManager; - private final DatabasePlatform dbPlatform; - private final EncryptDeployManager encryptDeployManager; - private final EncryptKeyManager encryptKeyManager; - private final Encryptor bytesEncryptor; - private final boolean useValidationNotNull; public DeployUtil(TypeManager typeMgr, DatabaseConfig config) { @@ -101,7 +95,6 @@ public class DeployUtil { @SuppressWarnings("unchecked") void setEnumScalarType(Enumerated enumerated, DeployBeanProperty prop) { - Class enumType = prop.getPropertyType(); if (!enumType.isEnum()) { throw new IllegalArgumentException("Class [" + enumType + "] is Not a Enum?"); @@ -112,7 +105,6 @@ public class DeployUtil { ScalarType scalarType = typeManager.createEnumScalarType(enumClass, type); prop.setScalarType(scalarType); prop.setDbType(scalarType.getJdbcType()); - } catch (IllegalStateException e) { throw new PersistenceException("Error mapping property " + prop.getFullBeanName() + " - " + e.getMessage()); } @@ -126,13 +118,11 @@ public class DeployUtil { *

*/ public void setScalarType(DeployBeanProperty property) { - if (property.getScalarType() != null) { // already has a ScalarType assigned. // this will be an Enum type... return; } - ScalarType scalarType = getScalarType(property); if (scalarType != null) { // set the jdbc type this maps to @@ -143,7 +133,6 @@ public class DeployUtil { } private ScalarType getScalarType(DeployBeanProperty property) { - // Note that Temporal types already have dbType // set via annotations Class propType = property.getPropertyType(); @@ -166,7 +155,6 @@ public class DeployUtil { * Map to Postgres HSTORE type (with fallback to JSON storage in VARCHAR). */ void setDbMap(DeployBeanProperty prop, DbMap dbMap) { - ScalarType scalarType = typeManager.getDbMapScalarType(); int dbType = scalarType.getJdbcType(); prop.setDbType(dbType); @@ -183,7 +171,6 @@ public class DeployUtil { * Set the DbArray type (effectively Postgres only). */ void setDbArray(DeployBeanProperty prop, DbArray dbArray) { - Class type = prop.getPropertyType(); ScalarType scalarType = typeManager.getArrayScalarType(type, dbArray, prop.getGenericType(), prop.isNullable()); if (scalarType == null) { @@ -233,7 +220,6 @@ public class DeployUtil { * Return the JDBC type for the JSON storage type. */ private int getDbJsonStorage(DbJsonType dbJsonType) { - switch (dbJsonType) { case JSONB: return DbPlatformType.JSONB; @@ -252,9 +238,7 @@ public class DeployUtil { * This property is marked as a Lob object. */ void setLobType(DeployBeanProperty prop) { - ScalarType scalarType = prop.getScalarType(); - if (scalarType instanceof ScalarTypeWrapper) { int lobType = scalarType.getJdbcType() == Types.VARCHAR ? dbCLOBType : dbBLOBType; prop.setDbType(lobType); 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..3d8932933 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; @@ -43,19 +43,14 @@ public class ReadAnnotations { *

*/ public void readAssociations(DeployBeanInfo info, BeanDescriptorManager factory) { - try { - new AnnotationAssocOnes(info, readConfig, factory).parse(); new AnnotationAssocManys(info, readConfig, factory).parse(); - // read the Sql annotations last because they may be // dependent on field level annotations new AnnotationSql(info, readConfig).parse(); - new AnnotationClass(info, readConfig).parseAttributeOverride(); info.getDescriptor().postAnnotations(); - } catch (RuntimeException e) { throw new RuntimeException("Error reading annotations for " + info, e); } 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/deploy/visitor/VisitProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java index 5363b0add..70f05a6dc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java @@ -25,19 +25,15 @@ public class VisitProperties { if (idProp != null) { visit(propertyVisitor, idProp); } - BeanPropertyAssocOne unidirectional = desc.getUnidirectional(); if (unidirectional != null) { visit(propertyVisitor, unidirectional); } - - BeanProperty[] propertiesNonTransient = desc.propertiesNonTransient(); - for (BeanProperty p : propertiesNonTransient) { + for (BeanProperty p : desc.propertiesNonTransient()) { if (p.isDDLColumn()) { visit(propertyVisitor, p); } } - visitInheritanceProperties(desc, propertyVisitor); propertyVisitor.visitEnd(); } @@ -46,7 +42,6 @@ public class VisitProperties { * Visit the property. */ protected void visit(BeanPropertyVisitor pv, BeanProperty p) { - if (p instanceof BeanPropertyAssocMany) { // oneToMany or manyToMany pv.visitMany((BeanPropertyAssocMany) p); @@ -60,16 +55,13 @@ public class VisitProperties { for (BeanProperty embProp : embProps) { pv.visitEmbeddedScalar(embProp, assocOne); } - } else if (assocOne.isOneToOneExported()) { // associated one exported pv.visitOneExported(assocOne); - } else { // associated one imported pv.visitOneImported(assocOne); } - } else { // simple scalar type pv.visitScalar(p, true); @@ -81,7 +73,6 @@ public class VisitProperties { * Visit all the other inheritance properties that are not on the root. */ protected void visitInheritanceProperties(BeanDescriptor descriptor, BeanPropertyVisitor pv) { - InheritInfo inheritInfo = descriptor.getInheritInfo(); if (inheritInfo != null && inheritInfo.isRoot()) { // add all properties on the children objects diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java index 10f2a2cdc..041ac7d45 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java @@ -8,14 +8,11 @@ import java.util.concurrent.ConcurrentHashMap; /** * Manages the query plans for a given DTO bean type. */ -public class DtoBeanDescriptor { +public final class DtoBeanDescriptor { private final Map plans = new ConcurrentHashMap<>(); - private final Class dtoType; - private final DtoMeta meta; - private final Map namedQueries; DtoBeanDescriptor(Class dtoType, DtoMeta meta, Map namedQueries) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java index 4388a180d..c11f79843 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoBeanManager.java @@ -10,14 +10,13 @@ import java.util.concurrent.ConcurrentHashMap; /** * Manages all the DTO bean descriptors. */ -public class DtoBeanManager { +@SuppressWarnings("rawtypes") +public final class DtoBeanManager { private static final Map EMPTY_NAMED_QUERIES = new HashMap<>(); private final TypeManager typeManager; - private final Map, DtoNamedQueries> namedQueries; - private final Map descriptorMap = new ConcurrentHashMap<>(); public DtoBeanManager(TypeManager typeManager, Map, DtoNamedQueries> namedQueries) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java index 187caf97f..9f42f2d0f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoColumn.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.dto; /** * A column in the resultSet that we want to map to a bean property. */ -public class DtoColumn { +public final class DtoColumn { private final String label; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java index b2a72db61..8c882599c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java @@ -8,18 +8,13 @@ import io.ebeaninternal.api.SpiDtoQuery; /** * Request to map a resultSet columns for a query into a DTO bean. */ -public class DtoMappingRequest { +public final class DtoMappingRequest { private final Class type; - private final String label; - private final ProfileLocation profileLocation; - private final String sql; - private final boolean relaxedMode; - private final DtoColumn[] columnMeta; public DtoMappingRequest(SpiDtoQuery query, String sql, DtoColumn[] columnMeta) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java index 09bc441e9..9582c160e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java @@ -10,23 +10,19 @@ import java.util.Map; * * Uses this to map a mapping request (columns) to a 'query plan' (constructor and setters). */ -class DtoMeta { +final class DtoMeta { private final Class dtoType; private final Map propMap = new LinkedHashMap<>(); - private final Map constructorMap = new LinkedHashMap<>(); - private final DtoMetaConstructor defaultConstructor; private final DtoMetaConstructor maxArgConstructor; DtoMeta(Class dtoType, List constructors, List properties) { this.dtoType = dtoType; - for (DtoMetaProperty property : properties) { propMap.put(property.getName().toUpperCase(), property); } - int maxArg = 0; DtoMetaConstructor defaultConstructor = null; @@ -47,9 +43,7 @@ class DtoMeta { } public DtoQueryPlan match(DtoMappingRequest request) { - DtoColumn[] cols = request.getColumnMeta(); - int colLen = cols.length; DtoMetaConstructor constructor = constructorMap.get(colLen); if (constructor != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java index bc5f900ed..0241c2747 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java @@ -15,16 +15,13 @@ import java.util.List; *

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

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

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

*/ -public abstract class AbstractTextExpression extends AbstractExpression { +abstract class AbstractTextExpression extends AbstractExpression { AbstractTextExpression(String propName) { super(propName); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java index 7adb2729b..a758dcd10 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractValueExpression.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression; /** * Abstract expression that helps with named parameter use. */ -public abstract class AbstractValueExpression extends AbstractExpression { +abstract class AbstractValueExpression extends AbstractExpression { protected final Object bindValue; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java index 56761dcf2..fafb3bc96 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java @@ -13,7 +13,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -class AllEqualsExpression extends NonPrepareExpression { +final class AllEqualsExpression extends NonPrepareExpression { private final Map propMap; @@ -21,7 +21,7 @@ class AllEqualsExpression extends NonPrepareExpression { this.propMap = propMap; } - protected String name(String propName) { + String name(String propName) { return propName; } @@ -56,7 +56,6 @@ class AllEqualsExpression extends NonPrepareExpression { @Override public void addBindValues(SpiExpressionRequest request) { - if (propMap.isEmpty()) { return; } @@ -70,23 +69,17 @@ class AllEqualsExpression extends NonPrepareExpression { @Override public void addSql(SpiExpressionRequest request) { - if (propMap.isEmpty()) { return; } - request.append("("); - int count = 0; for (Map.Entry entry : propMap.entrySet()) { - Object value = entry.getValue(); String propName = entry.getKey(); - if (count > 0) { request.append("and "); } - request.append(name(propName)); if (value == null) { request.append(" is null "); @@ -106,7 +99,6 @@ class AllEqualsExpression extends NonPrepareExpression { */ @Override public void queryPlanHash(StringBuilder builder) { - builder.append("AllEquals["); for (Entry entry : propMap.entrySet()) { Object value = entry.getValue(); @@ -135,20 +127,16 @@ class AllEqualsExpression extends NonPrepareExpression { if (!(other instanceof AllEqualsExpression)) { return false; } - AllEqualsExpression that = (AllEqualsExpression) other; return isSameByValue(that, true); } private boolean isSameByValue(AllEqualsExpression that, boolean byValue) { - if (propMap.size() != that.propMap.size()) { return false; } - Iterator> thisIt = propMap.entrySet().iterator(); Iterator> thatIt = that.propMap.entrySet().iterator(); - while (thisIt.hasNext() && thatIt.hasNext()) { Entry thisNext = thisIt.next(); Entry thatNext = thatIt.next(); @@ -160,7 +148,6 @@ class AllEqualsExpression extends NonPrepareExpression { return false; } } - return true; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java index 7a9e903f6..34fec6037 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java @@ -9,10 +9,9 @@ import java.io.IOException; /** * Contains expression for ARRAY type. */ -public class ArrayContainsExpression extends AbstractExpression { +final class ArrayContainsExpression extends AbstractExpression { private final boolean contains; - private final Object[] values; ArrayContainsExpression(String propName, boolean contains, Object... values) { @@ -26,7 +25,6 @@ public class ArrayContainsExpression extends AbstractExpression { @Override public void writeDocQuery(DocQueryContext context) throws IOException { - if (values.length == 1) { context.writeEqualTo(propName, values[0]); } else { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java index f9cd530c8..2234f9500 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java @@ -9,7 +9,7 @@ import java.io.IOException; /** * IsEmpty expression for ARRAY type. */ -public class ArrayIsEmptyExpression extends AbstractExpression { +final class ArrayIsEmptyExpression extends AbstractExpression { private final boolean empty; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java index ed3d58d8b..be113e7a5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java @@ -6,12 +6,11 @@ import io.ebeaninternal.api.SpiExpressionRequest; import java.io.IOException; -class BetweenExpression extends AbstractExpression { +final class BetweenExpression extends AbstractExpression { private static final String _BETWEEN = " between ? and ?"; private final Object valueHigh; - private final Object valueLow; BetweenExpression(String propertyName, Object valueLow, Object valueHigh) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java index 55b08380d..74129849d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java @@ -14,7 +14,7 @@ import java.io.IOException; /** * Between expression where a value is between two properties. */ -class BetweenPropertyExpression extends NonPrepareExpression { +final class BetweenPropertyExpression extends NonPrepareExpression { private static final String BETWEEN = " between "; @@ -34,7 +34,7 @@ class BetweenPropertyExpression extends NonPrepareExpression { this.highProperty = path + "." + highProperty; } - protected String name(String propName) { + String name(String propName) { return propName; } @@ -62,12 +62,10 @@ class BetweenPropertyExpression extends NonPrepareExpression { @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - ElPropertyDeploy elProp = desc.getElPropertyDeploy(name(lowProperty)); if (elProp != null && elProp.containsMany()) { manyWhereJoin.add(elProp); } - elProp = desc.getElPropertyDeploy(name(highProperty)); if (elProp != null && elProp.containsMany()) { manyWhereJoin.add(elProp); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java index 460af37ec..aa68f2662 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java @@ -9,14 +9,11 @@ import java.io.IOException; /** * Bitwise expression. */ -class BitwiseExpression extends AbstractExpression { - - protected final BitwiseOp operator; +final class BitwiseExpression extends AbstractExpression { + private final BitwiseOp operator; private final String compare; - - protected final long flags; - + private final long flags; private final long match; BitwiseExpression(String propertyName, BitwiseOp operator, long flags, String compare, long match) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java index 3a6224d9c..a8075090a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class CaseInsensitiveEqualExpression extends AbstractValueExpression { +final class CaseInsensitiveEqualExpression extends AbstractValueExpression { private final boolean not; @@ -34,7 +34,6 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { @Override public void addBindValues(SpiExpressionRequest request) { - ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { // bind the key as well as the value @@ -47,7 +46,6 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { @Override public void addSql(SpiExpressionRequest request) { - String pname = propName; ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java index cd8a59857..ca97b5408 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java @@ -39,7 +39,7 @@ import java.util.ArrayList; * * } */ -public class DefaultExampleExpression implements SpiExpression, ExampleExpression { +final class DefaultExampleExpression implements SpiExpression, ExampleExpression { /** * The example bean containing the properties. @@ -75,7 +75,7 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio * @param caseInsensitive if true use case insensitive expressions * @param likeType the type of Like wild card used */ - public DefaultExampleExpression(EntityBean entity, boolean caseInsensitive, LikeType likeType) { + DefaultExampleExpression(EntityBean entity, boolean caseInsensitive, LikeType likeType) { this.entity = entity; this.caseInsensitive = caseInsensitive; this.likeType = likeType; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index ed3f57e14..b9693df6d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -56,15 +56,10 @@ public class DefaultExpressionList implements SpiExpressionList { private static final String AND = " and "; protected List list; - protected final Query query; - private final ExpressionList parentExprList; - protected final ExpressionFactory expr; - String allDocNestedPath; - /** * Set to true for the "Text" root expression list. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java index 557c53996..09ff401af 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java @@ -13,26 +13,17 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -public class DefaultExpressionRequest implements SpiExpressionRequest { +public final class DefaultExpressionRequest implements SpiExpressionRequest { private final SpiOrmQueryRequest queryRequest; - private final BeanDescriptor beanDescriptor; - private final StringBuilder sql = new StringBuilder(); - private final List bindValues = new ArrayList<>(); - private final DeployParser deployParser; - private final Binder binder; - private final SpiExpressionList expressionList; - private int paramIndex; - private final boolean enableBindLog; - private StringBuilder bindLog; public DefaultExpressionRequest(SpiOrmQueryRequest queryRequest, DeployParser deployParser, Binder binder, SpiExpressionList expressionList) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java index 71ca665fe..438f1a2d5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java @@ -16,15 +16,12 @@ import io.ebeaninternal.server.query.CQuery; import java.io.IOException; import java.util.List; -class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpression { +final class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpression { - protected final boolean not; - - protected final SpiQuery subQuery; - - protected List bindParams; - - protected String sql; + private final boolean not; + private final SpiQuery subQuery; + private List bindParams; + private String sql; ExistsQueryExpression(SpiQuery subQuery, boolean not) { this.subQuery = subQuery; @@ -67,7 +64,6 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress @Override public void prepareExpression(BeanQueryRequest request) { - CQuery subQuery = compileSubQuery(request); this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); this.sql = subQuery.getGeneratedSql().replace('\n', ' '); @@ -99,7 +95,6 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress @Override public void addSql(SpiExpressionRequest request) { - if (not) { request.append(" not"); } @@ -110,7 +105,6 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress @Override public void addBindValues(SpiExpressionRequest request) { - for (Object bindParam : bindParams) { request.addBindValue(bindParam); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java index d7b04de44..5765c7e43 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExprPath.java @@ -9,7 +9,7 @@ import java.io.Serializable; * query that includes the filterMany. *

*/ -public class FilterExprPath implements Serializable { +public final class FilterExprPath implements Serializable { private static final long serialVersionUID = -6420905565372842018L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java index b6b1874a8..0e8d4ba0b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/FilterExpressionList.java @@ -18,14 +18,12 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -public class FilterExpressionList extends DefaultExpressionList { +public final class FilterExpressionList extends DefaultExpressionList { private static final String notAllowedMessage = "This method is not allowed on a filter"; private final Query rootQuery; - private final FilterExprPath pathPrefix; - private int firstRow; private int maxRows; private String orderByClause; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java index 94cab6de7..c61f884a4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java @@ -12,7 +12,7 @@ import java.io.IOException; /** * Slightly redundant as Query.setId() ultimately also does the same job. */ -class IdExpression extends NonPrepareExpression implements SpiExpression { +final class IdExpression extends NonPrepareExpression implements SpiExpression { private final Object value; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java index edf56b443..c1bd76db0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java @@ -20,10 +20,9 @@ import java.util.Set; /** * In a collection of Id values. */ -public class IdInExpression extends NonPrepareExpression { +public final class IdInExpression extends NonPrepareExpression { private final List idCollection; - private boolean multiValueIdSupported; public IdInExpression(Collection idCollection) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java index 0bc5a4588..1a84d87eb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java @@ -16,7 +16,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -class InExpression extends AbstractExpression { +final class InExpression extends AbstractExpression { private final boolean not; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java index e5bd27413..b5533b7ad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java @@ -13,20 +13,14 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -class InPairsExpression extends AbstractExpression { +final class InPairsExpression extends AbstractExpression { private final boolean not; - private final String property0, property1; - private List entries; - private boolean multiValueSupported; - private final String separator; - private final String suffix; - private List concatBindValues; InPairsExpression(Pairs pairs, boolean not) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java index a2d6d787c..e53792550 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java @@ -15,14 +15,11 @@ import java.util.List; /** * In expression using a sub query. */ -class InQueryExpression extends AbstractExpression implements UnsupportedDocStoreExpression { +final class InQueryExpression extends AbstractExpression implements UnsupportedDocStoreExpression { private final boolean not; - private final SpiQuery subQuery; - private List bindParams; - private String sql; InQueryExpression(String propertyName, SpiQuery subQuery, boolean not) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java index 04b242ba8..8bcdb12a8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java @@ -6,10 +6,9 @@ import io.ebeaninternal.api.SpiExpressionRequest; import java.io.IOException; -class InRangeExpression extends AbstractExpression { +final class InRangeExpression extends AbstractExpression { private final Object valueHigh; - private final Object valueLow; InRangeExpression(String propertyName, Object valueLow, Object valueHigh) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java index d6b878bfa..fc3be3e34 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java @@ -10,12 +10,10 @@ import io.ebean.util.SplitName; import java.io.IOException; -class IsEmptyExpression extends AbstractExpression { +final class IsEmptyExpression extends AbstractExpression { private final boolean empty; - private final String propertyPath; - private String nestedPath; IsEmptyExpression(String propertyName, boolean empty) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java index 1d954dcc1..a6e8f128b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java @@ -16,27 +16,27 @@ import java.util.Objects; * The value passed in is expected to be a valid JSON type so string, number, boolean. *

*/ -class JsonPathExpression extends AbstractExpression { +final class JsonPathExpression extends AbstractExpression { /** * The path in the JSON document in dot notation form. */ - protected final String path; + private final String path; /** * The expression operator. */ - protected final Op operator; + private final Op operator; /** * The bind value used to compare against the document path value. */ - protected final Object value; + private final Object value; /** * For Between this is the upper bind value. */ - protected final Object upperValue; + private final Object upperValue; /** * Construct for Operator (not BETWEEN though). diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index 5637fba7f..a408b5e74 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -48,11 +48,10 @@ import java.util.function.Predicate; /** * Junction implementation. */ -class JunctionExpression implements SpiJunction, SpiExpression, ExpressionList { +final class JunctionExpression implements SpiJunction, SpiExpression, ExpressionList { - protected DefaultExpressionList exprList; - - protected Junction.Type type; + DefaultExpressionList exprList; + Junction.Type type; JunctionExpression(Junction.Type type, Query query, ExpressionList parent) { this.type = type; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java index f40501929..bf3871c23 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java @@ -8,10 +8,9 @@ import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class LikeExpression extends AbstractValueExpression { +final class LikeExpression extends AbstractValueExpression { private final boolean caseInsensitive; - private final LikeType type; LikeExpression(String propertyName, Object value, boolean caseInsensitive, LikeType type) { @@ -27,7 +26,6 @@ class LikeExpression extends AbstractValueExpression { @Override public void addBindValues(SpiExpressionRequest request) { - ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { // bind the key as well as the value @@ -40,7 +38,6 @@ class LikeExpression extends AbstractValueExpression { @Override public void addSql(SpiExpressionRequest request) { - String pname = propName; ElPropertyValue prop = getElProp(request); if (prop != null && prop.isDbEncrypted()) { @@ -98,7 +95,6 @@ class LikeExpression extends AbstractValueExpression { return "%" + value + "%"; case EQUAL_TO: return value; - default: throw new RuntimeException("LikeType " + type + " missed?"); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java index a66e2e88a..b0ef74f03 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java @@ -21,7 +21,7 @@ abstract class LogicExpression implements SpiExpression { static final String AND = " and "; static final String OR = " or "; - static class And extends LogicExpression { + static final class And extends LogicExpression { And(Expression expOne, Expression expTwo) { super(true, expOne, expTwo); @@ -34,7 +34,7 @@ abstract class LogicExpression implements SpiExpression { } - static class Or extends LogicExpression { + static final class Or extends LogicExpression { Or(Expression expOne, Expression expTwo) { super(false, expOne, expTwo); @@ -47,9 +47,7 @@ abstract class LogicExpression implements SpiExpression { } SpiExpression expOne; - SpiExpression expTwo; - private final boolean conjunction; LogicExpression(boolean conjunction, Expression expOne, Expression expTwo) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java index 5487cffbf..3a56ec7de 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NamedParamHelp.java @@ -8,7 +8,7 @@ import java.util.List; /** * Helper for evaluating named parameters. */ -class NamedParamHelp { +final class NamedParamHelp { /** * Return the bind value taking into account named parameters. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java index f64933df5..110442365 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java @@ -8,7 +8,7 @@ import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; -class NativeILikeExpression extends AbstractExpression { +final class NativeILikeExpression extends AbstractExpression { private final String val; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java index b76bfef4d..0bb63f1ed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java @@ -14,11 +14,10 @@ import java.io.IOException; /** * Wraps a single expression with nestedPath for document queries. */ -class NestedPathWrapperExpression implements SpiExpression { +final class NestedPathWrapperExpression implements SpiExpression { - protected final String nestedPath; - - protected final SpiExpression delegate; + final String nestedPath; + final SpiExpression delegate; NestedPathWrapperExpression(String nestedPath, SpiExpression delegate) { this.nestedPath = nestedPath; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java index 6c8d709e7..079f26874 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java @@ -14,9 +14,9 @@ import java.io.IOException; /** * Effectively an expression that has no effect. */ -class NoopExpression implements SpiExpression { +final class NoopExpression implements SpiExpression { - protected static final NoopExpression INSTANCE = new NoopExpression(); + static final NoopExpression INSTANCE = new NoopExpression(); @Override public void prefixProperty(String path) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java index 2808acce7..4a4a81201 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java @@ -17,14 +17,11 @@ import java.io.IOException; * Note that for OneToMany/ManyToMany this effectively gets translated into isEmpty()/isNotEmpty(). *

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

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

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

*/ -class BatchedBeanHolder { +final class BatchedBeanHolder { /** * The owning queue. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java index 0a764e35b..9afd4d6e8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BatchedPstmt.java @@ -20,7 +20,7 @@ import java.util.List; * This can hold CallableStatements as well. *

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

*/ -public class BatchedPstmtHolder { +public final class BatchedPstmtHolder { /** * A Map of the statements using a String key. This is used so that the same diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java index 600a7e21a..bec0223d0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -31,7 +31,7 @@ import java.util.List; /** * Binds bean values to a PreparedStatement. */ -public class Binder { +public final class Binder { private static final Logger logger = LoggerFactory.getLogger(Binder.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java index e086e2630..760d9eda3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteIdRequest.java @@ -5,7 +5,7 @@ import io.ebean.Transaction; import io.ebean.event.BeanDeleteIdRequest; import io.ebeaninternal.api.SpiEbeanServer; -class DeleteIdRequest implements BeanDeleteIdRequest { +final class DeleteIdRequest implements BeanDeleteIdRequest { private final EbeanServer server; private final Transaction transaction; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java index c3065b779..1c258b5bb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java @@ -21,7 +21,7 @@ import java.util.List; * helps fetch the foreign keys and delete the appropriate rows. *

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

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

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

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

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

*/ -class FactoryProperty { +final class FactoryProperty { private final boolean bindEncryptDataFirst; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java index abb7f1a20..7c418af31 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/FactoryVersion.java @@ -7,17 +7,12 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; /** * Creates a Bindable to support version concurrency where clauses. */ -public class FactoryVersion { - - - public FactoryVersion() { - } +public final class FactoryVersion { /** * Create a Bindable for the version property(s) for a bean type. */ public Bindable create(BeanDescriptor desc) { - BeanProperty versionProperty = desc.getVersionProperty(); return (versionProperty == null) ? null : new BindablePropertyVersion(versionProperty); } @@ -26,7 +21,6 @@ public class FactoryVersion { * Create a Bindable for the version property(s) for a bean type. */ public Bindable createForDelete(BeanDescriptor desc) { - BeanProperty versionProperty = desc.getVersionProperty(); return (versionProperty == null) ? null : new BindableProperty(versionProperty); } @@ -35,7 +29,6 @@ public class FactoryVersion { * Create a Bindable for TenantId If multi-tenant with partitioning is on this bean type. */ public Bindable createTenantId(BeanDescriptor desc) { - BeanProperty tenant = desc.getTenantProperty(); if (tenant == null) { return null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java index 4ce1bb63d..60a32ea19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedEmbedded.java @@ -8,12 +8,10 @@ import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; * Matches local embedded id properties to 'matching' properties from a * ManyToOne associated bean that is a 'imported primary key'. */ -class MatchedImportedEmbedded implements MatchedImportedProperty { +final class MatchedImportedEmbedded implements MatchedImportedProperty { private final BeanProperty localProp; - private final BeanPropertyAssocOne assocOne; - private final BeanProperty foreignProp; MatchedImportedEmbedded(BeanProperty localProp, BeanPropertyAssocOne assocOne, BeanProperty foreignProp) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java index 714e910dd..e4fa26284 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedFactory.java @@ -4,15 +4,13 @@ import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; -class MatchedImportedFactory { +final class MatchedImportedFactory { /** * Create the array of matchedImportedProperty based on the properties and descriptor. */ static MatchedImportedProperty[] build(BeanProperty[] props, BeanDescriptor desc) { - MatchedImportedProperty[] matches = new MatchedImportedProperty[props.length]; - for (int i = 0; i < props.length; i++) { // find matching assoc one property for dbColumn matches[i] = findMatch(props[i], desc); @@ -25,12 +23,9 @@ class MatchedImportedFactory { } private static MatchedImportedProperty findMatch(BeanProperty prop, BeanDescriptor desc) { - // find matching against the local database column String dbColumn = prop.getDbColumn(); - - BeanPropertyAssocOne[] assocOnes = desc.propertiesOne(); - for (BeanPropertyAssocOne assocOne1 : assocOnes) { + for (BeanPropertyAssocOne assocOne1 : desc.propertiesOne()) { if (assocOne1.isImportedPrimaryKey()) { // search using the ImportedId from the assoc one BeanProperty foreignMatch = assocOne1.getImportedId().findMatchImport(dbColumn); @@ -39,14 +34,11 @@ class MatchedImportedFactory { } } } - - BeanProperty[] scalar = desc.propertiesBaseScalar(); - for (BeanProperty beanProperty : scalar) { + for (BeanProperty beanProperty : desc.propertiesBaseScalar()) { if (dbColumn.equals(beanProperty.getDbColumn())) { return new MatchedImportedScalar(prop, beanProperty); } } - // there was no matching assoc one property. // example UserRole bean missing assoc one to User? return null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java index 436ef69a5..de9907863 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/dmlbind/MatchedImportedScalar.java @@ -6,10 +6,9 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Matches local embedded id properties to 'matching' imported primary key scalar properties. */ -class MatchedImportedScalar implements MatchedImportedProperty { +final class MatchedImportedScalar implements MatchedImportedProperty { private final BeanProperty localProp; - private final BeanProperty foreignProp; MatchedImportedScalar(BeanProperty localProp, BeanProperty foreignProp) { @@ -19,7 +18,6 @@ class MatchedImportedScalar implements MatchedImportedProperty { @Override public void populate(EntityBean sourceBean, EntityBean embeddedId) { - Object value = foreignProp.getValue(sourceBean); localProp.setValue(embeddedId, value); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java index 3559a3a69..1a15b8438 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java @@ -11,7 +11,6 @@ import java.util.Collection; */ public class MultiValueBind { - @FunctionalInterface public interface BindOne { void bind(Object value) throws SQLException; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java index f90d5cfb8..f7d86f55e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java @@ -6,7 +6,7 @@ import io.ebean.core.type.ScalarType; /** * Multi value binder that uses Postgres Array. */ -public class PostgresMultiValueBind extends AbstractMultiValueBind { +public final class PostgresMultiValueBind extends AbstractMultiValueBind { @Override public String getInExpression(boolean not, ScalarType type, int size) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java index d93e0dbdb..693aa5de8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DCountMetric.java @@ -9,10 +9,9 @@ import java.util.concurrent.atomic.LongAdder; /** * Used to collect counter metrics. */ -class DCountMetric implements CountMetric { +final class DCountMetric implements CountMetric { private final String name; - private final LongAdder count = new LongAdder(); DCountMetric(String name) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java index 633c4c505..d51ff2198 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DMetricFactory.java @@ -10,7 +10,7 @@ import io.ebean.metric.TimedMetricMap; /** * Default metric factory implementation. */ -public class DMetricFactory implements MetricFactory { +public final class DMetricFactory implements MetricFactory { @Override public TimedMetricMap createTimedMetricMap(String name) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java index 63fa0e11a..df4c44c56 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java @@ -13,7 +13,6 @@ class DProfileLocation implements ProfileLocation { private String fullLocation; private String location; private String label; - private final int lineNumber; private int traceCount; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java index ebf5e78c0..cc6e19bd3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DProfileLocationFactory.java @@ -8,7 +8,7 @@ import io.ebean.service.SpiProfileLocationFactory; /** * Default implementation of the profile location factory. */ -public class DProfileLocationFactory implements SpiProfileLocationFactory { +public final class DProfileLocationFactory implements SpiProfileLocationFactory { @Override public ProfileLocation create() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java index 67f724051..879d2ee6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMeta.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.profile; import io.ebean.ProfileLocation; import io.ebeaninternal.server.util.Md5; -class DQueryPlanMeta { +final class DQueryPlanMeta { private final Class type; private final String label; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java index e24da73c7..723c24511 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java @@ -6,7 +6,7 @@ import io.ebean.metric.QueryPlanMetric; import io.ebean.metric.TimedMetric; import io.ebean.metric.TimedMetricStats; -class DQueryPlanMetric implements QueryPlanMetric { +final class DQueryPlanMetric implements QueryPlanMetric { private final DQueryPlanMeta meta; private final DTimedMetric metric; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java index a4243e31a..900f47aae 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimeMetricStats.java @@ -5,13 +5,12 @@ import io.ebean.metric.TimedMetricStats; /** * Snapshot of the current statistics for a Counter or TimeCounter. */ -class DTimeMetricStats implements TimedMetricStats { +final class DTimeMetricStats implements TimedMetricStats { private final boolean collected; private final long count; private final long total; private final long max; - private String name; private String location; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java index cc344c3e6..a62fef911 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java @@ -12,16 +12,12 @@ import java.util.concurrent.atomic.LongAdder; * It is intended for high concurrent updates to the statistics and relatively infrequent reads. *

*/ -class DTimedMetric implements TimedMetric { +final class DTimedMetric implements TimedMetric { private final String name; - private final LongAdder count = new LongAdder(); - private final LongAdder total = new LongAdder(); - private final LongAccumulator max = new LongAccumulator(Math::max, Long.MIN_VALUE); - private boolean collected; DTimedMetric(String name) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java index 27537737f..2164f86c7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/DTimedProfileLocation.java @@ -7,14 +7,11 @@ import io.ebean.metric.TimedMetricStats; /** * Default profile location that uses stack trace. */ -class DTimedProfileLocation extends DProfileLocation implements TimedProfileLocation { +final class DTimedProfileLocation extends DProfileLocation implements TimedProfileLocation { private final String label; - private final TimedMetric timedMetric; - private final boolean overrideMetricName; - private String fullName; DTimedProfileLocation(int lineNumber, String label, TimedMetric timedMetric) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java b/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java index 1a5f8ff07..350dd6688 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/profile/TimedProfileLocationRegistry.java @@ -7,7 +7,7 @@ import java.util.List; /** * Global registry of the TimedProfileLocation instances created. */ -public class TimedProfileLocationRegistry { +public final class TimedProfileLocationRegistry { private static final List list = Collections.synchronizedList(new ArrayList<>()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java index e00fdf497..ec56da19d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/properties/BeanPropertiesReader.java @@ -8,10 +8,9 @@ import java.util.Map; /** * Determines the properties on a given bean. */ -public class BeanPropertiesReader { +public final class BeanPropertiesReader { private final Map propertyIndexMap = new HashMap<>(); - private final String[] props; public BeanPropertiesReader(Class clazz) { @@ -38,7 +37,6 @@ public class BeanPropertiesReader { try { Field field = clazz.getField("_ebean_props"); return (String[]) field.get(null); - } catch (Exception e) { throw new IllegalStateException("Error getting _ebean_props field on type " + clazz, e); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java b/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java index e4d9e9839..e7e48b6f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/properties/EnhanceBeanPropertyAccess.java @@ -9,23 +9,20 @@ public final class EnhanceBeanPropertyAccess implements BeanPropertyAccess { private static final int CACHE_SIZE = 30; - private final BeanPropertyGetter[] getters = initGetters(CACHE_SIZE); - private final BeanPropertySetter[] setters = initSetters(CACHE_SIZE); + private final BeanPropertyGetter[] getters = initGetters(); + private final BeanPropertySetter[] setters = initSetters(); - public EnhanceBeanPropertyAccess() { - } - - private BeanPropertyGetter[] initGetters(int count) { - BeanPropertyGetter[] getters = new BeanPropertyGetter[count]; - for (int i = 0; i < count; i++) { + private BeanPropertyGetter[] initGetters() { + BeanPropertyGetter[] getters = new BeanPropertyGetter[CACHE_SIZE]; + for (int i = 0; i < CACHE_SIZE; i++) { getters[i] = new Getter(i); } return getters; } - private BeanPropertySetter[] initSetters(int count) { - BeanPropertySetter[] setters = new BeanPropertySetter[count]; - for (int i = 0; i < count; i++) { + private BeanPropertySetter[] initSetters() { + BeanPropertySetter[] setters = new BeanPropertySetter[CACHE_SIZE]; + for (int i = 0; i < CACHE_SIZE; i++) { setters[i] = new Setter(i); } return setters; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java index 93c86fe7b..e71334ea6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/BaseFuture.java @@ -26,22 +26,22 @@ abstract class BaseFuture implements Future { } @Override - public T get() throws InterruptedException, ExecutionException { + public final T get() throws InterruptedException, ExecutionException { return futureTask.get(); } @Override - public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return futureTask.get(timeout, unit); } @Override - public boolean isCancelled() { + public final boolean isCancelled() { return futureTask.isCancelled(); } @Override - public boolean isDone() { + public final boolean isDone() { return futureTask.isDone(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java index 7fc636af0..e9d2281d0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -37,7 +37,7 @@ import java.util.concurrent.locks.ReentrantLock; * The tree structure is flattened into a SqlSelectChain. The SqlSelectChain is * the key object used in reading the flat resultSet back into Objects. */ -public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTransactionEvent { +public final class CQuery implements DbReadContext, CancelableQuery, SpiProfileTransactionEvent { private static final Logger logger = LoggerFactory.getLogger(CQuery.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java index e3a1a5e54..559dfa0da 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java @@ -7,7 +7,7 @@ import io.ebeaninternal.server.type.bindcapture.BindCapture; import java.util.concurrent.locks.ReentrantLock; -class CQueryBindCapture implements SpiQueryBindCapture { +final class CQueryBindCapture implements SpiQueryBindCapture { private static final double multiplier = 1.5d; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 9a4b1d32e..09b465893 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -40,7 +40,7 @@ import java.util.List; * Generates the SQL SELECT statements taking into account the physical * deployment properties. */ -class CQueryBuilder { +final class CQueryBuilder { private final String columnAliasPrefix; private final SqlLimiter sqlLimiter; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java index 2bc60d208..d3b4e7ca6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java @@ -11,7 +11,7 @@ import io.ebeaninternal.server.querydefn.OrmQueryLimitRequest; import io.ebeaninternal.server.rawsql.SpiRawSql; import io.ebeaninternal.server.util.BindParamsParser; -class CQueryBuilderRawSql { +final class CQueryBuilderRawSql { private final SqlLimiter sqlLimiter; private final DatabasePlatform dbPlatform; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java index ac4230999..cf8adf097 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryCollectionAddNoop.java @@ -7,7 +7,7 @@ import io.ebean.bean.EntityBean; * A NOOP based CQueryCollectionAdd for use with lazy loading many queries where the * beans loaded into the collection are added to the collection(s) of the parent(s). */ -class CQueryCollectionAddNoop implements CQueryCollectionAdd { +final class CQueryCollectionAddNoop implements CQueryCollectionAdd { /** * Return null as we are not collecting the beans. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java index da1e01cac..771ff8145 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryDraftSupport.java @@ -5,7 +5,7 @@ import java.util.Map; /** * Support 'asDraft' queries. */ -class CQueryDraftSupport { +final class CQueryDraftSupport { /** * The mapping of base tables to their matching 'draft' table. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index 03074b43f..b76d0b4e9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -33,7 +33,7 @@ import java.util.Map; /** * Handles the Object Relational fetching. */ -public class CQueryEngine { +public final class CQueryEngine { private static final Logger logger = LoggerFactory.getLogger(CQueryEngine.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java index a89cd28fa..41f9e7f4d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java @@ -24,7 +24,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * Base compiled query request for single attribute queries. */ -class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent, CancelableQuery { private static final Logger logger = LoggerFactory.getLogger(CQueryFetchSingleAttribute.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java index 5f810c6da..e082c97eb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryHistorySupport.java @@ -7,7 +7,7 @@ import java.util.Map; /** * Helper to support history functions. */ -class CQueryHistorySupport { +final class CQueryHistorySupport { /** * The DB specific support. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java index 17cec9d15..d438ec747 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java @@ -9,7 +9,7 @@ import java.sql.SQLException; /** * QueryIterator that does not require a buffer for secondary queries. */ -class CQueryIteratorSimple implements QueryIterator { +final class CQueryIteratorSimple implements QueryIterator { private final CQuery cquery; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java index e2a9bdad2..ad1a924b5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java @@ -11,7 +11,7 @@ import java.util.NoSuchElementException; /** * A QueryIterator that uses a buffer to execute secondary queries periodically. */ -class CQueryIteratorWithBuffer implements QueryIterator { +final class CQueryIteratorWithBuffer implements QueryIterator { private final CQuery cquery; private final int bufferSize; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java index c325255ef..ffb65a039 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryOrderBy.java @@ -13,7 +13,7 @@ import java.util.List; /** * Creates the order by expression clause. */ -class CQueryOrderBy { +final class CQueryOrderBy { private final BeanDescriptor desc; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index de365f253..aef2c1164 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -164,49 +164,49 @@ public class CQueryPlan implements SpiQueryPlan { } @Override - public Class getBeanType() { + public final Class getBeanType() { return beanType; } @Override - public String getName() { + public final String getName() { return name; } @Override - public String getHash() { + public final String getHash() { return hash; } @Override - public String getSql() { + public final String getSql() { return sql; } @Override - public ProfileLocation getProfileLocation() { + public final ProfileLocation getProfileLocation() { return profileLocation; } - public String getLabel() { + public final String getLabel() { return label; } - public Set getDependentTables() { + public final Set getDependentTables() { return dependentTables; } - public String getLocation() { + public final String getLocation() { return location; } @Override - public void queryPlanInit(long thresholdMicros) { + public final void queryPlanInit(long thresholdMicros) { bindCapture.queryPlanInit(thresholdMicros); } @Override - public DQueryPlanOutput createMeta(String bind, String planString) { + public final DQueryPlanOutput createMeta(String bind, String planString) { return new DQueryPlanOutput(getBeanType(), name, hash, sql, profileLocation, bind, planString); } @@ -217,7 +217,7 @@ public class CQueryPlan implements SpiQueryPlan { /** * Bind keys for encrypted properties if necessary returning the DataBind. */ - DataBind bindEncryptedProperties(PreparedStatement stmt, Connection conn) throws SQLException { + final DataBind bindEncryptedProperties(PreparedStatement stmt, Connection conn) throws SQLException { DataBind dataBind = new DataBind(dataTimeZone, stmt, conn); if (encryptedProps != null) { for (STreeProperty encryptedProp : encryptedProps) { @@ -237,14 +237,14 @@ public class CQueryPlan implements SpiQueryPlan { return dataBind; } - int getAsOfTableCount() { + final int getAsOfTableCount() { return asOfTableCount; } /** * Return a key used in audit logging to identify the query. */ - String getAuditQueryKey() { + final String getAuditQueryKey() { if (auditQueryHash == null) { // volatile object assignment (so happy for multithreaded access) auditQueryHash = calcAuditQueryKey(); @@ -257,29 +257,29 @@ public class CQueryPlan implements SpiQueryPlan { return rawSql ? planKey.getPartialKey() + "_" + hash : planKey.getPartialKey(); } - SqlTree getSqlTree() { + final SqlTree getSqlTree() { return sqlTree; } - public boolean isRawSql() { + public final boolean isRawSql() { return rawSql; } - String getLogWhereSql() { + final String getLogWhereSql() { return logWhereSql; } /** * Reset the query statistics. */ - public void resetStatistics() { + public final void resetStatistics() { stats.reset(); } /** * Register an execution time against this query plan; */ - boolean executionTime(long timeMicros) { + final boolean executionTime(long timeMicros) { stats.add(timeMicros); return bindCapture != null && bindCapture.collectFor(timeMicros); } @@ -287,33 +287,33 @@ public class CQueryPlan implements SpiQueryPlan { /** * Return a copy of the current query statistics. */ - public Snapshot getSnapshot(boolean reset) { + public final Snapshot getSnapshot(boolean reset) { return stats.getSnapshot(reset); } /** * Return the time this query plan was last used. */ - public long getLastQueryTime() { + public final long getLastQueryTime() { return stats.getLastQueryTime(); } - ScalarDataReader getSingleAttributeScalarType() { + final ScalarDataReader getSingleAttributeScalarType() { return sqlTree.getRootNode().getSingleAttributeReader(); } /** * Return true if there are no statistics collected since the last reset. */ - public boolean isEmptyStats() { + public final boolean isEmptyStats() { return stats.isEmpty(); } - TimedMetric createTimedMetric() { + final TimedMetric createTimedMetric() { return MetricFactory.get().createTimedMetric(label); } - void captureBindForQueryPlan(CQueryPredicates predicates, long executionTimeMicros) { + final void captureBindForQueryPlan(CQueryPredicates predicates, long executionTimeMicros) { final long startNanos = System.nanoTime(); try { DataBindCapture capture = bindCapture(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java index 4ff62f44d..499e801d3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java @@ -20,7 +20,7 @@ import java.util.concurrent.ConcurrentHashMap; import static java.util.Collections.emptyList; -public class CQueryPlanManager implements QueryPlanManager { +public final class CQueryPlanManager implements QueryPlanManager { private static final Logger log = LoggerFactory.getLogger(CQueryPlanManager.class); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java index bab955d84..a23114bf2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRawSql.java @@ -12,7 +12,7 @@ import java.util.List; /** * RawSql based query plan. */ -class CQueryPlanRawSql extends CQueryPlan { +final class CQueryPlanRawSql extends CQueryPlan { private final int[] rsetIndexPositions; @@ -27,7 +27,6 @@ class CQueryPlanRawSql extends CQueryPlan { } private int[] createIndexPositions(OrmQueryRequest request, SqlTree sqlTree) { - List chain = sqlTree.buildRawSqlSelectChain(); ColumnMapping columnMapping = request.getQuery().getRawSql().getColumnMapping(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java index 315e7a07d..00b202d57 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanRequest.java @@ -11,7 +11,7 @@ import java.util.List; /** * Captures database query plans. */ -class CQueryPlanRequest { +final class CQueryPlanRequest { private final List plans = new ArrayList<>(); @@ -19,7 +19,7 @@ class CQueryPlanRequest { private final long since; private final int maxCount; private final long maxTime; - private Iterator iterator; + private final Iterator iterator; CQueryPlanRequest(Connection connection, QueryPlanRequest req, Iterator iterator) { this.connection = connection; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java index ffc749eb9..05ad13173 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java @@ -10,11 +10,8 @@ import io.ebean.metric.TimedMetricStats; public final class CQueryPlanStats { private final CQueryPlan queryPlan; - private final TimedMetric timedMetric; - private boolean collected; - private long lastQueryTime; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java index c41f830c6..94d4800f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java @@ -22,6 +22,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -37,74 +38,51 @@ import java.util.Set; * named parameters and expression values into the prepared statement. *

*/ -public class CQueryPredicates { +public final class CQueryPredicates { private static final Logger logger = LoggerFactory.getLogger(CQueryPredicates.class); private final Binder binder; - private final OrmQueryRequest request; - private final SpiQuery query; - private final Object idValue; - - /** - * Named bind parameters. - */ private final BindParams bindParams; - - /** - * Bind values from the where expressions. - */ private DefaultExpressionRequest filterMany; - /** * SQL generated from the where expressions. */ private String filterManyExprSql; - /** * Bind values from the where expressions. */ private DefaultExpressionRequest where; - /** * SQL generated from the where expressions. */ private String whereExprSql; - /** * Bind values for having expression. */ private DefaultExpressionRequest having; - /** * SQL generated from the having expression. */ private String havingExprSql; - private String dbHaving; - /** * logicalWhere with property names converted to db columns. */ private String dbWhere; - /** * Filter than can apply to a many fetch join. */ private String dbFilterMany; - private String dbOrderBy; - private String dbUpdateClause; - /** * Includes from where and order by clauses. */ private Set predicateIncludes; - private Set orderByIncludes; CQueryPredicates(Binder binder, OrmQueryRequest request) { @@ -411,7 +389,7 @@ public class CQueryPredicates { * Return the bind values for the where expression. */ public List getWhereExprBindValues() { - return where.getBindValues(); + return where == null ? Collections.emptyList() : where.getBindValues(); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java index 0c1df9483..ccfbb3ce6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java @@ -19,7 +19,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * Executes the select row count query. */ -class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryRowCount implements SpiProfileTransactionEvent, CancelableQuery { private final CQueryPlan queryPlan; private final OrmQueryRequest request; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java index 302b1bcf0..e35615a0c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java @@ -16,7 +16,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * Executes the update query. */ -class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { +final class CQueryUpdate implements SpiProfileTransactionEvent, CancelableQuery { private final CQueryPlan queryPlan; private final OrmQueryRequest request; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java index 2a432b732..528984d17 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQuery.java @@ -10,9 +10,7 @@ import io.ebeaninternal.api.SpiQuery; abstract class CallableQuery { final SpiQuery query; - final SpiEbeanServer server; - final Transaction transaction; CallableQuery(SpiEbeanServer server, SpiQuery query, Transaction t) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java index a2076b363..959ce2abd 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryCount.java @@ -8,10 +8,8 @@ import java.util.concurrent.Callable; /** * Represent the findCount query as a Callable. - * - * @param the entity bean type */ -public class CallableQueryCount extends CallableQuery implements Callable { +public final class CallableQueryCount extends CallableQuery implements Callable { /** * Note that the transaction passed in is always a new transaction solely to diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java index c8ae160f6..c236ccb6d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryIds.java @@ -9,10 +9,8 @@ import java.util.concurrent.Callable; /** * Represent the fetch Id's query as a Callable. - * - * @param the entity bean type */ -public class CallableQueryIds extends CallableQuery implements Callable> { +public final class CallableQueryIds extends CallableQuery implements Callable> { public CallableQueryIds(SpiEbeanServer server, SpiQuery query, Transaction t) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java index b20e75a86..350cd67f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CallableQueryList.java @@ -12,8 +12,7 @@ import java.util.concurrent.Callable; * * @param the entity bean type */ -public class CallableQueryList extends CallableQuery implements Callable> { - +public final class CallableQueryList extends CallableQuery implements Callable> { public CallableQueryList(SpiEbeanServer server, SpiQuery query, Transaction t) { super(server, query, t); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java index 4b17e3461..bc2449d63 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroup.java @@ -6,7 +6,7 @@ import io.ebeaninternal.server.querydefn.SpiFetchGroup; /** * Default FetchGroup implementation. */ -class DFetchGroup implements SpiFetchGroup { +final class DFetchGroup implements SpiFetchGroup { private final OrmQueryDetail detail; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java index 6553b7ea4..50966a45f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DFetchGroupBuilder.java @@ -9,7 +9,7 @@ import io.ebeaninternal.server.querydefn.SpiFetchGroup; /** * Default implementation of the FetchGroupBuilder. */ -class DFetchGroupBuilder implements FetchGroupBuilder { +final class DFetchGroupBuilder implements FetchGroupBuilder { private static final FetchConfig DEFAULT_FETCH = FetchConfig.ofDefault(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java index 1c1a41d07..642e163e2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java @@ -7,7 +7,7 @@ import io.ebeaninternal.api.SpiDbQueryPlan; /** * Captured query plan details. */ -class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { +final class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { private final Class beanType; private final String label; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java index 766be909b..72eb81db4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.query; import java.util.regex.Pattern; -class DbOrderByTrim { +final class DbOrderByTrim { private static final Pattern orderByTrim = Pattern.compile("(?i) asc\\b| desc\\b|\\b nulls first\\b|\\b nulls last\\b"); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java index 378647818..dbd9b263e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java @@ -8,7 +8,7 @@ import io.ebeaninternal.server.util.ArrayStack; import java.util.ArrayList; import java.util.HashSet; -class DefaultDbSqlContext implements DbSqlContext { +final class DefaultDbSqlContext implements DbSqlContext { private static final String COMMA = ", "; private static final String PERIOD = "."; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java index 9f7cb9b7e..459bba998 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultFetchGroupQuery.java @@ -44,7 +44,7 @@ import java.util.stream.Stream; /** * Implementation of FetchGroup query for use to create FetchGroup via query beans. */ -class DefaultFetchGroupQuery implements SpiFetchGroupQuery, SpiQueryFetch { +final class DefaultFetchGroupQuery implements SpiFetchGroupQuery, SpiQueryFetch { private static final FetchConfig FETCH_CACHE = FetchConfig.ofCache(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java index b112c7986..abab7cdf9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -21,7 +21,7 @@ import java.util.List; /** * Main Finder implementation. */ -public class DefaultOrmQueryEngine implements OrmQueryEngine { +public final class DefaultOrmQueryEngine implements OrmQueryEngine { /** * Find using predicates diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index 78b9717d9..44b84a6a5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -23,7 +23,7 @@ import java.util.function.Predicate; /** * Perform native sql fetches. */ -public class DefaultRelationalQueryEngine implements RelationalQueryEngine { +public final class DefaultRelationalQueryEngine implements RelationalQueryEngine { private final Binder binder; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java index 0ee1e1525..e38d9d7d7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultSqlRow.java @@ -29,7 +29,7 @@ import java.util.UUID; * returning the type you expect. *

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

*/ -public class SqlBeanLoad { +public final class SqlBeanLoad { private final DbReadContext ctx; private final EntityBean bean; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java index 5f548fd59..27e35c365 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java @@ -10,7 +10,7 @@ import java.util.Set; /** * Represents the SELECT clause part of the SQL query. */ -class SqlTree { +final class SqlTree { private final SqlTreeNode rootNode; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java index 27ec943b4..9d46d07c3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeAlias.java @@ -12,7 +12,7 @@ import java.util.TreeSet; /** * Special Map of the logical property joins to table alias. */ -class SqlTreeAlias { +final class SqlTreeAlias { private final SpiQuery.TemporalMode temporalMode; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java index 65fa4f7f8..c3e3fb736 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java @@ -30,44 +30,28 @@ public final class SqlTreeBuilder { private static final Logger logger = LoggerFactory.getLogger(SqlTreeBuilder.class); private final SpiQuery query; - private final STreeType desc; - private final OrmQueryDetail queryDetail; - private final CQueryPredicates predicates; - private final boolean subQuery; - private final boolean distinctOnPlatform; /** * Property if resultSet contains master and detail rows. */ private STreePropertyAssocMany manyProperty; - private final SqlTreeAlias alias; - private final DefaultDbSqlContext ctx; - private final HashSet selectIncludes = new HashSet<>(); - private final ManyWhereJoins manyWhereJoins; - private final TableJoin includeJoin; - private final boolean rawSql; - /** * rawNoId true if the RawSql does not include the @Id property */ private final boolean rawNoId; - private final boolean disableLazyLoad; - private final SpiQuery.TemporalMode temporalMode; - private SqlTreeNode rootNode; - private boolean sqlDistinct; /** @@ -103,9 +87,9 @@ public final class SqlTreeBuilder { this.temporalMode = SpiQuery.TemporalMode.of(query); this.disableLazyLoad = query.isDisableLazyLoading(); this.subQuery = Type.SQ_EXISTS == query.getType() - || Type.SQ_IN == query.getType() - || Type.ID_LIST == query.getType() - || Type.DELETE == query.getType() + || Type.SQ_IN == query.getType() + || Type.ID_LIST == query.getType() + || Type.DELETE == query.getType() || query.isCountDistinct(); this.includeJoin = query.getM2mIncludeJoin(); this.manyWhereJoins = query.getManyWhereJoins(); @@ -315,15 +299,31 @@ public final class SqlTreeBuilder { return new SqlTreeNodeRoot(desc, props, myList, withId, includeJoin, lazyLoadMany, temporalMode, disableLazyLoad, sqlDistinct, baseTable); } else if (prop instanceof STreePropertyAssocMany) { - return new SqlTreeNodeManyRoot(prefix, (STreePropertyAssocMany) prop, props, myList, temporalMode, disableLazyLoad); + return new SqlTreeNodeManyRoot(prefix, (STreePropertyAssocMany) prop, props, myList, withId(), temporalMode, disableLazyLoad); } else { - // do not read Id on child beans (e.g. when used with fetch()) - boolean withId = isNotSingleAttribute() && !subQuery; - return new SqlTreeNodeBean(prefix, prop, props, myList, withId, temporalMode, disableLazyLoad); + return new SqlTreeNodeBean(prefix, prop, props, myList, withId(), temporalMode, disableLazyLoad); } } + boolean withId() { + return isNotSingleAttribute() && !subQuery; + } + + /** + * Return true if the Id property should be excluded (as it is automatically included). + */ + private boolean excludeIdProperty() { + return query == null || !query.isSingleAttribute() && !query.isManualId(); + } + + /** + * Return true if the query is not a single attribute query. + */ + private boolean isNotSingleAttribute() { + return query == null || !query.isSingleAttribute(); + } + /** * Build extra joins to support properties used in where clause but not * already in select clause. @@ -682,20 +682,6 @@ public final class SqlTreeBuilder { } return extras.toArray(new String[0]); } - } - /** - * Return true if the Id property should be excluded (as it is automatically included). - */ - private boolean excludeIdProperty() { - return query == null || !query.isSingleAttribute() && !query.isManualId(); - } - - /** - * Return true if the query is not a single attribute query. - */ - private boolean isNotSingleAttribute() { - return query == null || !query.isSingleAttribute(); - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index 1c9bff694..83c8362a9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -28,58 +28,40 @@ class SqlTreeNodeBean implements SqlTreeNode { private static final SqlTreeNode[] NO_CHILDREN = new SqlTreeNode[0]; final STreeType desc; - final IdBinder idBinder; - /** * The children which will be other SelectBean or SelectProxyBean. */ final SqlTreeNode[] children; - /** * Set to true if this is a partial object fetch. */ private final boolean partialObject; - private final STreeProperty[] properties; - /** * Extra where clause added by Where annotation on associated many. */ private final String extraWhere; - private final STreePropertyAssoc nodeBeanProp; - /** * False if report bean and has no id property. */ final boolean readId; private final boolean readIdNormal; - private final boolean disableLazyLoad; - private final InheritInfo inheritInfo; - final String prefix; - private final Map pathMap; - final STreePropertyAssocMany lazyLoadParent; - private final SpiQuery.TemporalMode temporalMode; - private final boolean temporalVersions; - private final IdBinder lazyLoadParentIdBinder; - String baseTableAlias; - /** * Table alias set if this bean node includes a join to a intersection * table and that table has history support. */ private boolean intersectionAsOfTableAlias; - private final boolean aggregation; /** @@ -131,12 +113,12 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public boolean isSingleProperty() { + public final boolean isSingleProperty() { return properties != null && properties.length == 1 && children.length == 0; } @Override - public ScalarDataReader getSingleAttributeReader() { + public final ScalarDataReader getSingleAttributeReader() { if (properties == null || properties.length == 0) { // if we have no property ask first children (in a distinct select with join) if (children.length == 0) { @@ -172,7 +154,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public void buildRawSqlSelectChain(List selectChain) { + public final void buildRawSqlSelectChain(List selectChain) { if (readId) { if (inheritInfo != null) { // discriminator column always proceeds id column @@ -194,7 +176,7 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Load that takes into account inheritance. */ - private class LoadInherit extends Load { + private final class LoadInherit extends Load { private LoadInherit(DbReadContext ctx, EntityBean parentBean) { super(ctx, parentBean); @@ -437,7 +419,7 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Perform the load returning the loaded bean. */ - EntityBean perform() throws SQLException { + final EntityBean perform() throws SQLException { initialise(); if (isLazyLoadManyRoot()) { return getContextBean(); @@ -451,7 +433,7 @@ class SqlTreeNodeBean implements SqlTreeNode { * Return true if this bean was already in the context. If already in the * context we need to check if it is already contained in the collection. */ - boolean isContextBean() { + final boolean isContextBean() { return localBean == null; } } @@ -467,12 +449,12 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Create the loader with or without inheritance. */ - Load createLoad(DbReadContext ctx, EntityBean parentBean) { + final Load createLoad(DbReadContext ctx, EntityBean parentBean) { return (inheritInfo != null) ? new LoadInherit(ctx, parentBean) : new Load(ctx, parentBean); } @Override - public void appendGroupBy(DbSqlContext ctx, boolean subQuery) { + public final void appendGroupBy(DbSqlContext ctx, boolean subQuery) { ctx.pushJoin(prefix); ctx.pushTableAlias(prefix); if (lazyLoadParent != null) { @@ -507,7 +489,7 @@ class SqlTreeNodeBean implements SqlTreeNode { * Append the property columns to the buffer. */ @Override - public void appendSelect(DbSqlContext ctx, boolean subQuery) { + public final void appendSelect(DbSqlContext ctx, boolean subQuery) { ctx.pushJoin(prefix); ctx.pushTableAlias(prefix); if (temporalVersions) { @@ -532,7 +514,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public boolean isAggregation() { + public final boolean isAggregation() { if (aggregation) { return true; } @@ -553,14 +535,14 @@ class SqlTreeNodeBean implements SqlTreeNode { } } - void appendSelectId(DbSqlContext ctx, STreeProperty prop) { + final void appendSelectId(DbSqlContext ctx, STreeProperty prop) { if (prop != null) { prop.appendSelect(ctx, false); } } @Override - public void appendWhere(DbSqlContext ctx) { + public final void appendWhere(DbSqlContext ctx) { // Only apply inheritance to root node as any join will already have the inheritance join include - see TableJoin if (inheritInfo != null && nodeBeanProp == null) { if (!inheritInfo.isRoot()) { @@ -618,7 +600,7 @@ class SqlTreeNodeBean implements SqlTreeNode { } @Override - public void addSoftDeletePredicate(SpiQuery query) { + public final void addSoftDeletePredicate(SpiQuery query) { if (desc.isSoftDelete()) { query.addSoftDeletePredicate(desc.getSoftDeletePredicate(baseTableAlias)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java index 1b31ee08c..ae5e5bf3f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebean.util.SplitName; @@ -22,7 +21,7 @@ import java.util.Set; * etc in this case we must add an extra join. *

*/ -class SqlTreeNodeExtraJoin implements SqlTreeNode { +final class SqlTreeNodeExtraJoin implements SqlTreeNode { private final STreePropertyAssoc assocBeanProperty; private final SpiQuery.TemporalMode temporalMode; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java index 20a3037da..faf1ce4f1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebeaninternal.api.SpiQuery; @@ -13,7 +12,7 @@ import java.util.Set; /** * Join to Many (or child of a many) to support where clause predicates on many properties. */ -class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { +final class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { private final STreeProperty nodeBeanProp; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyRoot.java index d920b57ef..c030e96bc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyRoot.java @@ -13,8 +13,8 @@ final class SqlTreeNodeManyRoot extends SqlTreeNodeBean { private final STreePropertyAssocMany manyProp; SqlTreeNodeManyRoot(String prefix, STreePropertyAssocMany prop, SqlTreeProperties props, List myList, - SpiQuery.TemporalMode temporalMode, boolean disableLazyLoad) { - super(prefix, prop, props, myList, true, temporalMode, disableLazyLoad); + boolean withId, SpiQuery.TemporalMode temporalMode, boolean disableLazyLoad) { + super(prefix, prop, props, myList, withId, temporalMode, disableLazyLoad); this.manyProp = prop; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java index c537c4bf7..c3f534a25 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.query; -import io.ebean.Version; import io.ebean.bean.EntityBean; import io.ebean.core.type.ScalarType; import io.ebean.util.SplitName; @@ -15,21 +14,16 @@ import java.util.Set; /** * Join to Many (or child of a many) to support where clause predicates on many properties. */ -class SqlTreeNodeManyWhereJoin implements SqlTreeNode { +final class SqlTreeNodeManyWhereJoin implements SqlTreeNode { private final String parentPrefix; - private final String prefix; - private final STreePropertyAssoc nodeBeanProp; - private final STreeType target; - /** * The many where join which is either INNER or OUTER. */ private final SqlJoinType manyJoinType; - private final boolean softDelete; SqlTreeNodeManyWhereJoin(String prefix, STreePropertyAssoc prop, SqlJoinType manyJoinType, SpiQuery.TemporalMode temporalMode) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java index e52477cf1..a58c51cc5 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java @@ -18,9 +18,7 @@ import java.util.Set; final class SqlTreeNodeRoot extends SqlTreeNodeBean implements SqlTreeRoot { private final TableJoin includeJoin; - private final boolean sqlDistinct; - private final String baseTable; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java index f46ca8088..489341789 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeProperties.java @@ -10,24 +10,16 @@ import java.util.List; /** * The select properties for a node in the SqlTree. */ -public class SqlTreeProperties { +public final class SqlTreeProperties { - /** - * The bean properties in order. - */ private final List propsList = new ArrayList<>(); - /** * Maintain a list of property names to detect embedded bean additions. */ private final LinkedHashSet propNames = new LinkedHashSet<>(); - private boolean allProperties; - private boolean aggregationManyToOne; - private boolean aggregation; - private String aggregationPath; SqlTreeProperties() { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java index 62fd3cdf0..4ad835188 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/AbstractQuery.java @@ -15,14 +15,12 @@ import io.ebeaninternal.api.SpiCancelableQuery; */ public class AbstractQuery implements SpiCancelableQuery { + private final ReentrantLock lock = new ReentrantLock(); private boolean cancelled; - private CancelableQuery cancelableQuery; - private final ReentrantLock lock = new ReentrantLock(); - @Override - public void cancel() { + public final void cancel() { lock.lock(); try { if (!cancelled) { @@ -37,14 +35,14 @@ public class AbstractQuery implements SpiCancelableQuery { } @Override - public void checkCancelled() { + public final void checkCancelled() { if (cancelled) { throw new PersistenceException("Query was cancelled"); } } @Override - public void setCancelableQuery(CancelableQuery cancelableQuery) { + public final void setCancelableQuery(CancelableQuery cancelableQuery) { lock.lock(); try { checkCancelled(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java index c2cb02198..4a72c0057 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java @@ -21,35 +21,20 @@ import java.util.stream.Stream; /** * Default implementation of DtoQuery. */ -public class DefaultDtoQuery extends AbstractQuery implements SpiDtoQuery { +public final class DefaultDtoQuery extends AbstractQuery implements SpiDtoQuery { private final SpiEbeanServer server; - private final DtoBeanDescriptor descriptor; - private final SpiQuery ormQuery; - private String sql; - private int firstRow; - private int maxRows; - private int timeout; - private int bufferFetchSizeHint; - private boolean relaxedMode; - private String label; - private ProfileLocation profileLocation; - - /** - * Bind parameters when using the query language. - */ private final BindParams bindParams = new BindParams(); - private Transaction transaction; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index b5aeec323..65ba6b9a3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -32,77 +32,47 @@ import java.util.stream.Stream; /** * Default implementation of an Object Relational query. */ -public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { +public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery { private static final String DEFAULT_QUERY_NAME = "default"; - private static final FetchConfig FETCH_CACHE = FetchConfig.ofCache(); - private static final FetchConfig FETCH_QUERY = FetchConfig.ofQuery(); - private static final FetchConfig FETCH_LAZY = FetchConfig.ofLazy(); private final Class beanType; - private final ExpressionFactory expressionFactory; - private final BeanDescriptor rootBeanDescriptor; - private BeanDescriptor beanDescriptor; - private SpiEbeanServer server; - private SpiTransaction transaction; - /** * For lazy loading of ManyToMany we need to add a join to the intersection table. This is that * join to the intersection table. */ private TableJoin m2mIncludeJoin; - private ProfilingListener profilingListener; - private Type type; - private String label; - private Mode mode = Mode.NORMAL; - private Object tenantId; - /** * Holds query in structured form. */ private OrmQueryDetail detail; - private int maxRows; - private int firstRow; - - /** - * Set to true to disable lazy loading on the object graph returned. - */ private boolean disableLazyLoading; - /** * Lazy loading batch size (can override server wide default). */ private int lazyLoadBatchSize; - private OrderBy orderBy; - private String loadMode; - private String loadDescription; - private String generatedSql; - private String lazyLoadProperty; - private String lazyLoadManyPath; - private boolean allowLoadErrors; - /** * Flag set for report/DTO beans when we may choose to explicitly include the Id property. */ @@ -141,97 +111,55 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { * Bind parameters when using the query language. */ private BindParams bindParams; - private DefaultExpressionList textExpressions; - private DefaultExpressionList whereExpressions; - private DefaultExpressionList havingExpressions; - private boolean asOfBaseTable; - private int asOfTableCount; /** * Set for flashback style 'as of' query. */ private Timestamp asOf; - private TemporalMode temporalMode = TemporalMode.CURRENT; - private Timestamp versionsStart; private Timestamp versionsEnd; - private List softDeletePredicates; - private boolean disableReadAudit; - private int bufferFetchSizeHint; - private boolean usageProfiling = true; - private CacheMode useBeanCache = CacheMode.AUTO; - private CacheMode useQueryCache = CacheMode.OFF; - private Boolean readOnly; - private PersistenceContextScope persistenceContextScope; /** * Allow for explicit on off or null for default. */ private Boolean autoTune; - private LockWait forUpdate; private LockType lockType; - private boolean singleAttribute; - private CountDistinctOrder countDistinctOrder; - - /** - * Set to true if this query has been tuned by autoTune. - */ private boolean autoTuned; - - /** - * Root table alias. For {@link Query#alias(String)} command. - */ private String rootTableAlias; - private String baseTable; - /** * The node of the bean or collection that fired lazy loading. Not null if profiling is on and * this query is for lazy loading. Used to hook back a lazy loading query to the "original" query * point. */ private ObjectGraphNode parentNode; - private BeanPropertyAssocMany lazyLoadForParentsProperty; - - /** - * Hash of final query after AutoTune tuning. - */ private CQueryPlanKey queryPlanKey; - private PersistenceContext persistenceContext; - private ManyWhereJoins manyWhereJoins; - private SpiRawSql rawSql; - private boolean useDocStore; - private String docIndexName; - private OrmUpdateProperties updateProperties; - private String nativeSql; - private boolean orderById; - private ProfileLocation profileLocation; public DefaultOrmQuery(BeanDescriptor desc, SpiEbeanServer server, ExpressionFactory expressionFactory) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java index 0381df322..88b84fc2f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmUpdate.java @@ -14,41 +14,21 @@ public final class DefaultOrmUpdate implements SpiUpdate, Serializable { private static final long serialVersionUID = -8791423602246515438L; - private transient final EbeanServer server; - private final Class beanType; - - /** - * The name of the update. - */ private final String name; - private String label; - - /** - * The parameters used to bind to the sql. - */ private final BindParams bindParams = new BindParams(); - - /** - * The sql update or delete statement. - */ private final String updateStatement; - /** * Automatically detect the table being modified by this sql. This will * register this information so that eBean invalidates cached objects if * required. */ private boolean notifyCache = true; - private int timeout; - private String generatedSql; - private final String baseTable; - private final OrmUpdateType type; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index 6afe54a1f..879d1bdaf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -17,27 +17,17 @@ import java.util.function.Predicate; /** * Default implementation of SQuery - SQL Query. */ -public class DefaultRelationalQuery extends AbstractQuery implements SpiSqlQuery { +public final class DefaultRelationalQuery extends AbstractQuery implements SpiSqlQuery { private static final long serialVersionUID = -1098305779779591068L; private final transient SpiEbeanServer server; - private final String query; - private String label; - private int firstRow; - private int maxRows; - private int timeout; - private int bufferFetchSizeHint; - - /** - * Bind parameters when using the query language. - */ private final BindParams bindParams = new BindParams(); /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java index 897424b8a..c9ed9ca11 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultUpdateQuery.java @@ -10,7 +10,7 @@ import io.ebeaninternal.server.deploy.BeanProperty; /** * Default implementation of UpdateQuery. */ -public class DefaultUpdateQuery implements UpdateQuery { +public final class DefaultUpdateQuery implements UpdateQuery { private final OrmUpdateProperties values = new OrmUpdateProperties(); private final DefaultOrmQuery query; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java index 3655a3ef4..301ec4ef3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/NaturalKeyBindParam.java @@ -1,9 +1,8 @@ package io.ebeaninternal.server.querydefn; -public class NaturalKeyBindParam { +public final class NaturalKeyBindParam { private final String name; - private final Object value; public NaturalKeyBindParam(String name, Object value) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java index e63526063..f2585a708 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/ONamedParam.java @@ -7,10 +7,9 @@ import javax.persistence.PersistenceException; /** * Named parameter used as placeholder in expressions created by EQL language parsing. */ -class ONamedParam implements SpiNamedParam { +final class ONamedParam implements SpiNamedParam { private final String name; - private Object value; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java index 2fabfdd79..90f4cbac1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetail.java @@ -21,7 +21,7 @@ import java.util.*; * Tuning a query is a matter of replacing an instance of this class with one that has been tuned * with select() and join() set. */ -public class OrmQueryDetail implements Serializable { +public final class OrmQueryDetail implements Serializable { private static final long serialVersionUID = -2510486880141461807L; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java index 0314b55b6..744f70ebf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryDetailParser.java @@ -9,10 +9,9 @@ import javax.persistence.PersistenceException; * replace the OrmQueryDetail leaving the attributes unchanged. *

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

*/ -public class ScalarTypeDurationWithNanos extends ScalarTypeDuration { +final class ScalarTypeDurationWithNanos extends ScalarTypeDuration { - public ScalarTypeDurationWithNanos() { + ScalarTypeDurationWithNanos() { super(Types.DECIMAL); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java index ba9a44b20..1a552d11a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java @@ -12,12 +12,10 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -public class ScalarTypeEncryptedWrapper implements ScalarType, LocalEncryptedType { +public final class ScalarTypeEncryptedWrapper implements ScalarType, LocalEncryptedType { private final ScalarType wrapped; - private final DataEncryptSupport dataEncryptSupport; - private final ScalarTypeBytesBase byteArrayType; public ScalarTypeEncryptedWrapper(ScalarType wrapped, ScalarTypeBytesBase byteArrayType, DataEncryptSupport dataEncryptSupport) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java index 4c8a5e645..8545bc9a7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -28,17 +28,17 @@ import java.util.Set; * Ebean specific @EnumMapping. *

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

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