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;
+ }
}