Class IndirectSet<E>
- java.lang.Object
-
- org.eclipse.persistence.indirection.IndirectSet<E>
-
- Type Parameters:
E
- the type of elements maintained by this set
- All Implemented Interfaces:
Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,Set<E>
,ChangeTracker
,CollectionChangeTracker
,IndirectCollection<E,Set<E>>
,IndirectContainer<Set<E>>
public class IndirectSet<E> extends Object implements CollectionChangeTracker, Set<E>, IndirectCollection<E,Set<E>>, Cloneable, Serializable
IndirectSet is an example implementation of the Set protocol that allows a domain class to take advantage of TopLink Indirection without having to declare its instance variable as a ValueHolderInterface.To use an IndirectSet:
- Declare the appropriate instance variable with type Set (or Collection).
- Send the message #useTransparentCollection() to the appropriate CollectionMapping.
- Send the message #useCollectionClass(IndirectSet.class) to the same CollectionMapping. (The order of these two message sends is significant.)
Implementation notes:
- The Set interface is implemented by delegating nearly every message to the Set held on to by the 'delegate' instance variable. (The 'delegate' will be either a HashSet or yet another IndirectSet.)
- The IndirectContainer interface is implemented in a straightforward
fashion:
- #get- and #setValueHolder() are implemented as simple accessors for the 'valueHolder' instance variable. (Note that #setValueHolder() clears out the 'delegate' instance variable, since its contents are invalidated by the arrival of a new value holder.)
- #isInstantiated() is simply delegated to the value holder.
- TopLink requires that the Cloneable interface be implemented. The #clone() method must clone the 'delegate'. (The implementation here uses reflection to invoke the #clone() method because it is not included in the common interface shared by IndirectSet and its base delegate class, HashSet; namely, Set.)
- TopLink requires that the Serializable interface be implemented.
- The database read is ultimately triggered when one of the "delegated" methods makes the first call to #getDelegate(), which in turn calls #buildDelegate(), which sends the message #getValue() to the value holder. The value holder performs the database read.
- For debugging purposes, #toString() will not trigger a database read. This is not required behavior.
- See Also:
CollectionMapping
, Serialized Form- Author:
- Big Country
- Since:
- TOPLink/Java 3.0+
-
-
Field Summary
Fields Modifier and Type Field Description protected int
initialCapacity
Store initial size for lazy init.protected float
loadFactor
Store load factor for lazy init.
-
Constructor Summary
Constructors Constructor Description IndirectSet()
Construct an empty IndirectSet.IndirectSet(int initialCapacity)
Construct an empty IndirectSet with the specified initial capacity.IndirectSet(int initialCapacity, float loadFactor)
Construct an empty IndirectSet with the specified initial capacity and load factor.IndirectSet(Collection<? extends E> c)
Construct an IndirectSet containing the elements of the specified collection.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description PropertyChangeListener
_persistence_getPropertyChangeListener()
INTERNAL: Return the property change listener for change tracking.void
_persistence_setPropertyChangeListener(PropertyChangeListener changeListener)
INTERNAL: Set the property change listener for change tracking.boolean
add(E element)
boolean
addAll(Collection<? extends E> c)
protected Set<E>
buildDelegate()
INTERNAL: Return the freshly-built delegate.void
clear()
void
clearDeferredChanges()
INTERNAL: clear any changes that have been deferred to instantiation.Object
clone()
protected Set<E>
cloneDelegate()
INTERNAL: Clone the delegate.boolean
contains(Object element)
boolean
containsAll(Collection<?> c)
boolean
equals(Object o)
void
forEach(Consumer<? super E> action)
Collection<E>
getAddedElements()
INTERNAL: Return the elements that have been added before instantiation.protected Set<E>
getDelegate()
INTERNAL: Check whether the contents have been read from the database.Set<E>
getDelegateObject()
INTERNAL: Return the real collection object.Collection<E>
getRemovedElements()
INTERNAL: Return the elements that have been removed before instantiation.String
getTrackedAttributeName()
INTERNAL: Return the mapping attribute name, used to raise change events.ValueHolderInterface<Set<E>>
getValueHolder()
INTERNAL: Return the valueHolder.boolean
hasAddedElements()
INTERNAL: Return if any elements that have been added before instantiation.boolean
hasBeenRegistered()
INTERNAL: Return whether this IndirectSet has been registered in a UnitOfWorkboolean
hasDeferredChanges()
INTERNAL: Return if any elements that have been added or removed before instantiation.int
hashCode()
boolean
hasRemovedElements()
INTERNAL: Return if any elements that have been removed before instantiation.boolean
hasTrackedPropertyChangeListener()
INTERNAL: Return if the collection has a property change listener for change tracking.boolean
isEmpty()
boolean
isInstantiated()
Return whether the contents have been read from the database.protected boolean
isRelationshipMaintenanceRequired()
Iterator<E>
iterator()
Stream<E>
parallelStream()
protected void
raiseAddChangeEvent(Object element)
Raise the add change event and relationship maintainence.protected void
raiseRemoveChangeEvent(Object element)
Raise the remove change event.boolean
remove(Object element)
boolean
removeAll(Collection<?> c)
boolean
removeIf(Predicate<? super E> filter)
boolean
retainAll(Collection<?> c)
void
setTrackedAttributeName(String attributeName)
INTERNAL: Set the mapping attribute name, used to raise change events.void
setUseLazyInstantiation(boolean useLazyInstantiation)
INTERNAL Set whether this collection should attempt do deal with adds and removes without retrieving the collection from the dBvoid
setValueHolder(ValueHolderInterface<Set<E>> valueHolder)
INTERNAL: Set the value holder.protected boolean
shouldAvoidInstantiation()
INTERNAL: Return if add/remove should trigger instantiation or avoid.protected boolean
shouldUseLazyInstantiation()
Return whether this collection should attempt do deal with adds and removes without retrieving the collection from the dBint
size()
Spliterator<E>
spliterator()
Stream<E>
stream()
Object[]
toArray()
<T> T[]
toArray(T[] a)
String
toString()
Use the delegate's #toString(); but wrap it with braces to indicate there is a bit of indirection.
-
-
-
Constructor Detail
-
IndirectSet
public IndirectSet()
Construct an empty IndirectSet.
-
IndirectSet
public IndirectSet(int initialCapacity)
Construct an empty IndirectSet with the specified initial capacity.- Parameters:
initialCapacity
- the initial capacity of the set- Throws:
IllegalArgumentException
- if the specified initial capacity is negative
-
IndirectSet
public IndirectSet(int initialCapacity, float loadFactor)
Construct an empty IndirectSet with the specified initial capacity and load factor.- Parameters:
initialCapacity
- the initial capacity of the setloadFactor
- the load factor of the set- Throws:
IllegalArgumentException
- if the specified initial capacity is negative
-
IndirectSet
public IndirectSet(Collection<? extends E> c)
Construct an IndirectSet containing the elements of the specified collection.- Parameters:
c
- the initial elements of the set
-
-
Method Detail
-
isRelationshipMaintenanceRequired
protected boolean isRelationshipMaintenanceRequired()
-
add
public boolean add(E element)
- Specified by:
add
in interfaceCollection<E>
- Specified by:
add
in interfaceSet<E>
- See Also:
Set.add(java.lang.Object)
-
addAll
public boolean addAll(Collection<? extends E> c)
- Specified by:
addAll
in interfaceCollection<E>
- Specified by:
addAll
in interfaceSet<E>
- See Also:
Set.addAll(java.util.Collection)
-
clear
public void clear()
- Specified by:
clear
in interfaceCollection<E>
- Specified by:
clear
in interfaceSet<E>
- See Also:
Set.clear()
-
clearDeferredChanges
public void clearDeferredChanges()
INTERNAL: clear any changes that have been deferred to instantiation. Indirect collections with change tracking avoid instantiation on add/remove.- Specified by:
clearDeferredChanges
in interfaceIndirectCollection<E,Set<E>>
-
clone
public Object clone()
- Overrides:
clone
in classObject
- See Also:
This will result in a database query if necessary.
-
contains
public boolean contains(Object element)
- Specified by:
contains
in interfaceCollection<E>
- Specified by:
contains
in interfaceSet<E>
- See Also:
Set.contains(java.lang.Object)
-
containsAll
public boolean containsAll(Collection<?> c)
- Specified by:
containsAll
in interfaceCollection<E>
- Specified by:
containsAll
in interfaceSet<E>
- See Also:
Set.containsAll(java.util.Collection)
-
equals
public boolean equals(Object o)
- Specified by:
equals
in interfaceCollection<E>
- Specified by:
equals
in interfaceSet<E>
- Overrides:
equals
in classObject
- See Also:
Set.equals(java.lang.Object)
-
spliterator
public Spliterator<E> spliterator()
- Specified by:
spliterator
in interfaceCollection<E>
- Specified by:
spliterator
in interfaceIterable<E>
- Specified by:
spliterator
in interfaceSet<E>
-
parallelStream
public Stream<E> parallelStream()
- Specified by:
parallelStream
in interfaceCollection<E>
-
stream
public Stream<E> stream()
- Specified by:
stream
in interfaceCollection<E>
-
removeIf
public boolean removeIf(Predicate<? super E> filter)
- Specified by:
removeIf
in interfaceCollection<E>
-
getDelegate
protected Set<E> getDelegate()
INTERNAL: Check whether the contents have been read from the database. If they have not, read them and set the delegate.
-
getDelegateObject
public Set<E> getDelegateObject()
INTERNAL: Return the real collection object. This will force instantiation.- Specified by:
getDelegateObject
in interfaceIndirectCollection<E,Set<E>>
-
getValueHolder
public ValueHolderInterface<Set<E>> getValueHolder()
INTERNAL: Return the valueHolder.- Specified by:
getValueHolder
in interfaceIndirectContainer<E>
- Returns:
- org.eclipse.persistence.indirection.ValueHolderInterface A representation of the valueholder * which this container uses
-
hasBeenRegistered
public boolean hasBeenRegistered()
INTERNAL: Return whether this IndirectSet has been registered in a UnitOfWork
-
hashCode
public int hashCode()
- Specified by:
hashCode
in interfaceCollection<E>
- Specified by:
hashCode
in interfaceSet<E>
- Overrides:
hashCode
in classObject
- See Also:
Set.hashCode()
-
isEmpty
public boolean isEmpty()
- Specified by:
isEmpty
in interfaceCollection<E>
- Specified by:
isEmpty
in interfaceSet<E>
- See Also:
Set.isEmpty()
-
isInstantiated
public boolean isInstantiated()
Return whether the contents have been read from the database.- Specified by:
isInstantiated
in interfaceIndirectContainer<E>
-
iterator
public Iterator<E> iterator()
- Specified by:
iterator
in interfaceCollection<E>
- Specified by:
iterator
in interfaceIterable<E>
- Specified by:
iterator
in interfaceSet<E>
- See Also:
Set.iterator()
-
remove
public boolean remove(Object element)
- Specified by:
remove
in interfaceCollection<E>
- Specified by:
remove
in interfaceSet<E>
- See Also:
Set.remove(java.lang.Object)
-
removeAll
public boolean removeAll(Collection<?> c)
- Specified by:
removeAll
in interfaceCollection<E>
- Specified by:
removeAll
in interfaceSet<E>
- See Also:
Set.removeAll(java.util.Collection)
-
retainAll
public boolean retainAll(Collection<?> c)
- Specified by:
retainAll
in interfaceCollection<E>
- Specified by:
retainAll
in interfaceSet<E>
- See Also:
Set.retainAll(java.util.Collection)
-
setValueHolder
public void setValueHolder(ValueHolderInterface<Set<E>> valueHolder)
INTERNAL: Set the value holder. Note that the delegate must be cleared out.- Specified by:
setValueHolder
in interfaceIndirectContainer<E>
-
setUseLazyInstantiation
public void setUseLazyInstantiation(boolean useLazyInstantiation)
INTERNAL Set whether this collection should attempt do deal with adds and removes without retrieving the collection from the dB- Specified by:
setUseLazyInstantiation
in interfaceIndirectCollection<E,Set<E>>
-
size
public int size()
- Specified by:
size
in interfaceCollection<E>
- Specified by:
size
in interfaceSet<E>
- See Also:
Set.size()
-
shouldUseLazyInstantiation
protected boolean shouldUseLazyInstantiation()
Return whether this collection should attempt do deal with adds and removes without retrieving the collection from the dB- Returns:
-
toArray
public Object[] toArray()
- Specified by:
toArray
in interfaceCollection<E>
- Specified by:
toArray
in interfaceSet<E>
- See Also:
Set.toArray()
-
toArray
public <T> T[] toArray(T[] a)
- Specified by:
toArray
in interfaceCollection<E>
- Specified by:
toArray
in interfaceSet<E>
- See Also:
Set.toArray(java.lang.Object[])
-
toString
public String toString()
Use the delegate's #toString(); but wrap it with braces to indicate there is a bit of indirection. Don't allow this method to trigger a database read.- Overrides:
toString
in classObject
- See Also:
AbstractCollection.toString()
-
raiseAddChangeEvent
protected void raiseAddChangeEvent(Object element)
Raise the add change event and relationship maintainence.
-
raiseRemoveChangeEvent
protected void raiseRemoveChangeEvent(Object element)
Raise the remove change event.
-
_persistence_getPropertyChangeListener
public PropertyChangeListener _persistence_getPropertyChangeListener()
INTERNAL: Return the property change listener for change tracking.- Specified by:
_persistence_getPropertyChangeListener
in interfaceChangeTracker
-
hasTrackedPropertyChangeListener
public boolean hasTrackedPropertyChangeListener()
INTERNAL: Return if the collection has a property change listener for change tracking.
-
_persistence_setPropertyChangeListener
public void _persistence_setPropertyChangeListener(PropertyChangeListener changeListener)
INTERNAL: Set the property change listener for change tracking.- Specified by:
_persistence_setPropertyChangeListener
in interfaceChangeTracker
-
getTrackedAttributeName
public String getTrackedAttributeName()
INTERNAL: Return the mapping attribute name, used to raise change events.- Specified by:
getTrackedAttributeName
in interfaceCollectionChangeTracker
-
setTrackedAttributeName
public void setTrackedAttributeName(String attributeName)
INTERNAL: Set the mapping attribute name, used to raise change events. This is required if the change listener is set.- Specified by:
setTrackedAttributeName
in interfaceCollectionChangeTracker
-
getRemovedElements
public Collection<E> getRemovedElements()
INTERNAL: Return the elements that have been removed before instantiation.- Specified by:
getRemovedElements
in interfaceIndirectCollection<E,Set<E>>
-
getAddedElements
public Collection<E> getAddedElements()
INTERNAL: Return the elements that have been added before instantiation.- Specified by:
getAddedElements
in interfaceIndirectCollection<E,Set<E>>
-
hasAddedElements
public boolean hasAddedElements()
INTERNAL: Return if any elements that have been added before instantiation.
-
hasRemovedElements
public boolean hasRemovedElements()
INTERNAL: Return if any elements that have been removed before instantiation.
-
hasDeferredChanges
public boolean hasDeferredChanges()
INTERNAL: Return if any elements that have been added or removed before instantiation.- Specified by:
hasDeferredChanges
in interfaceIndirectCollection<E,Set<E>>
-
shouldAvoidInstantiation
protected boolean shouldAvoidInstantiation()
INTERNAL: Return if add/remove should trigger instantiation or avoid. Current instantiation is avoided is using change tracking.
-
-