]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java
1 package org
.argeo
.api
.uuid
;
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
;
11 * An {@link UUID} factory whose node id (for time based UUIDs) is the hardware
12 * MAC address as specified in RFC4122.
14 * @see "https://datatracker.ietf.org/doc/html/rfc4122.html#section-4.1.6"
16 public class MacAddressUuidFactory
extends ConcurrentUuidFactory
{
17 public MacAddressUuidFactory() {
18 this(0, localHardwareAddressAsNodeId());
21 public MacAddressUuidFactory(long initialClockRange
) {
22 this(initialClockRange
, localHardwareAddressAsNodeId());
25 public MacAddressUuidFactory(byte[] hardwareAddress
) {
26 this(0, hardwareAddress
);
29 public MacAddressUuidFactory(long initialClockRange
, byte[] hardwareAddress
) {
30 super(initialClockRange
, hardwareAddress
);
33 private static byte[] localHardwareAddressAsNodeId() {
34 InetAddress localHost
;
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
);
50 throw new IllegalStateException("No interfaces with a MAC address");
51 } catch (UnknownHostException
| SocketException e
) {
52 throw new IllegalStateException(e
);
57 public static byte[] hardwareAddressToNodeId(NetworkInterface nic
) throws IllegalStateException
{
59 byte[] hardwareAddress
= nic
.getHardwareAddress();
61 byte[] arr
= new byte[length
];
62 for (int i
= 0; i
< length
; i
++) {
63 arr
[i
] = hardwareAddress
[length
- 1 - i
];
66 } catch (SocketException e
) {
67 throw new IllegalStateException("Cannot retrieve hardware address from NIC", e
);