Author: gdusbabek
Date: Wed Dec 29 19:14:06 2010
New Revision: 1053708

URL: http://svn.apache.org/viewvc?rev=1053708&view=rev
Log:
examine the right nibble when validating TimeUUIDs. patch by gdusbabek, 
reviewed by jbellis. CASSANDRA-1910

Modified:
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
    
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java?rev=1053708&r1=1053707&r2=1053708&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
 Wed Dec 29 19:14:06 2010
@@ -79,4 +79,15 @@ public class TimeUUIDType extends Abstra
         }
         return uuid.toString();
     }
+
+    @Override
+    public void validate(byte[] bytes)
+    {
+        if (bytes.length != 16 && bytes.length != 0)
+            throw new MarshalException(String.format("TimeUUID should be 16 or 
0 bytes (%d)", bytes.length));
+        // version is bits 4-7 of byte 6.
+        if (bytes.length > 0)
+            if ((bytes[6] & 0xf0) != 0x10)
+                throw new MarshalException("Invalid version for TimeUUID 
type.");
+    }
 }

Modified: 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java?rev=1053708&r1=1053707&r2=1053708&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
 Wed Dec 29 19:14:06 2010
@@ -20,6 +20,7 @@ package org.apache.cassandra.db.marshal;
 
 import java.util.Arrays;
 import java.util.Random;
+import java.util.UUID;
 
 import org.junit.Test;
 
@@ -48,4 +49,34 @@ public class TimeUUIDTypeTest
             assert i0 <= i1;
         }
     }
+    
+    @Test
+    public void testValidTimeVersion()
+    {
+        java.util.UUID uuid1 = 
java.util.UUID.fromString("00000000-0000-1000-0000-000000000000");
+        assert uuid1.version() == 1;
+        timeUUIDType.validate(decompose(uuid1));
+    }
+    
+    @Test(expected = MarshalException.class)
+    public void testInvalidTimeVersion()
+    {
+        java.util.UUID uuid2 = 
java.util.UUID.fromString("00000000-0000-2100-0000-000000000000");
+        assert uuid2.version() == 2;
+        timeUUIDType.validate(decompose(uuid2));
+    }
+    
+    /** decomposes a uuid into raw bytes. */
+    private static byte[] decompose(UUID uuid)
+    {
+        long most = uuid.getMostSignificantBits();
+        long least = uuid.getLeastSignificantBits();
+        byte[] b = new byte[16];
+        for (int i = 0; i < 8; i++)
+        {
+            b[i] = (byte)(most >>> ((7-i) * 8));
+            b[8+i] = (byte)(least >>> ((7-i) * 8));
+        }
+        return b;
+    }
 }


Reply via email to