package de.invesdwin.util.lang;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.concurrent.ThreadSafe;
import de.invesdwin.util.collections.loadingcache.ALoadingCache;
@ThreadSafe
public class UniqueNameGenerator {
private final ALoadingCache<String, AtomicLong> name_sequencenumber = new ALoadingCache<String, AtomicLong>() {
@Override
protected AtomicLong loadValue(final String key) {
return new AtomicLong(getInitialValue());
}
};
/**
* Generates IDs in the schema of [Name]_[SequenceNumber].
*/
public synchronized String get(final String name) {
final AtomicLong sequenceNumber = name_sequencenumber.get(name);
final long sequenceNumberIncremented = sequenceNumber.incrementAndGet();
if (sequenceNumberIncremented == 1) {
return name;
} else {
return Strings.addSuffixToFileName(name, "_" + (sequenceNumberIncremented - 1));
}
}
/**
* Initialize with 1 to skip the first value with a number
*/
protected long getInitialValue() {
return 0;
}
}