X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.uuid%2Fsrc%2Forg%2Fargeo%2Fapi%2Fuuid%2FMacAddressUuidFactory.java;fp=org.argeo.api.uuid%2Fsrc%2Forg%2Fargeo%2Fapi%2Fuuid%2FMacAddressUuidFactory.java;h=ab6d55d207ae9576dfd92dc32b5c90a660b17bc2;hb=cc1dd97ebcc32e1bd754073ad23def182f460452;hp=fa68df1dbe2777328a87b008e932039b23e56a5b;hpb=584b2b87593892c6ded7b645425b603a4f554026;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 fa68df1db..ab6d55d20 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,6 +4,7 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; +import java.util.Enumeration; import java.util.UUID; /** @@ -16,33 +17,55 @@ public class MacAddressUuidFactory extends ConcurrentUuidFactory { public final static UuidFactory DEFAULT = new MacAddressUuidFactory(); public MacAddressUuidFactory() { - this(0); + this(0, localHardwareAddressAsNodeId()); } public MacAddressUuidFactory(long initialClockRange) { - super(initialClockRange, localHardwareAddressAsNodeId()); + this(initialClockRange, localHardwareAddressAsNodeId()); } - public static byte[] localHardwareAddressAsNodeId() { + public MacAddressUuidFactory(byte[] hardwareAddress) { + this(0, hardwareAddress); + } + + public MacAddressUuidFactory(long initialClockRange, byte[] hardwareAddress) { + super(initialClockRange, hardwareAddress); + } + + 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) { + 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; } }