You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/11/02 14:17:38 UTC

svn commit: r831891 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java

Author: mreutegg
Date: Mon Nov  2 13:17:37 2009
New Revision: 831891

URL: http://svn.apache.org/viewvc?rev=831891&view=rev
Log:
JCR-2327: java.util.UUID.fromString() too slow

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java?rev=831891&r1=831890&r2=831891&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/id/NodeId.java Mon Nov  2 13:17:37 2009
@@ -30,6 +30,11 @@
     private static final long serialVersionUID = 5773949574212570258L;
 
     /**
+     * Chars in a UUID String.
+     */
+    public static final int UUID_FORMATTED_LENGTH = 36;
+
+    /**
      * Number of bytes in a UUID (16).
      */
     public static final int UUID_BYTE_LENGTH = 16;
@@ -113,12 +118,12 @@
     /**
      * Creates a node identifier from the given UUID string.
      *
-     * @see UUID#fromString(String)
+     * @see #fromString(String)
      * @param uuid UUID string
      * @throws IllegalArgumentException if the UUID string is invalid
      */
     public NodeId(String uuid) throws IllegalArgumentException {
-        this(UUID.fromString(uuid));
+        this(fromString(uuid));
     }
 
     /**
@@ -241,4 +246,47 @@
         return (int) ((msb >>> 32) ^ msb ^ (lsb >>> 32) ^ lsb);
     }
 
+    //------------------------------------------------------------< internal >
+
+    /**
+     * Constructs a UUID from a UUID formatted String.
+     *
+     * @param uuidString the String representing a UUID to construct this UUID
+     * @return the UUID created from the given string.
+     * @throws IllegalArgumentException String must be a properly formatted UUID
+     *                                  string
+     */
+    private static UUID fromString(String uuidString)
+            throws IllegalArgumentException {
+        // e.g. f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+        //      012345678901234567890123456789012345
+        int len = uuidString.length();
+        if (len != UUID_FORMATTED_LENGTH) {
+            throw new IllegalArgumentException();
+        }
+        long[] words = new long[2];
+        int b = 0;
+        for (int i = 0; i < UUID_FORMATTED_LENGTH; i++) {
+            int c = uuidString.charAt(i) | 0x20; // to lowercase (will lose some error checking)
+            if (i == 8 || i == 13 || i == 23) {
+                if (c != '-') {
+                    throw new IllegalArgumentException(String.valueOf(i));
+                }
+            } else if (i == 18) {
+                if (c != '-') {
+                    throw new IllegalArgumentException(String.valueOf(i));
+                }
+                b = 1;
+            } else {
+                byte h = (byte) (c & 0x0f);
+                if (c >= 'a' && c <= 'f') {
+                    h += 9;
+                } else if (c < '0' || c > '9') {
+                    throw new IllegalArgumentException();
+                }
+                words[b] = words[b] << 4 | h;
+            }
+        }
+        return new UUID(words[0], words[1]);
+    }
 }