Package com.helger.commons.id.factory
Class AbstractPersistingLongIDFactory
- java.lang.Object
-
- com.helger.commons.id.factory.AbstractPersistingLongIDFactory
-
- All Implemented Interfaces:
IBaseIDFactory,ILongIDFactory
- Direct Known Subclasses:
FileLongIDFactory
@ThreadSafe public abstract class AbstractPersistingLongIDFactory extends Object implements ILongIDFactory
This implementation ofILongIDFactoryreads IDs from a device. It does it by reserving a range of n IDs so that not each ID reservation requires IO. If only 1 ID is effectively used, the other n-1 IDs are lost and will never be assigned to any object again.- Author:
- Philip Helger
-
-
Field Summary
Fields Modifier and Type Field Description protected SimpleLockm_aLock
-
Constructor Summary
Constructors Modifier Constructor Description protectedAbstractPersistingLongIDFactory(int nReserveCount)Constructor.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description booleanequals(Object o)longgetNewID()Create a new unique long ID.intgetReserveCount()inthashCode()protected abstract longreadAndUpdateIDCounter(int nReserveCount)Read the current ID from the device.StringtoString()
-
-
-
Field Detail
-
m_aLock
protected final SimpleLock m_aLock
-
-
Constructor Detail
-
AbstractPersistingLongIDFactory
protected AbstractPersistingLongIDFactory(@Nonnegative int nReserveCount)
Constructor.- Parameters:
nReserveCount- The number of IDs to reserve per persistence layer access. Must be > 0.
-
-
Method Detail
-
getReserveCount
@Nonnegative public final int getReserveCount()
- Returns:
- The number of IDs to reserve, as provided in the constructor. Always > 0.
-
readAndUpdateIDCounter
@IsLocked(WRITE) protected abstract long readAndUpdateIDCounter(@Nonnegative int nReserveCount)
Read the current ID from the device. In case the method is called for a non-initialized device, 0 should be returned.
The update should write the read value plus the passed reserve count back to the device. This method should perform an atomic read and update to avoid that ID can be reused.
Pseudo code:protected long readAndUpdateIDCounter (int nReserveCount) { final long nRead = FileIO.read (file); FileIO.write (file, nRead + nReserveCount); return nRead; }- Parameters:
nReserveCount- the number that should be added to the read value. Always > 0.- Returns:
- 0 if this method is called for a non-initialized device, the value
read from the device otherwise or
CGlobal.ILLEGAL_ULONGin case of an error.
-
getNewID
public final long getNewID()
Description copied from interface:ILongIDFactoryCreate a new unique long ID.- Specified by:
getNewIDin interfaceILongIDFactory- Returns:
- The newly created ID.
-
-