1 package org
.argeo
.api
.acr
.uuid
;
3 import java
.security
.SecureRandom
;
5 import java
.util
.concurrent
.Callable
;
6 import java
.util
.concurrent
.CompletableFuture
;
7 import java
.util
.concurrent
.CompletionStage
;
8 import java
.util
.concurrent
.ForkJoinPool
;
9 import java
.util
.concurrent
.ForkJoinTask
;
10 import java
.util
.concurrent
.ThreadLocalRandom
;
13 * Execute {@link UUID} creations in {@link ForkJoinPool#commonPool()}. The goal
14 * is to provide good performance while staying within the parallelism defined
15 * for the system, so as to overwhelm it if many UUIDs are requested.
16 * Additionally, with regard to time based UUIDs, since we use
17 * {@link ConcurrentTimeUuidState}, which maintains one "clock sequence" per
18 * thread, we want to limit the number of threads accessing the actual
21 public abstract class AbstractAsyncUuidFactory
extends AbstractUuidFactory
implements AsyncUuidFactory
{
22 private SecureRandom secureRandom
;
23 protected TimeUuidState timeUuidState
;
25 public AbstractAsyncUuidFactory() {
26 secureRandom
= newSecureRandom();
27 timeUuidState
= new ConcurrentTimeUuidState(secureRandom
, null);
33 protected abstract UUID
newTimeUUID();
35 protected abstract UUID
newTimeUUIDwithMacAddress();
37 protected abstract SecureRandom
newSecureRandom();
42 protected UUID
newRandomUUIDStrong() {
43 return newRandomUUID(secureRandom
);
46 public UUID
randomUUIDWeak() {
47 return newRandomUUID(ThreadLocalRandom
.current());
51 * ASYNC OPERATIONS (heavy)
53 protected CompletionStage
<UUID
> request(ForkJoinTask
<UUID
> newUuid
) {
54 return CompletableFuture
.supplyAsync(newUuid
::invoke
).minimalCompletionStage();
58 public CompletionStage
<UUID
> requestNameUUIDv5(UUID namespace
, byte[] data
) {
59 return request(futureNameUUIDv5(namespace
, data
));
63 public CompletionStage
<UUID
> requestNameUUIDv3(UUID namespace
, byte[] data
) {
64 return request(futureNameUUIDv3(namespace
, data
));
68 public CompletionStage
<UUID
> requestRandomUUIDStrong() {
69 return request(futureRandomUUIDStrong());
73 public CompletionStage
<UUID
> requestTimeUUID() {
74 return request(futureTimeUUID());
78 public CompletionStage
<UUID
> requestTimeUUIDwithMacAddress() {
79 return request(futureTimeUUIDwithMacAddress());
83 * ASYNC OPERATIONS (light)
85 protected ForkJoinTask
<UUID
> submit(Callable
<UUID
> newUuid
) {
86 return ForkJoinTask
.adapt(newUuid
);
90 public ForkJoinTask
<UUID
> futureNameUUIDv5(UUID namespace
, byte[] data
) {
91 return submit(() -> newNameUUIDv5(namespace
, data
));
95 public ForkJoinTask
<UUID
> futureNameUUIDv3(UUID namespace
, byte[] data
) {
96 return submit(() -> newNameUUIDv3(namespace
, data
));
100 public ForkJoinTask
<UUID
> futureRandomUUIDStrong() {
101 return submit(this::newRandomUUIDStrong
);
105 public ForkJoinTask
<UUID
> futureTimeUUID() {
106 return submit(this::newTimeUUID
);
110 public ForkJoinTask
<UUID
> futureTimeUUIDwithMacAddress() {
111 return submit(this::newTimeUUIDwithMacAddress
);
115 // public UUID timeUUID() {
116 // if (ConcurrentTimeUuidState.isTimeUuidThread.get())
117 // return newTimeUUID();
119 // return futureTimeUUID().join();
123 // public UUID timeUUIDwithMacAddress() {
124 // if (ConcurrentTimeUuidState.isTimeUuidThread.get())
125 // return newTimeUUIDwithMacAddress();
127 // return futureTimeUUIDwithMacAddress().join();