You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/11/02 14:01:32 UTC

svn commit: r470358 - in /incubator/harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/util/UUID.java main/java/org/apache/harmony/luni/util/ExternalMessages.properties test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java

Author: pyang
Date: Thu Nov  2 05:01:31 2006
New Revision: 470358

URL: http://svn.apache.org/viewvc?view=rev&rev=470358
Log:
Apply patch for HARMONY-2042 ([classlib][luni]UUID.fromString unexpectedly throws IllegalArgumentException while the input string is not exactly 36 characters long.)

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/UUID.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/UUID.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/UUID.java?view=diff&rev=470358&r1=470357&r2=470358
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/UUID.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/UUID.java Thu Nov  2 05:01:31 2006
@@ -24,6 +24,8 @@
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 
+import org.apache.harmony.luni.util.Msg;
+
 /**
  * <p>
  * UUID is an immutable representation of a 128-bit universally unique
@@ -213,48 +215,44 @@
         if (uuid == null) {
             throw new NullPointerException();
         }
-        if (uuid.length() != 36) {
-            throw new IllegalArgumentException(
-                    "The UUID String must be 36 chars long.");
-        }
-
-        try {
-            long m1 = Long.parseLong(uuid.substring(0, 8), 16);
-            if (uuid.charAt(8) != '-') {
-                throw new IllegalArgumentException();
-            }
-            long m2 = Long.parseLong(uuid.substring(9, 13), 16);
-            if (uuid.charAt(13) != '-') {
-                throw new IllegalArgumentException();
-            }
-            long m3 = Long.parseLong(uuid.substring(14, 18), 16);
-            if (uuid.charAt(18) != '-') {
-                throw new IllegalArgumentException();
-            }
-
-            long lsb1 = Long.parseLong(uuid.substring(19, 23), 16);
-            if (uuid.charAt(23) != '-') {
-                throw new IllegalArgumentException();
-            }
-            long lsb2 = Long.parseLong(uuid.substring(24), 16);
-
-            long msb = (m1 << 32) | (m2 << 16) | m3;
-            long lsb = (lsb1 << 48) | lsb2;
-            return new UUID(msb, lsb);
-        } catch (NumberFormatException e) {
-            throw new IllegalArgumentException(
-                    "The UUID String contained invalid hexadecimal characters.",
-                    e);
-        }
-    }
-
-    /**
-     * <p>
-     * The 64 least significant bits of the UUID.
-     * </p>
-     * 
-     * @return A long value.
-     */
+        
+        int[] position = new int[5];
+        int lastPosition = 1;
+        int startPosition = 0;
+        
+        int i = 0;
+        for (; i < position.length  && lastPosition > 0; i++) {
+        	position[i] = uuid.indexOf("-", startPosition); //$NON-NLS-1$
+        	lastPosition = position[i];
+        	startPosition = position[i] + 1;
+        }
+
+        // should have and only can have four "-" in UUID
+        if(i != position.length || lastPosition != -1)
+        {
+        	throw new IllegalArgumentException(Msg.getString("KA014") + uuid); //$NON-NLS-1$
+        }
+
+		long m1 = Long.parseLong(uuid.substring(0, position[0]), 16);
+		long m2 = Long.parseLong(uuid.substring(position[0]+ 1, position[1]), 16);
+		long m3 = Long.parseLong(uuid.substring(position[1] + 1, position[2]), 16);
+
+		long lsb1 = Long.parseLong(uuid.substring(position[2] + 1, position[3]), 16);
+		long lsb2 = Long.parseLong(uuid.substring(position[3]+ 1), 16);
+
+		long msb = (m1 << 32) | (m2 << 16) | m3;
+		long lsb = (lsb1 << 48) | lsb2;
+		
+		return new UUID(msb, lsb);
+	}
+
+    /**
+	 * <p>
+	 * The 64 least significant bits of the UUID.
+	 * </p>
+	 * 
+	 * @return A long value.
+	 */
     public long getLeastSignificantBits() {
         return leastSigBits;
     }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties?view=diff&rev=470358&r1=470357&r2=470358
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties Thu Nov  2 05:01:31 2006
@@ -305,4 +305,5 @@
 KA011=Malformed reply from SOCKS server
 KA012=No such file or directory
 KA013=Number of bytes to skip cannot be negative
+KA014=Invalit UUID string
 

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java?view=diff&rev=470358&r1=470357&r2=470358
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/util/UUIDTest.java Thu Nov  2 05:01:31 2006
@@ -355,4 +355,103 @@
             fail("No IAE");
         } catch (IllegalArgumentException e) {}
     }
+
+	/**
+	 * @tests java.util.UUID#fromString(String)
+	 */
+	public void test_fromString_LString_Exception() {
+
+		UUID uuid = UUID.fromString("0-0-0-0-0");
+
+		try {
+			uuid = UUID.fromString("0-0-0-0-");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("-0-0-0-0-0");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("-0-0-0-0");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("-0-0-0-");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("0--0-0-0");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("0-0-0-0-");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("-1-0-0-0-0");
+			fail("should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+
+		uuid = UUID.fromString("123456789-0-0-0-0");
+		assertEquals(0x2345678900000000L, uuid.getMostSignificantBits());
+		assertEquals(0x0L, uuid.getLeastSignificantBits());
+
+		uuid = UUID.fromString("111123456789-0-0-0-0");
+		assertEquals(0x2345678900000000L, uuid.getMostSignificantBits());
+		assertEquals(0x0L, uuid.getLeastSignificantBits());
+
+		uuid = UUID.fromString("7fffffffffffffff-0-0-0-0");
+		assertEquals(0xffffffff00000000L, uuid.getMostSignificantBits());
+		assertEquals(0x0L, uuid.getLeastSignificantBits());
+
+		try {
+			uuid = UUID.fromString("8000000000000000-0-0-0-0");
+			fail("should throw NumberFormatException");
+		} catch (NumberFormatException e) {
+			// expected
+		}
+
+		uuid = UUID
+				.fromString("7fffffffffffffff-7fffffffffffffff-7fffffffffffffff-0-0");
+		assertEquals(0xffffffffffffffffL, uuid.getMostSignificantBits());
+		assertEquals(0x0L, uuid.getLeastSignificantBits());
+
+		uuid = UUID.fromString("0-0-0-7fffffffffffffff-7fffffffffffffff");
+		assertEquals(0x0L, uuid.getMostSignificantBits());
+		assertEquals(0xffffffffffffffffL, uuid.getLeastSignificantBits());
+
+		try {
+			uuid = UUID.fromString("0-0-0-8000000000000000-0");
+			fail("should throw NumberFormatException");
+		} catch (NumberFormatException e) {
+			// expected
+		}
+
+		try {
+			uuid = UUID.fromString("0-0-0-0-8000000000000000");
+			fail("should throw NumberFormatException");
+		} catch (NumberFormatException e) {
+			// expected
+		}
+	}
 }