T
- type of object being stored@ThreadSafe public class IndexingObjectStore<T> extends Object
This class is used to store instances of objects that may be created independently but are, in fact, the same object. For example, KeyInfo XML structures contain keys, certs, and CRLs. Multiple unique instances of a KeyInfo may contain, and separately construct, the exact same cert. KeyInfo could, therefore, create a class-level instance of this object store and put certs within it. In this manner the cert is only sitting in memory once and each KeyInfo simply stores a reference (index) to stored object.
This store uses basic reference counting to keep track of how many of the respective objects are pointing to an
entry. Adding an object that already exists, as determined by the object's equals()
method, simply
increments the reference counter. Removing an object decrements the counter. Only when the counter reaches zero is
the object actually freed for garbage collection.
Note: the instance of an object returned by get(String)
need not be the same object as
stored via put(Object)
. However, the instances will be equal according to their equals()
.
The indexing and storage is based on use of Map
, so the normal caveats related to use of hash-based
collection types apply: if the stored object's hashCode()
and equals()
methods are
implemented based on mutable properties of the object, then those object instance's properties should not
be mutated while the object is stored, otherwise unpredictable behavior will result.
Modifier and Type | Class and Description |
---|---|
private class |
IndexingObjectStore.StoredObjectWrapper
Wrapper class that keeps track of the reference count for a stored object.
|
Modifier and Type | Field and Description |
---|---|
private Map<T,Integer> |
indexStore
Map of object instances to the index value used to reference them externally.
|
private int |
lastIndex
The last index sequence used.
|
private Map<String,IndexingObjectStore.StoredObjectWrapper> |
objectStore
Backing object data store.
|
private ReadWriteLock |
rwLock
Read/Write lock used to control synchronization over the backing data store.
|
Constructor and Description |
---|
IndexingObjectStore()
Constructor.
|
Modifier and Type | Method and Description |
---|---|
void |
clear()
Clears the object store.
|
boolean |
containsIndex(String index)
Checks whether the store contains an object registered under the given index.
|
boolean |
containsInstance(T instance)
Checks whether the store contains an object instance equal to the specified one.
|
T |
get(String index)
Gets a registered object by its index.
|
protected String |
getIndex(T object)
Get the index for the specified object.
|
boolean |
isEmpty()
Checks if the store is empty.
|
String |
put(T object)
Adds the given object to the store.
|
void |
remove(String index)
Removes the object associated with the given index.
|
protected void |
removeIndex(T object)
Remove the index for the specified object.
|
int |
size()
Gets the total number of unique items in the store.
|
private ReadWriteLock rwLock
private Map<String,IndexingObjectStore.StoredObjectWrapper> objectStore
private Map<T,Integer> indexStore
private int lastIndex
public void clear()
public boolean containsIndex(String index)
index
- the index to checkpublic boolean containsInstance(T instance)
instance
- the object instance to checkpublic boolean isEmpty()
public String put(T object)
object
- the object to add to the store, may be nullpublic T get(String index)
index
- the index of an object previously registered, may be nullpublic void remove(String index)
index
- the index of the object, may be nullpublic int size()
protected String getIndex(T object)
object
- the target objectprotected void removeIndex(T object)
object
- the target indexCopyright © 1999–2019. All rights reserved.