]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java
Merge tag 'v2.3.28' into testing
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / MacAddressUuidFactory.java
1 package org.argeo.api.uuid;
2
3 import java.net.InetAddress;
4 import java.net.NetworkInterface;
5 import java.net.SocketException;
6 import java.net.UnknownHostException;
7 import java.util.Enumeration;
8 import java.util.UUID;
9
10 /**
11 * An {@link UUID} factory whose node id (for time based UUIDs) is the hardware
12 * MAC address as specified in RFC4122.
13 *
14 * @see "https://datatracker.ietf.org/doc/html/rfc4122.html#section-4.1.6"
15 */
16 public class MacAddressUuidFactory extends ConcurrentUuidFactory {
17 public MacAddressUuidFactory() {
18 this(0, localHardwareAddressAsNodeId());
19 }
20
21 public MacAddressUuidFactory(long initialClockRange) {
22 this(initialClockRange, localHardwareAddressAsNodeId());
23 }
24
25 public MacAddressUuidFactory(byte[] hardwareAddress) {
26 this(0, hardwareAddress);
27 }
28
29 public MacAddressUuidFactory(long initialClockRange, byte[] hardwareAddress) {
30 super(initialClockRange, hardwareAddress);
31 }
32
33 private static byte[] localHardwareAddressAsNodeId() {
34 InetAddress localHost;
35 try {
36 localHost = InetAddress.getLocalHost();
37 NetworkInterface nic = NetworkInterface.getByInetAddress(localHost);
38 if (nic != null && nic.getHardwareAddress() != null)
39 return hardwareAddressToNodeId(nic);
40 Enumeration<NetworkInterface> netInterfaces = null;
41 netInterfaces = NetworkInterface.getNetworkInterfaces();
42 if (netInterfaces == null || !netInterfaces.hasMoreElements())
43 throw new IllegalStateException("No interfaces");
44 while (netInterfaces.hasMoreElements()) {
45 // TODO find out public/physical interfaces
46 nic = netInterfaces.nextElement();
47 if (nic.getHardwareAddress() != null)
48 return hardwareAddressToNodeId(nic);
49 }
50 throw new IllegalStateException("No interfaces with a MAC address");
51 } catch (UnknownHostException | SocketException e) {
52 throw new IllegalStateException(e);
53 }
54
55 }
56
57 public static byte[] hardwareAddressToNodeId(NetworkInterface nic) throws IllegalStateException {
58 try {
59 byte[] hardwareAddress = nic.getHardwareAddress();
60 final int length = 6;
61 byte[] arr = new byte[length];
62 for (int i = 0; i < length; i++) {
63 arr[i] = hardwareAddress[length - 1 - i];
64 }
65 return arr;
66 } catch (SocketException e) {
67 throw new IllegalStateException("Cannot retrieve hardware address from NIC", e);
68 }
69 }
70
71 }