[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