Improve clock sequence range configuration
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / ConcurrentUuidFactory.java
index 05b2f05c6b62345e0160363c7129983301d32ade..264e047063ac0872af99f1fc8b0adeba0530aaa3 100644 (file)
@@ -8,6 +8,7 @@ import java.security.DrbgParameters;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.util.Objects;
+import java.util.UUID;
 
 /**
  * A configurable implementation of an {@link AsyncUuidFactory}, which can be
@@ -15,28 +16,51 @@ import java.util.Objects;
  * 
  * @see https://datatracker.ietf.org/doc/html/rfc4122
  */
-public class ConcurrentUuidFactory extends AbstractAsyncUuidFactory {
+public class ConcurrentUuidFactory extends AbstractAsyncUuidFactory implements TypedUuidFactory {
        private final static Logger logger = System.getLogger(ConcurrentUuidFactory.class.getName());
 
-//     private byte[] defaultNodeId;
-
-       private Long nodeIdBase;
+       public ConcurrentUuidFactory(long initialClockRange, byte[] nodeId) {
+               this(initialClockRange, nodeId, 0);
+       }
 
-       public ConcurrentUuidFactory(byte[] nodeId, int offset) {
+       public ConcurrentUuidFactory(long initialClockRange, byte[] nodeId, int offset) {
                Objects.requireNonNull(nodeId);
                if (offset + 6 > nodeId.length)
                        throw new IllegalArgumentException("Offset too big: " + offset);
                byte[] defaultNodeId = toNodeIdBytes(nodeId, offset);
-               nodeIdBase = NodeIdSupplier.toNodeIdBase(defaultNodeId);
-               setNodeIdSupplier(() -> nodeIdBase);
+               long nodeIdBase = NodeIdSupplier.toNodeIdBase(defaultNodeId);
+               setNodeIdSupplier(() -> nodeIdBase, initialClockRange);
        }
 
-       protected ConcurrentUuidFactory() {
+       /**
+        * Empty constructor for use with component life cycle. A {@link NodeIdSupplier}
+        * must be set externally, otherwise time based UUID won't work.
+        */
+       public ConcurrentUuidFactory() {
+               super();
+       }
 
+//     public ConcurrentUuidFactory() {
+//             byte[] defaultNodeId = getIpBytes();
+//             nodeIdBase = NodeIdSupplier.toNodeIdBase(defaultNodeId);
+//             setNodeIdSupplier(() -> nodeIdBase);
+//             assert newTimeUUID().node() == BitSet.valueOf(defaultNodeId).toLongArray()[0];
+//     }
+
+       /*
+        * DEFAULT
+        */
+       /**
+        * The default {@link UUID} to provide. This implementations returns
+        * {@link #timeUUID()} because it is fast and uses few resources.
+        */
+       @Override
+       public UUID get() {
+               return timeUUID();
        }
 
        @Override
-       protected SecureRandom newSecureRandom() {
+       protected SecureRandom createSecureRandom() {
                SecureRandom secureRandom;
                try {
                        secureRandom = SecureRandom.getInstance("DRBG",
@@ -53,12 +77,4 @@ public class ConcurrentUuidFactory extends AbstractAsyncUuidFactory {
                return secureRandom;
        }
 
-       /*
-        * TIME-BASED (version 1)
-        */
-//
-//     @Override
-//     public UUID newTimeUUID() {
-//             return newTimeUUID(timeUuidState.useTimestamp(), timeUuidState.getClockSequence(), defaultNodeId, 0);
-//     }
-}
+}
\ No newline at end of file