X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.uuid%2Fsrc%2Forg%2Fargeo%2Fapi%2Fuuid%2FMacAddressUuidFactory.java;h=51d68e3ef2aefb0420366ae212a17c108e229ceb;hb=e7e7ea80443a94cefd9b16c5ccf11253c9991c02;hp=9f27fad842bde97e615a2acef99425ee9ec4856b;hpb=5f820a14abf7371714514ed5f20580ceb5edaeec;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 9f27fad84..51d68e3ef 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 @@ -4,41 +4,66 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; +import java.util.Enumeration; 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 + * @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() { - super(localHardwareAddressAsNodeId()); + this(0, localHardwareAddressAsNodeId()); + } + + public MacAddressUuidFactory(long initialClockRange) { + this(initialClockRange, localHardwareAddressAsNodeId()); + } + + public MacAddressUuidFactory(byte[] hardwareAddress) { + this(0, hardwareAddress); + } + + public MacAddressUuidFactory(long initialClockRange, byte[] hardwareAddress) { + super(initialClockRange, hardwareAddress); } - public static byte[] localHardwareAddressAsNodeId() { + private static byte[] localHardwareAddressAsNodeId() { InetAddress localHost; try { localHost = InetAddress.getLocalHost(); NetworkInterface nic = NetworkInterface.getByInetAddress(localHost); - return hardwareAddressToNodeId(nic); + if (nic != null) + return hardwareAddressToNodeId(nic); + Enumeration netInterfaces = null; + try { + netInterfaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + throw new IllegalStateException(e); + } + if (netInterfaces == null || !netInterfaces.hasMoreElements()) + throw new IllegalStateException("No interfaces"); + return hardwareAddressToNodeId(netInterfaces.nextElement()); } 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]; + public static byte[] hardwareAddressToNodeId(NetworkInterface nic) throws IllegalStateException { + try { + 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; + } catch (SocketException e) { + throw new IllegalStateException("Cannot retrieve hardware address from NIC", e); } - return arr; } }