package org.apereo.cas.util.gen;
import java.util.concurrent.atomic.AtomicLong;
/**
* The default numeric generator for generating long values. Implementation
* allows for wrapping (to restart count) if the maximum is reached.
*
* @author Scott Battaglia
* @since 3.0.0
*/
public class DefaultLongNumericGenerator implements LongNumericGenerator {
/** The maximum length the string can be. */
private static final int MAX_STRING_LENGTH = Long.toString(Long.MAX_VALUE)
.length();
/** The minimum length the String can be. */
private static final int MIN_STRING_LENGTH = 1;
private AtomicLong count;
/**
* Instantiates a new default long numeric generator.
*/
public DefaultLongNumericGenerator() {
this(0);
// nothing to do
}
/**
* Instantiates a new default long numeric generator.
*
* @param initialValue the initial value
*/
public DefaultLongNumericGenerator(final long initialValue) {
this.count = new AtomicLong(initialValue);
}
@Override
public long getNextLong() {
return this.getNextValue();
}
@Override
public String getNextNumberAsString() {
return Long.toString(this.getNextValue());
}
@Override
public int maxLength() {
return DefaultLongNumericGenerator.MAX_STRING_LENGTH;
}
@Override
public int minLength() {
return DefaultLongNumericGenerator.MIN_STRING_LENGTH;
}
/**
* Gets the next value.
*
* @return the next value. If the count has reached {@link Long#MAX_VALUE},
* then {@link Long#MAX_VALUE} is returned. Otherwise, the next increment.
*/
protected long getNextValue() {
if (this.count.compareAndSet(Long.MAX_VALUE, 0)) {
return Long.MAX_VALUE;
}
return this.count.getAndIncrement();
}
}