diff --git a/ebean-api/src/main/java/io/ebean/common/AbstractBeanCollection.java b/ebean-api/src/main/java/io/ebean/common/AbstractBeanCollection.java index 912d9582f..c453d99cd 100644 --- a/ebean-api/src/main/java/io/ebean/common/AbstractBeanCollection.java +++ b/ebean-api/src/main/java/io/ebean/common/AbstractBeanCollection.java @@ -17,39 +17,28 @@ abstract class AbstractBeanCollection implements BeanCollection { private static final long serialVersionUID = 3365725236140187588L; protected final ReentrantLock lock = new ReentrantLock(); - protected boolean readOnly; - protected boolean disableLazyLoad; - /** * The Database this is associated with. (used for lazy fetch). */ protected transient BeanCollectionLoader loader; - protected transient ExpressionList filterMany; - /** * Flag set when registered with the batch loading context. */ protected boolean registeredWithLoadContext; - protected String ebeanServerName; - /** * The owning bean (used for lazy fetch). */ protected EntityBean ownerBean; - /** * The name of this property in the owning bean (used for lazy fetch). */ protected String propertyName; - protected ModifyHolder modifyHolder; - protected ModifyListenMode modifyListenMode; - protected boolean modifyListening; /** @@ -126,8 +115,7 @@ abstract class AbstractBeanCollection implements BeanCollection { void checkReadOnly() { if (readOnly) { - String msg = "This collection is in ReadOnly mode"; - throw new IllegalStateException(msg); + throw new IllegalStateException("This collection is in ReadOnly mode"); } } diff --git a/ebean-api/src/main/java/io/ebean/common/BeanList.java b/ebean-api/src/main/java/io/ebean/common/BeanList.java index 0a04eb472..22842fa14 100644 --- a/ebean-api/src/main/java/io/ebean/common/BeanList.java +++ b/ebean-api/src/main/java/io/ebean/common/BeanList.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.ListIterator; /** - * List capable of lazy loading. + * List capable of lazy loading and modification awareness. */ public final class BeanList extends AbstractBeanCollection implements List, BeanCollectionAdd { @@ -150,7 +150,6 @@ public final class BeanList extends AbstractBeanCollection implements List * Set the actual underlying list. *

* This is primarily for the deferred fetching function. - *

*/ @SuppressWarnings("unchecked") public void setActualList(List list) { @@ -206,12 +205,11 @@ public final class BeanList extends AbstractBeanCollection implements List * Specifically obj does not need to be a BeanList but any list. This does not * use the FindMany, fetchedMaxRows or finishedFetch properties in the equals * test. - *

*/ @Override - public boolean equals(Object obj) { + public boolean equals(Object other) { init(); - return list.equals(obj); + return list.equals(other); } @Override @@ -244,40 +242,40 @@ public final class BeanList extends AbstractBeanCollection implements List } @Override - public boolean add(E o) { + public boolean add(E bean) { checkReadOnly(); init(); if (modifyListening) { - if (list.add(o)) { - modifyAddition(o); + if (list.add(bean)) { + modifyAddition(bean); return true; } else { return false; } } - return list.add(o); + return list.add(bean); } @Override - public boolean addAll(Collection c) { + public boolean addAll(Collection beans) { checkReadOnly(); init(); if (modifyListening) { // all elements in c are added (no contains checking) - getModifyHolder().modifyAdditionAll(c); + getModifyHolder().modifyAdditionAll(beans); } - return list.addAll(c); + return list.addAll(beans); } @Override - public boolean addAll(int index, Collection c) { + public boolean addAll(int index, Collection beans) { checkReadOnly(); init(); if (modifyListening) { // all elements in c are added (no contains checking) - getModifyHolder().modifyAdditionAll(c); + getModifyHolder().modifyAdditionAll(beans); } - return list.addAll(index, c); + return list.addAll(index, beans); } @Override @@ -287,23 +285,23 @@ public final class BeanList extends AbstractBeanCollection implements List // and fetch just the Id's initClear(); if (modifyListening) { - for (E aList : list) { - getModifyHolder().modifyRemoval(aList); + for (E element : list) { + getModifyHolder().modifyRemoval(element); } } list.clear(); } @Override - public boolean contains(Object o) { + public boolean contains(Object bean) { init(); - return list.contains(o); + return list.contains(bean); } @Override - public boolean containsAll(Collection c) { + public boolean containsAll(Collection beans) { init(); - return list.containsAll(c); + return list.containsAll(beans); } @Override @@ -313,9 +311,9 @@ public final class BeanList extends AbstractBeanCollection implements List } @Override - public int indexOf(Object o) { + public int indexOf(Object bean) { init(); - return list.indexOf(o); + return list.indexOf(bean); } @Override @@ -327,31 +325,29 @@ public final class BeanList extends AbstractBeanCollection implements List @Override public Iterator iterator() { init(); - if (isReadOnly()) { + if (readOnly) { return new ReadOnlyListIterator<>(list.listIterator()); } if (modifyListening) { - Iterator it = list.iterator(); - return new ModifyIterator<>(this, it); + return new ModifyIterator<>(this, list.iterator()); } return list.iterator(); } @Override - public int lastIndexOf(Object o) { + public int lastIndexOf(Object bean) { init(); - return list.lastIndexOf(o); + return list.lastIndexOf(bean); } @Override public ListIterator listIterator() { init(); - if (isReadOnly()) { + if (readOnly) { return new ReadOnlyListIterator<>(list.listIterator()); } if (modifyListening) { - ListIterator it = list.listIterator(); - return new ModifyListIterator<>(this, it); + return new ModifyListIterator<>(this, list.listIterator()); } return list.listIterator(); } @@ -359,12 +355,11 @@ public final class BeanList extends AbstractBeanCollection implements List @Override public ListIterator listIterator(int index) { init(); - if (isReadOnly()) { + if (readOnly) { return new ReadOnlyListIterator<>(list.listIterator(index)); } if (modifyListening) { - ListIterator it = list.listIterator(index); - return new ModifyListIterator<>(this, it); + return new ModifyListIterator<>(this, list.listIterator(index)); } return list.listIterator(index); } @@ -389,17 +384,17 @@ public final class BeanList extends AbstractBeanCollection implements List } @Override - public boolean remove(Object o) { + public boolean remove(Object bean) { checkReadOnly(); init(); if (modifyListening) { - boolean isRemove = list.remove(o); + boolean isRemove = list.remove(bean); if (isRemove) { - modifyRemoval(o); + modifyRemoval(bean); } return isRemove; } - return list.remove(o); + return list.remove(bean); } @Override @@ -463,7 +458,7 @@ public final class BeanList extends AbstractBeanCollection implements List @Override public List subList(int fromIndex, int toIndex) { init(); - if (isReadOnly()) { + if (readOnly) { return Collections.unmodifiableList(list.subList(fromIndex, toIndex)); } if (modifyListening) { @@ -479,13 +474,13 @@ public final class BeanList extends AbstractBeanCollection implements List } @Override - public T[] toArray(T[] a) { + public T[] toArray(T[] array) { init(); //noinspection SuspiciousToArrayCall - return list.toArray(a); + return list.toArray(array); } - private static class ReadOnlyListIterator implements ListIterator, Serializable { + private static final class ReadOnlyListIterator implements ListIterator, Serializable { private static final long serialVersionUID = 3097271091406323699L; diff --git a/ebean-api/src/main/java/io/ebean/common/BeanMap.java b/ebean-api/src/main/java/io/ebean/common/BeanMap.java index 454642d55..3809a9d25 100644 --- a/ebean-api/src/main/java/io/ebean/common/BeanMap.java +++ b/ebean-api/src/main/java/io/ebean/common/BeanMap.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Set; /** - * Map capable of lazy loading. + * Map capable of lazy loading and modification aware. */ public final class BeanMap extends AbstractBeanCollection implements Map { @@ -247,7 +247,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma @Override public Set> entrySet() { init(); - if (isReadOnly()) { + if (readOnly) { return Collections.unmodifiableSet(map.entrySet()); } return modifyListening ? new ModifyEntrySet<>(this, map.entrySet()) : map.entrySet(); @@ -268,7 +268,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma @Override public Set keySet() { init(); - if (isReadOnly()) { + if (readOnly) { return Collections.unmodifiableSet(map.keySet()); } return modifyListening ? new ModifyKeySet<>(this, map.keySet()) : map.keySet(); @@ -339,7 +339,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma @Override public Collection values() { init(); - if (isReadOnly()) { + if (readOnly) { return Collections.unmodifiableCollection(map.values()); } return modifyListening ? new ModifyCollection<>(this, map.values()) : map.values(); diff --git a/ebean-api/src/main/java/io/ebean/common/BeanSet.java b/ebean-api/src/main/java/io/ebean/common/BeanSet.java index 683b2c1f9..6440362e4 100644 --- a/ebean-api/src/main/java/io/ebean/common/BeanSet.java +++ b/ebean-api/src/main/java/io/ebean/common/BeanSet.java @@ -9,7 +9,7 @@ import java.util.LinkedHashSet; import java.util.Set; /** - * Set capable of lazy loading. + * Set capable of lazy loading and modification aware. */ public final class BeanSet extends AbstractBeanCollection implements Set, BeanCollectionAdd { @@ -210,27 +210,27 @@ public final class BeanSet extends AbstractBeanCollection implements Set addCollection) { + public boolean addAll(Collection beans) { checkReadOnly(); init(); if (modifyListening) { boolean changed = false; - for (E bean : addCollection) { + for (E bean : beans) { if (set.add(bean)) { // register the addition of the bean modifyAddition(bean); @@ -239,7 +239,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set c) { + public boolean containsAll(Collection beans) { init(); - return set.containsAll(c); + return set.containsAll(beans); } @Override @@ -275,7 +275,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set iterator() { init(); - if (isReadOnly()) { + if (readOnly) { return new ReadOnlyIterator<>(set.iterator()); } if (modifyListening) { @@ -285,17 +285,17 @@ public final class BeanSet extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set T[] toArray(T[] a) { + public T[] toArray(T[] array) { init(); //noinspection SuspiciousToArrayCall - return set.toArray(a); + return set.toArray(array); } - private static class ReadOnlyIterator implements Iterator, Serializable { + private static final class ReadOnlyIterator implements Iterator, Serializable { private static final long serialVersionUID = 2577697326745352605L; 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 c0ce6c264..d1aae9fb2 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 @@ -1,5 +1,9 @@ package io.ebeaninternal.server.deploy; +import io.ebean.bean.BeanCollection; +import io.ebean.bean.EntityBean; +import io.ebean.common.BeanList; +import io.ebean.common.BeanSet; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -12,18 +16,17 @@ import io.ebeaninternal.server.query.CQueryCollectionAdd; public final class BeanCollectionHelpFactory { @SuppressWarnings("rawtypes") - private static final BeanListHelp LIST_HELP = new BeanListHelp(); + private static final CQueryCollectionAdd LIST_HELP = new ListAdd(); @SuppressWarnings("rawtypes") - private static final BeanSetHelp SET_HELP = new BeanSetHelp(); + private static final CQueryCollectionAdd SET_HELP = new SetAdd(); /** * Create the helper based on the many property. */ public static BeanCollectionHelp create(BeanPropertyAssocMany many) { boolean elementCollection = many.isElementCollection(); - ManyType manyType = many.manyType(); - switch (manyType) { + switch (many.manyType()) { case LIST: return elementCollection ? new BeanListHelpElement<>(many) : new BeanListHelp<>(many); case SET: @@ -31,7 +34,7 @@ public final class BeanCollectionHelpFactory { case MAP: return elementCollection ? new BeanMapHelpElement<>(many) : new BeanMapHelp<>(many); default: - throw new RuntimeException("Invalid type " + manyType); + throw new RuntimeException("Invalid type " + many.manyType()); } } @@ -53,4 +56,30 @@ public final class BeanCollectionHelpFactory { } } + private static final class ListAdd implements CQueryCollectionAdd { + + @Override + public BeanCollection createEmptyNoParent() { + return new BeanList<>(); + } + + @Override + public void add(BeanCollection collection, EntityBean bean, boolean withCheck) { + collection.internalAdd(bean); + } + } + + private static final class SetAdd implements CQueryCollectionAdd { + + @Override + public BeanCollection createEmptyNoParent() { + return new BeanSet<>(); + } + + @Override + public void add(BeanCollection collection, EntityBean bean, boolean withCheck) { + collection.internalAdd(bean); + } + } + }