Improve clock sequence range configuration
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / AbstractAsyncUuidFactory.java
index 685fe0a07bb3ff2515f3b9cdddd598bd839883a9..52becc85ac0946a018e692b1065e3b20c999c83a 100644 (file)
@@ -26,16 +26,17 @@ public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory imple
        protected ConcurrentTimeUuidState timeUuidState;
 
        private NodeIdSupplier nodeIdSupplier;
+       private long currentClockSequenceRange = 0;
 
        public AbstractAsyncUuidFactory() {
-               secureRandom = newSecureRandom();
+               secureRandom = createSecureRandom();
                timeUuidState = new ConcurrentTimeUuidState(secureRandom, null);
        }
        /*
         * ABSTRACT METHODS
         */
 
-       protected abstract SecureRandom newSecureRandom();
+       protected abstract SecureRandom createSecureRandom();
 
        /*
         * STATE
@@ -44,7 +45,7 @@ public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory imple
                if (nodeIdSupplier == null)
                        throw new IllegalStateException("No node id supplier available");
                long nodeIdBase = nodeIdSupplier.get();
-               timeUuidState.reset(nodeIdBase);
+               timeUuidState.reset(nodeIdBase, currentClockSequenceRange);
        }
 
        public void setNodeIdSupplier(NodeIdSupplier nodeIdSupplier) {
@@ -52,14 +53,28 @@ public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory imple
                reset();
        }
 
+       public void setNodeIdSupplier(NodeIdSupplier nodeIdSupplier, long range) {
+               this.currentClockSequenceRange = range >= 0 ? range & 0x3F00 : range;
+               setNodeIdSupplier(nodeIdSupplier);
+       }
+
        protected NodeIdSupplier getNodeIdSupplier() {
                return nodeIdSupplier;
        }
 
+       /**
+        * If positive, only clock_hi is taken from the argument (range & 0x3F00), if
+        * negative, the full range of possible values is used.
+        */
+       public void setCurrentClockSequenceRange(long range) {
+               this.currentClockSequenceRange = range >= 0 ? range & 0x3F00 : range;
+               reset();
+       }
+
        /*
         * SYNC OPERATIONS
         */
-       protected UUID newRandomUUIDStrong() {
+       protected UUID createRandomUUIDStrong() {
                SecureRandomParameters parameters = secureRandom.getParameters();
                if (parameters != null) {
                        if (parameters instanceof DrbgParameters.Instantiation) {
@@ -70,14 +85,14 @@ public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory imple
                                }
                        }
                }
-               return newRandomUUID(secureRandom);
+               return createRandomUUID(secureRandom);
        }
 
        public UUID randomUUIDWeak() {
-               return newRandomUUID(ThreadLocalRandom.current());
+               return createRandomUUID(ThreadLocalRandom.current());
        }
 
-       protected UUID newTimeUUID() {
+       protected UUID createTimeUUID() {
                if (nodeIdSupplier == null)
                        throw new IllegalStateException("No node id supplier available");
                UUID uuid = new UUID(timeUuidState.getMostSignificantBits(), timeUuidState.getLeastSignificantBits());
@@ -126,21 +141,21 @@ public abstract class AbstractAsyncUuidFactory extends AbstractUuidFactory imple
 
        @Override
        public ForkJoinTask<UUID> futureNameUUIDv5(UUID namespace, byte[] data) {
-               return submit(() -> newNameUUIDv5(namespace, data));
+               return submit(() -> createNameUUIDv5(namespace, data));
        }
 
        @Override
        public ForkJoinTask<UUID> futureNameUUIDv3(UUID namespace, byte[] data) {
-               return submit(() -> newNameUUIDv3(namespace, data));
+               return submit(() -> createNameUUIDv3(namespace, data));
        }
 
        @Override
        public ForkJoinTask<UUID> futureRandomUUIDStrong() {
-               return submit(this::newRandomUUIDStrong);
+               return submit(this::createRandomUUIDStrong);
        }
 
        @Override
        public ForkJoinTask<UUID> futureTimeUUID() {
-               return submit(this::newTimeUUID);
+               return submit(this::createTimeUUID);
        }
 }