*/
public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory implements AsyncUuidFactory {
private SecureRandom secureRandom;
- protected TimeUuidState timeUuidState;
+ protected ConcurrentTimeUuidState timeUuidState;
+
+ private NodeIdSupplier nodeIdSupplier;
public AbstractAsyncUuidFactory() {
secureRandom = newSecureRandom();
* ABSTRACT METHODS
*/
- protected abstract UUID newTimeUUID();
+ protected abstract SecureRandom newSecureRandom();
- protected abstract UUID newTimeUUIDwithMacAddress();
+ /*
+ * STATE
+ */
+ public void reset() {
+ if (nodeIdSupplier == null)
+ throw new IllegalStateException("No node id supplier available");
+ long nodeIdBase = nodeIdSupplier.get();
+ timeUuidState.reset(nodeIdBase);
+ }
- protected abstract SecureRandom newSecureRandom();
+ public void setNodeIdSupplier(NodeIdSupplier nodeIdSupplier) {
+ this.nodeIdSupplier = nodeIdSupplier;
+ reset();
+ }
/*
* SYNC OPERATIONS
return newRandomUUID(ThreadLocalRandom.current());
}
+ protected UUID newTimeUUID() {
+ if (nodeIdSupplier == null)
+ throw new IllegalStateException("No node id supplier available");
+ UUID uuid = new UUID(timeUuidState.getMostSignificantBits(), timeUuidState.getLeastSignificantBits());
+ long clockSequence = timeUuidState.getClockSequence();
+ long timestamp = timeUuidState.getLastTimestamp();
+ // assert uuid.node() == longFromBytes(node);
+ assert uuid.timestamp() == timestamp;
+ assert uuid.clockSequence() == clockSequence
+ : "uuid.clockSequence()=" + uuid.clockSequence() + " clockSequence=" + clockSequence;
+ assert uuid.version() == 1;
+ assert uuid.variant() == 2;
+
+ return uuid;
+ }
+
/*
* ASYNC OPERATIONS (heavy)
*/
return request(futureTimeUUID());
}
- @Override
- public CompletionStage<UUID> requestTimeUUIDwithMacAddress() {
- return request(futureTimeUUIDwithMacAddress());
- }
-
/*
* ASYNC OPERATIONS (light)
*/
public ForkJoinTask<UUID> futureTimeUUID() {
return submit(this::newTimeUUID);
}
-
- @Override
- public ForkJoinTask<UUID> futureTimeUUIDwithMacAddress() {
- return submit(this::newTimeUUIDwithMacAddress);
- }
-
-// @Override
-// public UUID timeUUID() {
-// if (ConcurrentTimeUuidState.isTimeUuidThread.get())
-// return newTimeUUID();
-// else
-// return futureTimeUUID().join();
-// }
-//
-// @Override
-// public UUID timeUUIDwithMacAddress() {
-// if (ConcurrentTimeUuidState.isTimeUuidThread.get())
-// return newTimeUUIDwithMacAddress();
-// else
-// return futureTimeUUIDwithMacAddress().join();
-// }
-
}