X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.uuid%2Fsrc%2Forg%2Fargeo%2Fapi%2Fuuid%2FMacAddressUuidFactory.java;h=fa68df1dbe2777328a87b008e932039b23e56a5b;hb=0f8bddc982e2ea4f260e1eb639777b74e7893ea3;hp=d1ce6ded851ded57825c20be3158498f32281f3e;hpb=e846ef84146b66ae543c29c5f17b2991ff0f5973;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java index d1ce6ded8..fa68df1db 100644 --- a/org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java @@ -1,15 +1,48 @@ package org.argeo.api.uuid; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.UUID; + +/** + * An {@link UUID} factory whose node id (for time based UUIDs) is the hardware + * MAC address as specified in RFC4122. + * + * @see https://datatracker.ietf.org/doc/html/rfc4122.html#section-4.1.6 + */ public class MacAddressUuidFactory extends ConcurrentUuidFactory { public final static UuidFactory DEFAULT = new MacAddressUuidFactory(); public MacAddressUuidFactory() { - setNodeIdSupplier(() -> { - byte[] hardwareAddress = getHardwareAddress(); - byte[] macAddressNodeId = toNodeIdBytes(hardwareAddress, 0); - long nodeIdBase = NodeIdSupplier.toNodeIdBase(macAddressNodeId); - return nodeIdBase; - }); + this(0); + } + + public MacAddressUuidFactory(long initialClockRange) { + super(initialClockRange, localHardwareAddressAsNodeId()); + } + + public static byte[] localHardwareAddressAsNodeId() { + InetAddress localHost; + try { + localHost = InetAddress.getLocalHost(); + NetworkInterface nic = NetworkInterface.getByInetAddress(localHost); + return hardwareAddressToNodeId(nic); + } catch (UnknownHostException | SocketException e) { + throw new IllegalStateException(e); + } + + } + + public static byte[] hardwareAddressToNodeId(NetworkInterface nic) throws SocketException { + byte[] hardwareAddress = nic.getHardwareAddress(); + final int length = 6; + byte[] arr = new byte[length]; + for (int i = 0; i < length; i++) { + arr[i] = hardwareAddress[length - 1 - i]; + } + return arr; } }