Package org.apache.james.mime4j.storage
Class MultiReferenceStorage
- java.lang.Object
-
- org.apache.james.mime4j.storage.MultiReferenceStorage
-
- All Implemented Interfaces:
Storage
public class MultiReferenceStorage extends java.lang.Object implements Storage
A wrapper around another
Storagethat also maintains a reference counter. The inner storage gets deleted only if the reference counter reaches zero.Reference counting is used to delete the storage when it is no longer needed. So, any users of this class should note:
- The reference count is set up one on construction. In all other cases,
addReference()should be called when the storage is shared. - The caller of
addReference()should ensure thatdelete()is called once and only once. - Sharing the
Storageinstance passed intoMultiReferenceStorage(Storage)may lead to miscounting and premature deletion
-
-
Field Summary
Fields Modifier and Type Field Description private intreferenceCounterprivate Storagestorage
-
Constructor Summary
Constructors Constructor Description MultiReferenceStorage(Storage storage)Creates a newMultiReferenceStorageinstance for the given back-end.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddReference()Increments the reference counter.private booleandecrementCounter()Synchronized decrement of reference count.voiddelete()Decrements the reference counter and deletes the innerStorageobject if the reference counter reaches zero.java.io.InputStreamgetInputStream()Returns the input stream of the innerStorageobject.private voidincrementCounter()Synchronized increment of reference count.
-
-
-
Field Detail
-
storage
private final Storage storage
-
referenceCounter
private int referenceCounter
-
-
Constructor Detail
-
MultiReferenceStorage
public MultiReferenceStorage(Storage storage)
Creates a newMultiReferenceStorageinstance for the given back-end. The reference counter is initially set to one so the caller does not have to calladdReference()after this constructor.- Parameters:
storage- storage back-end that should be reference counted.- Throws:
java.lang.IllegalArgumentException- when storage is null
-
-
Method Detail
-
addReference
public void addReference()
Increments the reference counter.- Throws:
java.lang.IllegalStateException- if the reference counter is zero which implies that the backing storage has already been deleted.
-
delete
public void delete()
Decrements the reference counter and deletes the innerStorageobject if the reference counter reaches zero.A client that holds a reference to this object must make sure not to invoke this method a second time.
-
getInputStream
public java.io.InputStream getInputStream() throws java.io.IOExceptionReturns the input stream of the innerStorageobject.- Specified by:
getInputStreamin interfaceStorage- Returns:
- an input stream.
- Throws:
java.io.IOException- if an I/O error occurs.
-
incrementCounter
private void incrementCounter()
Synchronized increment of reference count.- Throws:
java.lang.IllegalStateException- when counter is already zero
-
decrementCounter
private boolean decrementCounter()
Synchronized decrement of reference count.- Returns:
- true when counter has reached zero, false otherwise
- Throws:
java.lang.IllegalStateException- when counter is already zero
-
-