Author: mikedd
Date: Tue Jun 24 12:48:23 2008
New Revision: 671319

URL: http://svn.apache.org/viewvc?rev=671319&view=rev
Log:
OPENJPA-545 committing patch provided by Jeremy Bauer

Added:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java
   (with props)
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDHexSeq.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDStringSeq.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueStrategies.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
    
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/UUIDGenerator.java
    
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestUUIDGenerator.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/GeneratedValues.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestGeneratedValues.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ExtensionsEntity.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestExtensionAnnotations.java
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/Generator.java
    openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_meta.xml

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
 Tue Jun 24 12:48:23 2008
@@ -3545,6 +3545,10 @@
                 return UUIDHexSeq.getInstance();
             case ValueStrategies.UUID_STRING:
                 return UUIDStringSeq.getInstance();
+            case ValueStrategies.UUID_TYPE4_HEX:
+                return UUIDType4HexSeq.getInstance();
+            case ValueStrategies.UUID_TYPE4_STRING:
+                return UUIDType4StringSeq.getInstance();
             case ValueStrategies.SEQUENCE:
                 SequenceMetaData smd = (fmd == null)
                     ? meta.getIdentitySequenceMetaData()

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDHexSeq.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDHexSeq.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDHexSeq.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDHexSeq.java
 Tue Jun 24 12:48:23 2008
@@ -50,7 +50,7 @@
     }
 
     public synchronized Object next(StoreContext ctx, ClassMetaData meta) {
-        _last = UUIDGenerator.nextHex();
+        _last = UUIDGenerator.nextHex(UUIDGenerator.TYPE1);
         return _last;
     }
 

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDStringSeq.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDStringSeq.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDStringSeq.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDStringSeq.java
 Tue Jun 24 12:48:23 2008
@@ -50,7 +50,7 @@
     }
 
     public synchronized Object next(StoreContext ctx, ClassMetaData meta) {
-        _last = UUIDGenerator.nextString();
+        _last = UUIDGenerator.nextString(UUIDGenerator.TYPE1);
         return _last;
     }
 

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java?rev=671319&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java
 Tue Jun 24 12:48:23 2008
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.kernel;
+
+import org.apache.openjpa.lib.util.UUIDGenerator;
+import org.apache.openjpa.meta.ClassMetaData;
+
+/**
+ * Sequence for generating 32-character hex Type 4 UUID strings.
+ *
+ * @author Jeremy Bauer
+ */
+public class UUIDType4HexSeq
+    implements Seq {
+
+    private static final UUIDType4HexSeq _instance = new UUIDType4HexSeq();
+
+    private String _last = null;
+
+    /**
+     * Return the singleton instance.
+     */
+    public static UUIDType4HexSeq getInstance() {
+        return _instance;
+    }
+
+    /**
+     * Hide constructor.
+     */
+    private UUIDType4HexSeq() {
+    }
+
+    public void setType(int type) {
+    }
+
+    public synchronized Object next(StoreContext ctx, ClassMetaData meta) {
+        _last = UUIDGenerator.nextHex(UUIDGenerator.TYPE4);
+        return _last;
+    }
+
+    public synchronized Object current(StoreContext ctx, ClassMetaData meta) {
+        return _last;
+    }
+
+    public void allocate(int additional, StoreContext ctx, ClassMetaData meta) 
{
+    }
+
+    public void close() {
+       }
+}
\ No newline at end of file

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4HexSeq.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java?rev=671319&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java
 Tue Jun 24 12:48:23 2008
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.kernel;
+
+import org.apache.openjpa.lib.util.UUIDGenerator;
+import org.apache.openjpa.meta.ClassMetaData;
+
+/**
+ * Sequence for generating 16-character UUID strings.
+ *
+ * @author Jeremy Bauer
+ */
+public class UUIDType4StringSeq
+    implements Seq {
+
+    private static final UUIDType4StringSeq _instance = new 
UUIDType4StringSeq();
+
+    private String _last = null;
+
+    /**
+     * Return the singleton instance.
+     */
+    public static UUIDType4StringSeq getInstance() {
+        return _instance;
+    }
+
+    /**
+     * Hide constructor.
+     */
+    private UUIDType4StringSeq() {
+    }
+
+    public void setType(int type) {
+    }
+
+    public synchronized Object next(StoreContext ctx, ClassMetaData meta) {
+        _last = UUIDGenerator.nextString(UUIDGenerator.TYPE4);
+        return _last;
+    }
+
+    public synchronized Object current(StoreContext ctx, ClassMetaData meta) {
+        return _last;
+    }
+
+    public void allocate(int additional, StoreContext ctx, ClassMetaData meta) 
{
+    }
+
+    public void close() {
+       }
+}
\ No newline at end of file

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/UUIDType4StringSeq.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueStrategies.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueStrategies.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueStrategies.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueStrategies.java
 Tue Jun 24 12:48:23 2008
@@ -68,6 +68,16 @@
      */
     public static final int UUID_HEX = 6;
 
+    /**
+     * "uuid-type4-string" value strategy.
+     */
+    public static final int UUID_TYPE4_STRING = 7;
+
+    /**
+     * "uuid-type4-hex" value strategy.
+     */
+    public static final int UUID_TYPE4_HEX = 8;
+
     private static final Localizer _loc = Localizer.forPackage
         (ValueStrategies.class);
 
@@ -82,6 +92,8 @@
         _map.put("increment", Numbers.valueOf(INCREMENT));
         _map.put("uuid-string", Numbers.valueOf(UUID_STRING));
         _map.put("uuid-hex", Numbers.valueOf(UUID_HEX));
+        _map.put("uuid-type4-string", Numbers.valueOf(UUID_TYPE4_STRING));
+        _map.put("uuid-type4-hex", Numbers.valueOf(UUID_TYPE4_HEX));
     }
 
     /**

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
 Tue Jun 24 12:48:23 2008
@@ -160,9 +160,13 @@
                 return JavaTypes.convert(smd.getInstance(ctx.getClassLoader()).
                     next(ctx, meta), typeCode);
             case ValueStrategies.UUID_STRING:
-                return UUIDGenerator.nextString();
+                return UUIDGenerator.nextString(UUIDGenerator.TYPE1);
             case ValueStrategies.UUID_HEX:
-                return UUIDGenerator.nextHex();
+                return UUIDGenerator.nextHex(UUIDGenerator.TYPE1);
+            case ValueStrategies.UUID_TYPE4_STRING:
+                return UUIDGenerator.nextString(UUIDGenerator.TYPE4);
+            case ValueStrategies.UUID_TYPE4_HEX:
+                return UUIDGenerator.nextHex(UUIDGenerator.TYPE4);
             default:
                 return null;
         }

Modified: 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/UUIDGenerator.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/UUIDGenerator.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/UUIDGenerator.java
 (original)
+++ 
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/UUIDGenerator.java
 Tue Jun 24 12:48:23 2008
@@ -22,16 +22,18 @@
 import java.net.InetAddress;
 import java.security.SecureRandom;
 import java.util.Random;
+import java.util.UUID;
 
 import org.apache.commons.lang.exception.NestableRuntimeException;
 
 /**
- * UUID value generator.  Based on the time-based generator in the Apache
- * Commons Id project:  http://jakarta.apache.org/commons/sandbox/id/uuid.html
+ * UUID value generator.  Type 1 generator is based on the time-based 
generator  
+ * in the Apache Commons Id project:  http://jakarta.apache.org/commons/sandbox
+ * /id/uuid.html  The type 4 generator uses the standard Java UUID generator.
  *
- * The code has been vastly simplified and modified to replace the ethernet
- * address of the host machine with the IP, since we do not want to require
- * native libs and Java cannot access the MAC address directly.
+ * The type 1 code has been vastly simplified and modified to replace the 
+ * ethernet address of the host machine with the IP, since we do not want to 
+ * require native libs and Java cannot access the MAC address directly.
  *
  * In spirit, implements the IETF UUID draft specification, found here:<br />
  * http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/draft-leach-uuids-guids-01
@@ -43,6 +45,10 @@
  */
 public class UUIDGenerator {
 
+    // supported UUID types
+    public static final int TYPE1 = 1;
+    public static final int TYPE4 = 4;
+
     // indexes within the uuid array for certain boundaries
     private static final byte IDX_TIME_HI = 6;
     private static final byte IDX_TYPE = 6; // multiplexed
@@ -68,13 +74,12 @@
     private final static byte TYPE_TIME_BASED = 0x10;
 
     // random number generator used to reduce conflicts with other JVMs, and
-    // hasher for strings.  note that secure random is very slow the first time
-    // it is used; consider switching to a standard random
-    private static final Random RANDOM = new SecureRandom();
+    // hasher for strings.  
+    private static Random RANDOM;
 
     // 4-byte IP address + 2 random bytes to compensate for the fact that
     // the MAC address is usually 6 bytes
-    private static final byte[] IP;
+    private static byte[] IP;
 
     // counter is initialized to 0 and is incremented for each uuid request
     // within the same timestamp window.
@@ -88,12 +93,21 @@
     // when it overflows
     private static long _lastMillis = 0L;
     private static final int MAX_14BIT = 0x3FFF;
-    private static short _seq = (short) RANDOM.nextInt(MAX_14BIT);
-
+    private static short _seq = 0;
+        
     /*
-     * Static initializer to get the IP address of the host machine.
+     * Initializer for type 1 UUIDs.  Creates random generator and genenerates
+     * the node portion of the UUID using the IP address.
      */
-    static {
+    private static synchronized void initializeForType1()
+    {
+        if (RANDOM != null)
+            return;
+        // note that secure random is very slow the first time
+        // it is used; consider switching to a standard random
+        RANDOM = new SecureRandom();
+        _seq = (short) RANDOM.nextInt(MAX_14BIT);
+        
         byte[] ip = null;
         try {
             ip = InetAddress.getLocalHost().getAddress();
@@ -103,13 +117,25 @@
 
         IP = new byte[6];
         RANDOM.nextBytes(IP);
-        System.arraycopy(ip, 0, IP, 2, ip.length);
+        System.arraycopy(ip, 0, IP, 2, ip.length);        
     }
 
     /**
      * Return a unique UUID value.
      */
-    public static byte[] next() {
+    public static byte[] next(int type) {
+        if (type == TYPE4) {
+            return createType4();
+        }
+        return createType1();
+    }
+      
+    /*
+     * Creates a type 1 UUID 
+     */
+    public static byte[] createType1() {
+        if (RANDOM == null)
+            initializeForType1();
         // set ip addr
         byte[] uuid = new byte[16];
         System.arraycopy(IP, 0, uuid, 10, IP.length);
@@ -147,11 +173,32 @@
         return uuid;
     }
 
+    /*
+     * Creates a type 4 UUID
+     */
+    private static byte[] createType4() {
+        UUID type4 = UUID.randomUUID();
+        byte[] uuid = new byte[16];
+        longToBytes(type4.getMostSignificantBits(), uuid, 0);
+        longToBytes(type4.getLeastSignificantBits(), uuid, 8);
+        return uuid;
+    }
+    
+    /*
+     * Converts a long to byte values, setting them in a byte array
+     * at a given starting position.
+     */
+    private static void longToBytes(long longVal, byte[] buf, int sPos) {
+        sPos += 7;
+        for(int i = 0; i < 8; i++)         
+            buf[sPos-i] = (byte)(longVal >>> (i * 8));
+    }
+
     /**
      * Return the next unique uuid value as a 16-character string.
      */
-    public static String nextString() {
-        byte[] bytes = next();
+    public static String nextString(int type) {
+        byte[] bytes = next(type);
         try {
             return new String(bytes, "ISO-8859-1");
         } catch (Exception e) {
@@ -162,8 +209,8 @@
     /**
      * Return the next unique uuid value as a 32-character hex string.
      */
-    public static String nextHex() {
-        return Base16Encoder.encode(next());
+    public static String nextHex(int type) {
+        return Base16Encoder.encode(next(type));
     }
 
     /**
@@ -174,6 +221,8 @@
      */
     // package-visibility for testing
     static long getTime() {
+        if (RANDOM == null)
+            initializeForType1();
         long newTime = getUUIDTime();
         if (newTime <= _lastMillis) {
             incrementSequence();

Modified: 
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestUUIDGenerator.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestUUIDGenerator.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestUUIDGenerator.java
 (original)
+++ 
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestUUIDGenerator.java
 Tue Jun 24 12:48:23 2008
@@ -33,13 +33,39 @@
     public void testUniqueString() {
         Set seen = new HashSet();
         for (int i = 0; i < 10000; i++)
-            assertTrue(seen.add(UUIDGenerator.nextString()));
+            assertTrue(seen.add(
+                UUIDGenerator.nextString(UUIDGenerator.TYPE1)));
     }
 
     public void testUniqueHex() {
         Set seen = new HashSet();
         for (int i = 0; i < 10000; i++)
-            assertTrue(seen.add(UUIDGenerator.nextHex()));
+            assertTrue(seen.add(
+                UUIDGenerator.nextHex(UUIDGenerator.TYPE1)));
+    }
+
+    public void testUniqueType4String() {
+        Set seen = new HashSet();
+        for (int i = 0; i < 10000; i++)
+            assertTrue(seen.add(
+                UUIDGenerator.nextString(UUIDGenerator.TYPE4)));
+    }
+
+    public void testUniqueType4Hex() {
+        Set seen = new HashSet();
+        for (int i = 0; i < 10000; i++)
+            assertTrue(seen.add(
+                UUIDGenerator.nextHex(UUIDGenerator.TYPE4)));
+    }
+
+    public void testUniqueMixedTypesHex() {
+        Set seen = new HashSet();
+        for (int i = 0; i < 10000; i++) {
+            int type = (i % 2 == 0) ? 
+                UUIDGenerator.TYPE4 : UUIDGenerator.TYPE1;
+            assertTrue(seen.add(
+                UUIDGenerator.nextHex(type)));
+        }
     }
 
     public void testGetTime() {

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/GeneratedValues.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/GeneratedValues.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/GeneratedValues.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/GeneratedValues.java
 Tue Jun 24 12:48:23 2008
@@ -43,14 +43,31 @@
         
sequenceName="org.apache.openjpa.persistence.generationtype.CustomSeq()")
     private int customSeqWithIndirectionField;
 
+    @GeneratedValue(generator="uuid-hex")
+    private String uuidhex;
+
+    @GeneratedValue(generator="uuid-string")
+    private String uuidstring;
+
+    @GeneratedValue(generator="uuid-type4-hex")
+    private String uuidT4hex;
+
+    @GeneratedValue(generator="uuid-type4-string")
+    private String uuidT4string;
+    
     public GeneratedValues() {
         super();
     }
     
-    public GeneratedValues(int id, long field) {
+    public GeneratedValues(int id, long field, String uh, String us,
+        String ut4h, String ut4s) {
         super();
         this.id = id;
         this.field = field;
+        this.uuidhex = uh;
+        this.uuidstring = us;
+        this.uuidT4hex = ut4h;
+        this.uuidT4string = ut4s;
     }
 
     public int getId() {
@@ -76,4 +93,36 @@
     public int getCustomSeqWithIndirectionField() {
         return customSeqWithIndirectionField;
     }
+    
+    public void setUuidhex(String uuidhex) {
+        this.uuidhex = uuidhex;
+    }
+
+    public String getUuidhex() {
+        return uuidhex;
+    }
+
+    public void setUuidstring(String uuidstring) {
+        this.uuidstring = uuidstring;
+    }
+
+    public String getUuidstring() {
+        return uuidstring;
+    }
+
+    public void setUuidT4hex(String uuidT4hex) {
+        this.uuidT4hex = uuidT4hex;
+    }
+
+    public String getUuidT4hex() {
+        return uuidT4hex;
+    }
+
+    public void setUuidT4string(String uuidT4string) {
+        this.uuidT4string = uuidT4string;
+    }
+
+    public String getUuidT4string() {
+        return uuidT4string;
+    }
 }

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestGeneratedValues.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestGeneratedValues.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestGeneratedValues.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestGeneratedValues.java
 Tue Jun 24 12:48:23 2008
@@ -46,12 +46,16 @@
 
         assertFalse(gv.getId() == gv2.getId());
         assertFalse(gv.getField() == gv2.getField());
+        assertFalse(gv.getUuidstring().equals(gv2.getUuidstring()));
+        assertFalse(gv.getUuidhex().equals(gv2.getUuidhex()));
+        assertFalse(gv.getUuidT4hex().equals(gv2.getUuidT4hex()));
+        assertFalse(gv.getUuidT4string().equals(gv2.getUuidT4string()));
     }
     
     public void testInitialValues() { 
         EntityManager em = emf.createEntityManager();
 
-        GeneratedValues gv = new GeneratedValues(7, 9);
+        GeneratedValues gv = new GeneratedValues(7, 9, "a", "b", "c", "d");
 
         try {
             em.getTransaction().begin();
@@ -133,4 +137,82 @@
 
         assertNotEquals(0, gv.getCustomSeqWithIndirectionField());
     }
+    
+    public void testUUIDGenerators() {
+        EntityManager em = emf.createEntityManager();
+
+        GeneratedValues gv = new GeneratedValues();
+        em.getTransaction().begin();
+        em.persist(gv);
+        em.getTransaction().commit();
+        
+        int id = gv.getId();
+
+        assertTrue(isStringUUID(gv.getUuidT4string(), 4));
+        assertTrue(isStringUUID(gv.getUuidstring(), 1));
+        assertTrue(isHexUUID(gv.getUuidhex(), 1));
+        assertTrue(isHexUUID(gv.getUuidT4hex(), 4));     
+        
+        em.clear();
+        
+        GeneratedValues gv2 = em.find(GeneratedValues.class, id);  
+        assertNotNull(gv2);
+        // The string value could contain null values and such so length
+        // calculations may be non-deterministic.  For string generators, 
+        // simply ensure the fields are populated (not null). 
+        assertNotNull(gv2.getUuidstring());
+        assertTrue(isHexUUID(gv2.getUuidhex(), 1));
+        assertNotNull(gv2.getUuidT4string());
+        assertTrue(isHexUUID(gv2.getUuidT4hex(), 4));     
+        
+        // Compare original hex values with new values.  They should be equal.
+        // Note: UUID 'string' values are not compared.  In most cases they 
will
+        // be the same, but in an environment where data is converted to
+        // a considerably different character encoding of the database (ex.
+        // Unicode -> EBCDIC) upon persistence, the uuid string returned by 
the 
+        // database may not be equal to the original value.  This is a common 
+        // issue with string data, but even more likely for a uuids given that 
+        // uuid strings are produced from pseudo-random byte arrays, which 
yield 
+        // all sorts of variant characters.
+        assertTrue(gv.getId() == gv2.getId());
+        assertTrue(gv.getField() == gv2.getField());
+        assertTrue(gv.getUuidhex().equals(gv2.getUuidhex()));
+        assertTrue(gv.getUuidT4hex().equals(gv2.getUuidT4hex()));
+    }
+                
+    /*
+     * Verify a uuid string is 16 characters long and is the expected type.
+     */
+    private boolean isStringUUID(String value, int type) {
+        if (value.length() != 16)
+            return false;
+        byte version = (byte)(value.charAt(6) >>> 4);
+        if (type != version) return false;
+        return true;
+    }
+    
+    /*
+     * Verify a uuid hex string value is 32 characters long, consists entirely
+     * of hex digits and is the correct version.
+     */
+    private boolean isHexUUID(String value, int type) {
+        if (value.length() != 32) 
+            return false;
+        char[] chArr = value.toCharArray();
+        for (int i = 0; i < 32; i++)
+        {                
+            char ch = chArr[i];
+            if (!(Character.isDigit(ch) ||
+                (ch >= 'a' && ch <= 'f') ||
+                (ch >= 'A' && ch <= 'F')))
+                return false;
+            if (i == 12) {
+                if (type == 1 && ch != '1')
+                    return false;
+                if (type == 4 && ch != '4')
+                    return false;
+            }
+        }
+        return true;
+    }
 }

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ExtensionsEntity.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ExtensionsEntity.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ExtensionsEntity.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ExtensionsEntity.java
 Tue Jun 24 12:48:23 2008
@@ -41,6 +41,18 @@
     @GeneratedValue(generator = "uuid-hex")
     @Column(name = "UUID_HEX")
     private String uuid;
+    
+    @GeneratedValue(generator = "uuid-string")
+    @Column(name = "UUID_STRING")
+    private String uuidString;
+
+    @GeneratedValue(generator = "uuid-type4-hex")
+    @Column(name = "UUIDT4_HEX")
+    private String uuidT4Hex;
+
+    @GeneratedValue(generator = "uuid-type4-string")
+    @Column(name = "UUIDT4_STRING")
+    private String uuidT4String;
 
     @Basic(fetch = FetchType.LAZY)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "system")

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestExtensionAnnotations.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestExtensionAnnotations.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestExtensionAnnotations.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestExtensionAnnotations.java
 Tue Jun 24 12:48:23 2008
@@ -72,6 +72,12 @@
     public void testValueStrategy() {
         assertEquals(ValueStrategies.UUID_HEX,
             _mapping.getField("uuid").getValueStrategy());
+        assertEquals(ValueStrategies.UUID_STRING,
+            _mapping.getField("uuidString").getValueStrategy());
+        assertEquals(ValueStrategies.UUID_TYPE4_HEX,
+            _mapping.getField("uuidT4Hex").getValueStrategy());
+        assertEquals(ValueStrategies.UUID_TYPE4_STRING,
+            _mapping.getField("uuidT4String").getValueStrategy());
         FieldMapping seq = _mapping.getFieldMapping("seq");
         assertEquals(ValueStrategies.SEQUENCE, seq.getValueStrategy());
         assertEquals("system", seq.getValueSequenceName());

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
 Tue Jun 24 12:48:23 2008
@@ -1220,6 +1220,10 @@
             return ValueStrategies.UUID_HEX;
         if (Generator.UUID_STRING.equals(generator))
             return ValueStrategies.UUID_STRING;
+        if (Generator.UUID_TYPE4_HEX.equals(generator))
+            return ValueStrategies.UUID_TYPE4_HEX;
+        if (Generator.UUID_TYPE4_STRING.equals(generator))
+            return ValueStrategies.UUID_TYPE4_STRING;
         throw new MetaDataException(_loc.get("generator-bad-strategy",
             context, generator));
     }

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/Generator.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/Generator.java?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/Generator.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/Generator.java
 Tue Jun 24 12:48:23 2008
@@ -29,6 +29,8 @@
 
     public static final String UUID_HEX = "uuid-hex";
     public static final String UUID_STRING = "uuid-string";
+    public static final String UUID_TYPE4_STRING = "uuid-type4-string";
+    public static final String UUID_TYPE4_HEX = "uuid-type4-hex";
 
     /**
      * The sequence name.

Modified: openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_meta.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_meta.xml?rev=671319&r1=671318&r2=671319&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_meta.xml 
(original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_meta.xml Tue Jun 
24 12:48:23 2008
@@ -830,7 +830,7 @@
 <xref linkend="ref_guide_pc_oid_pkgen_autoinc"/> in the Reference Guide.
                 </para>
                 <para>
-OpenJPA also offers two additional generator strategies for non-numeric fields,
+OpenJPA also offers additional generator strategies for non-numeric fields,
 which you can access by setting <literal>strategy</literal> to <literal>AUTO
 </literal> (the default), and setting the <literal>generator</literal> string
 to:
@@ -851,9 +851,9 @@
                                 uuid-string
                             </primary>
                         </indexterm>
-<literal>uuid-string</literal>: OpenJPA will generate a 128-bit UUID unique
-within the network, represented as a 16-character string. For more information
-on UUIDs, see the IETF UUID draft specification at:
+<literal>uuid-string</literal>: OpenJPA will generate a 128-bit type 1 UUID
+unique within the network, represented as a 16-character string. For more
+information on UUIDs, see the IETF UUID draft specification at:
 <ulink url="http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/";>
 http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/</ulink>
                         </para>
@@ -874,7 +874,48 @@
                             </primary>
                         </indexterm>
 <literal>uuid-hex</literal>: Same as <literal> uuid-string</literal>, but
-represents the UUID as a 32-character hexadecimal string.
+represents the type 1 UUID as a 32-character hexadecimal string.
+                        </para>
+                    </listitem>
+                    <listitem>
+                        <para>
+                        <indexterm>
+                            <primary>
+                                mapping metadata
+                            </primary>
+                            <secondary>
+                                uuid-type4-string
+                            </secondary>
+                        </indexterm>
+                        <indexterm>
+                            <primary>
+                                uuid-type4-string
+                            </primary>
+                        </indexterm>
+<literal>uuid-type4-string</literal>: OpenJPA will generate a 128-bit type 4
+pseudo-random UUID, represented as a 16-character string. For more
+information on UUIDs, see the IETF UUID draft specification at:
+<ulink url="http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/";>
+http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/</ulink>
+                        </para>
+                    </listitem>
+                    <listitem>
+                        <para>
+                        <indexterm>
+                            <primary>
+                                mapping metadata
+                            </primary>
+                            <secondary>
+                                uuid-type4-hex
+                            </secondary>
+                        </indexterm>
+                        <indexterm>
+                            <primary>
+                                uuid-type4-hex
+                            </primary>
+                        </indexterm>
+<literal>uuid-type4-hex</literal>: Same as <literal> 
uuid-type4-string</literal>
+, but represents the type 4 UUID as a 32-character hexadecimal string.
                         </para>
                     </listitem>
                 </itemizedlist>


Reply via email to