Refactoring BlockAllocatorBasedIdGenerator.java

Allowing first call to getNewId() to throw an NPE, and handling initial setup in catch block

Change-Id: I409aa9c8a309dbbf4fc3738c3870ec4d91831303
This commit is contained in:
Brian O'Connor 2015-06-24 16:08:09 -04:00 committed by Gerrit Code Review
parent bcf1a48e89
commit 390c99701b

View File

@ -21,6 +21,8 @@ import org.onosproject.core.IdBlock;
import org.onosproject.core.IdGenerator;
import org.onosproject.core.UnavailableIdException;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Base class of {@link IdGenerator} implementations which use {@link IdBlockAllocator} as
* backend.
@ -37,27 +39,29 @@ public class BlockAllocatorBasedIdGenerator implements IdGenerator {
* @param allocator the ID block allocator to use
*/
protected BlockAllocatorBasedIdGenerator(IdBlockAllocator allocator) {
this.allocator = allocator;
this.allocator = checkNotNull(allocator, "allocator cannot be null");
this.initialized = new AtomicBoolean(false);
}
@Override
public long getNewId() {
try {
if (!initialized.get()) {
synchronized (allocator) {
if (!initialized.get()) {
idBlock = allocator.allocateUniqueIdBlock();
initialized.set(true);
}
}
}
return idBlock.getNextId();
} catch (UnavailableIdException e) {
synchronized (allocator) {
idBlock = allocator.allocateUniqueIdBlock();
}
return idBlock.getNextId();
} catch (NullPointerException e) {
synchronized (allocator) {
if (!initialized.get()) {
idBlock = allocator.allocateUniqueIdBlock();
initialized.set(true);
return idBlock.getNextId();
} else {
throw e;
}
}
}
}
}