Clean up and refactor ACR and component register.
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / MacAddressUuidFactory.java
index fa68df1dbe2777328a87b008e932039b23e56a5b..ab6d55d207ae9576dfd92dc32b5c90a660b17bc2 100644 (file)
@@ -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<NetworkInterface> 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;
        }
 
 }