[jboss-cvs] JBoss Messaging SVN: r5804 - in trunk: tests/src/org/jboss/messaging/tests/unit/util and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Feb 4 05:56:33 EST 2009
Author: jmesnil
Date: 2009-02-04 05:56:33 -0500 (Wed, 04 Feb 2009)
New Revision: 5804
Modified:
trunk/src/main/org/jboss/messaging/util/UUIDGenerator.java
trunk/tests/src/org/jboss/messaging/tests/unit/util/UUIDGeneratorTest.java
Log:
fixed UUID generation
* make it compliant with the UUIDs and GUIDs draft (http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt)
* use a 6-byte hardware address on Java 6. If NetworkInterface.getHardwareAddress() returns an array with less than 6 bytes, pad it with zeroes
* if there is no available hardware address, use a random 6-byte array
Modified: trunk/src/main/org/jboss/messaging/util/UUIDGenerator.java
===================================================================
--- trunk/src/main/org/jboss/messaging/util/UUIDGenerator.java 2009-02-04 05:51:51 UTC (rev 5803)
+++ trunk/src/main/org/jboss/messaging/util/UUIDGenerator.java 2009-02-04 10:56:33 UTC (rev 5804)
@@ -16,9 +16,7 @@
package org.jboss.messaging.util;
import java.lang.reflect.Method;
-import java.net.InetAddress;
import java.net.NetworkInterface;
-import java.net.SocketException;
import java.security.SecureRandom;
import java.util.Enumeration;
import java.util.Random;
@@ -86,8 +84,8 @@
public final UUID generateTimeBasedUUID(byte[] byteAddr)
{
byte[] contents = new byte[16];
- int pos = 12;
- for (int i = 0; i < 4; ++i)
+ int pos = 10;
+ for (int i = 0; i < 6; ++i)
{
contents[pos + i] = byteAddr[i];
}
@@ -146,55 +144,25 @@
{
NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement();
Object res = getHardwareAddressMethod.invoke(networkInterface, null);
- if (res instanceof byte[])
+ if (res != null && res instanceof byte[])
{
byte[] address = (byte[])res;
- if (log.isDebugEnabled())
+ byte[] paddedAddress = getZeroPaddedSixBytes(address);
+ if (paddedAddress != null)
{
- log.debug("using hardware address " + asString(address));
- }
- return address;
- }
- }
- }
- catch (Throwable t)
- {
- }
-
- return null;
- }
-
- /**
- * Browse all the network interfaces and their addresses until we find the 1st InetAddress which
- * is neither a loopback address nor a site local address.
- * Returns <code>null</code> if no such address is found.
- */
- public final static InetAddress getInetAddress()
- {
- try
- {
- Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
- while (networkInterfaces.hasMoreElements())
- {
- NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement();
- Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
- while (inetAddresses.hasMoreElements())
- {
- InetAddress inetAddress = (InetAddress)inetAddresses.nextElement();
- if (!inetAddress.isLoopbackAddress() && !inetAddress.isSiteLocalAddress())
- {
if (log.isDebugEnabled())
{
- log.debug("using inet address " + inetAddress);
+ log.debug("using hardware address " + asString(paddedAddress));
}
- return inetAddress;
+ return paddedAddress;
}
}
}
}
- catch (SocketException e)
+ catch (Throwable t)
{
}
+
return null;
}
@@ -207,8 +175,7 @@
{
byte[] address = getAddressBytes();
- UUIDGenerator gen = UUIDGenerator.getInstance();
- UUID uid = gen.generateTimeBasedUUID(address);
+ UUID uid = generateTimeBasedUUID(address);
return uid;
}
@@ -223,11 +190,37 @@
}
else
{
- UUIDGenerator gen = UUIDGenerator.getInstance();
- return gen.generateTimeBasedUUID(address).toString();
+ return generateTimeBasedUUID(address).toString();
}
}
+ public final static byte[] getZeroPaddedSixBytes(byte[] bytes)
+ {
+ if (bytes == null)
+ {
+ return null;
+ }
+ if (bytes.length > 0 && bytes.length <= 6)
+ {
+ if (bytes.length == 6)
+ {
+ return bytes;
+ }
+ else
+ {
+ //pad with zeroes to have a 6-byte array
+ byte[] paddedAddress = new byte[6];
+ System.arraycopy(bytes, 0, paddedAddress, 0, bytes.length);
+ for(int i = bytes.length; i < 6; i++)
+ {
+ paddedAddress[i] = 0;
+ }
+ return paddedAddress;
+ }
+ }
+ return null;
+ }
+
// Private -------------------------------------------------------
private final byte[] getAddressBytes()
@@ -237,14 +230,6 @@
address = getHardwareAddress();
if (address == null)
{
- InetAddress addr = getInetAddress();
- if (addr != null)
- {
- address = addr.getAddress();
- }
- }
- if (address == null)
- {
address = generateDummyAddress();
}
}
@@ -266,5 +251,5 @@
}
s += bytes[bytes.length - 1];
return s;
- }
-}
+ }
+}
\ No newline at end of file
Modified: trunk/tests/src/org/jboss/messaging/tests/unit/util/UUIDGeneratorTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/util/UUIDGeneratorTest.java 2009-02-04 05:51:51 UTC (rev 5803)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/util/UUIDGeneratorTest.java 2009-02-04 10:56:33 UTC (rev 5804)
@@ -22,10 +22,9 @@
package org.jboss.messaging.tests.unit.util;
-import java.net.InetAddress;
-
import junit.framework.TestCase;
+import org.jboss.messaging.tests.util.UnitTestCase;
import org.jboss.messaging.util.UUIDGenerator;
/**
@@ -54,20 +53,32 @@
assertNull(UUIDGenerator.getHardwareAddress());
} else if (javaVersion.startsWith("1.6"))
{
- assertNotNull(UUIDGenerator.getHardwareAddress());
+ byte[] bytes = UUIDGenerator.getHardwareAddress();
+ assertNotNull(bytes);
+ assertTrue(bytes.length == 6);
}
}
- public void testGetInetAddress() throws Exception
+ public void testZeroPaddedBytes() throws Exception
{
- InetAddress address = UUIDGenerator.getInetAddress();
- if (address != null)
- {
- assertFalse(address.isLoopbackAddress());
- assertFalse(address.isSiteLocalAddress());
- }
+ assertNull(UUIDGenerator.getZeroPaddedSixBytes(null));
+ assertNull(UUIDGenerator.getZeroPaddedSixBytes(new byte[0]));
+ assertNull(UUIDGenerator.getZeroPaddedSixBytes(new byte[7]));
+
+ byte[] fiveBytes = new byte[] {1, 2, 3, 4, 5};
+ byte[] zeroPaddedFiveBytes = UUIDGenerator.getZeroPaddedSixBytes(fiveBytes);
+ UnitTestCase.assertEqualsByteArrays(new byte[] {1, 2, 3, 4, 5, 0}, zeroPaddedFiveBytes);
+
+ byte[] fourBytes = new byte[] {1, 2, 3, 4};
+ byte[] zeroPaddedFourBytes = UUIDGenerator.getZeroPaddedSixBytes(fourBytes);
+ UnitTestCase.assertEqualsByteArrays(new byte[] {1, 2, 3, 4, 0, 0}, zeroPaddedFourBytes);
+
+ byte[] threeBytes = new byte[] {1, 2, 3};
+ byte[] zeroPaddedThreeBytes = UUIDGenerator.getZeroPaddedSixBytes(threeBytes);
+ UnitTestCase.assertEqualsByteArrays(new byte[] {1, 2, 3, 0, 0, 0}, zeroPaddedThreeBytes);
}
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
More information about the jboss-cvs-commits
mailing list