You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2007/04/11 22:25:12 UTC

svn commit: r527648 - in /incubator/openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-kernel/src/main/java/org/apache/openjpa/util/ openjpa-persistence-jdbc/src/test/ja...

Author: awhite
Date: Wed Apr 11 13:25:11 2007
New Revision: 527648

URL: http://svn.apache.org/viewvc?view=rev&rev=527648
Log:
OPENJPA-214 : Support float and double fields as single-field identity primary
keys.


Added:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/DoubleId.java   (with props)
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/FloatId.java   (with props)
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java   (with props)
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java   (with props)
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java   (with props)
Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java
    incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistence.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?view=diff&rev=527648&r1=527647&r2=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Wed Apr 11 13:25:11 2007
@@ -62,8 +62,10 @@
 import org.apache.openjpa.util.ByteId;
 import org.apache.openjpa.util.CharId;
 import org.apache.openjpa.util.DateId;
+import org.apache.openjpa.util.DoubleId;
 import org.apache.openjpa.util.Id;
 import org.apache.openjpa.util.IntId;
+import org.apache.openjpa.util.FloatId;
 import org.apache.openjpa.util.LongId;
 import org.apache.openjpa.util.ObjectId;
 import org.apache.openjpa.util.ShortId;
@@ -1632,6 +1634,32 @@
                         code.invokespecial().setMethod(Character.class, 
                             "<init>", void.class, new Class[] {char.class});
                     break;
+                case JavaTypes.DOUBLE_OBJ:
+                    code.anew().setType(Double.class);
+                    code.dup();
+                    // no break
+                case JavaTypes.DOUBLE:
+                    code.aload().setLocal(oid);
+                    code.checkcast().setType(DoubleId.class);
+                    code.invokevirtual().setMethod(DoubleId.class, "getId",
+                        double.class, null);
+                    if (pkcode == JavaTypes.DOUBLE_OBJ)
+                        code.invokespecial().setMethod(Double.class, "<init>", 
+                            void.class, new Class[]{double.class});
+                    break;
+                case JavaTypes.FLOAT_OBJ:
+                    code.anew().setType(Float.class);
+                    code.dup();
+                    // no break
+                case JavaTypes.FLOAT:
+                    code.aload().setLocal(oid);
+                    code.checkcast().setType(FloatId.class);
+                    code.invokevirtual().setMethod(FloatId.class, "getId",
+                        float.class, null);
+                    if (pkcode == JavaTypes.FLOAT_OBJ)
+                        code.invokespecial().setMethod(Float.class, "<init>", 
+                            void.class, new Class[]{float.class});
+                    break;
                 case JavaTypes.INT_OBJ:
                     code.anew().setType(Integer.class);
                     code.dup();
@@ -1927,6 +1955,10 @@
                 return byte.class;
             case JavaTypes.CHAR_OBJ:
                 return char.class;
+            case JavaTypes.DOUBLE_OBJ:
+                return double.class;
+            case JavaTypes.FLOAT_OBJ:
+                return float.class;
             case JavaTypes.INT_OBJ:
                 return int.class;
             case JavaTypes.SHORT_OBJ:

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java?view=diff&rev=527648&r1=527647&r2=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java Wed Apr 11 13:25:11 2007
@@ -44,6 +44,8 @@
 import org.apache.openjpa.util.ByteId;
 import org.apache.openjpa.util.CharId;
 import org.apache.openjpa.util.DateId;
+import org.apache.openjpa.util.DoubleId;
+import org.apache.openjpa.util.FloatId;
 import org.apache.openjpa.util.GeneralException;
 import org.apache.openjpa.util.IntId;
 import org.apache.openjpa.util.InternalException;
@@ -437,6 +439,14 @@
             case JavaTypes.CHAR:
             case JavaTypes.CHAR_OBJ:
                 _objectId = CharId.class;
+                break;
+            case JavaTypes.DOUBLE:
+            case JavaTypes.DOUBLE_OBJ:
+                _objectId = DoubleId.class;
+                break;
+            case JavaTypes.FLOAT:
+            case JavaTypes.FLOAT_OBJ:
+                _objectId = FloatId.class;
                 break;
             case JavaTypes.INT:
             case JavaTypes.INT_OBJ:

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java?view=diff&rev=527648&r1=527647&r2=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java Wed Apr 11 13:25:11 2007
@@ -125,6 +125,18 @@
                 case JavaTypes.CHAR_OBJ:
                     return new CharId(meta.getDescribedType(),
                         ((Character) val).charValue());
+                case JavaTypes.DOUBLE:
+                case JavaTypes.DOUBLE_OBJ:
+                    if (!convert && !(val instanceof Double))
+                        throw new ClassCastException("!(x instanceof Double)");
+                    return new DoubleId(meta.getDescribedType(),
+                        ((Number) val).doubleValue());
+                case JavaTypes.FLOAT:
+                case JavaTypes.FLOAT_OBJ:
+                    if (!convert && !(val instanceof Float))
+                        throw new ClassCastException("!(x instanceof Float)");
+                    return new FloatId(meta.getDescribedType(),
+                        ((Number) val).floatValue());
                 case JavaTypes.INT:
                 case JavaTypes.INT_OBJ:
                     if (!convert && !(val instanceof Integer))
@@ -216,6 +228,14 @@
                 case JavaTypes.CHAR:
                 case JavaTypes.CHAR_OBJ:
                     return new CharId(cls, ((CharId) oid).getId(),
+                        koid.hasSubclasses());
+                case JavaTypes.DOUBLE:
+                case JavaTypes.DOUBLE_OBJ:
+                    return new DoubleId(cls, ((DoubleId) oid).getId(),
+                        koid.hasSubclasses());
+                case JavaTypes.FLOAT:
+                case JavaTypes.FLOAT_OBJ:
+                    return new FloatId(cls, ((FloatId) oid).getId(),
                         koid.hasSubclasses());
                 case JavaTypes.INT:
                 case JavaTypes.INT_OBJ:

Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/DoubleId.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/DoubleId.java?view=auto&rev=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/DoubleId.java (added)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/DoubleId.java Wed Apr 11 13:25:11 2007
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.util;
+
+/**
+ * {@link OpenJPAId} subclass appropriate for double fields.
+ *
+ * @author Abe White
+ */
+public final class DoubleId 
+    extends OpenJPAId {
+
+    private final double key;
+
+    public DoubleId(Class cls, Double key) {
+        this(cls, (key == null) ? 0D : key.doubleValue());
+    }
+
+    public DoubleId(Class cls, String key) {
+        this(cls, (key == null) ? 0D : Double.parseDouble(key));
+    }
+
+    public DoubleId(Class cls, double key) {
+        super(cls);
+        this.key = key;
+    }
+
+    public DoubleId(Class cls, double key, boolean subs) {
+        super(cls, subs);
+        this.key = key;
+    }
+
+    public double getId() {
+        return key;
+    }
+
+    public Object getIdObject() {
+        return new Double(key);
+    }
+
+    public String toString() {
+        return Double.toString(key);
+    }
+
+    protected int idHash() {
+        return (int) (Double.doubleToLongBits(key) 
+            ^ (Double.doubleToLongBits(key) >>> 32));
+    }
+
+    protected boolean idEquals(OpenJPAId o) {
+        return key == ((DoubleId) o).key;
+    }
+}

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

Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/FloatId.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/FloatId.java?view=auto&rev=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/FloatId.java (added)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/FloatId.java Wed Apr 11 13:25:11 2007
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.util;
+
+/**
+ * {@link OpenJPAId} subclass appropriate for float fields.
+ *
+ * @author Abe White
+ */
+public final class FloatId 
+    extends OpenJPAId {
+
+    private final float key;
+
+    public FloatId(Class cls, Float key) {
+        this(cls, (key == null) ? 0F : key.floatValue());
+    }
+
+    public FloatId(Class cls, String key) {
+        this(cls, (key == null) ? 0F : Float.parseFloat(key));
+    }
+
+    public FloatId(Class cls, float key) {
+        super(cls);
+        this.key = key;
+    }
+
+    public FloatId(Class cls, float key, boolean subs) {
+        super(cls, subs);
+        this.key = key;
+    }
+
+    public float getId() {
+        return key;
+    }
+
+    public Object getIdObject() {
+        return new Float(key);
+    }
+
+    public String toString() {
+        return Float.toString(key);
+    }
+
+    protected int idHash() {
+        return Float.floatToIntBits(key);
+    }
+
+    protected boolean idEquals(OpenJPAId o) {
+        return key == ((FloatId) o).key;
+    }
+}

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

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java?view=auto&rev=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java Wed Apr 11 13:25:11 2007
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.persistence.identity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class DoubleObjIdEntity {
+
+    @Id
+    private Double id;
+    private int data;
+
+    public Double getId() {
+        return id;
+    }
+
+    public void setId(Double id) {
+        this.id = id;
+    }
+
+    public int getData() {
+        return data;
+    }
+
+    public void setData(int data) {
+        this.data = data;
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/DoubleObjIdEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java?view=auto&rev=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java Wed Apr 11 13:25:11 2007
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.persistence.identity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class FloatIdEntity {
+
+    @Id
+    private float id;
+    private int data;
+
+    public float getId() {
+        return id;
+    }
+
+    public void setId(float id) {
+        this.id = id;
+    }
+
+    public int getData() {
+        return data;
+    }
+
+    public void setData(int data) {
+        this.data = data;
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/FloatIdEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java?view=auto&rev=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java Wed Apr 11 13:25:11 2007
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.persistence.identity;
+
+import java.sql.Date;
+import javax.persistence.EntityManager;
+
+import junit.textui.TestRunner;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Test that entities can use floating point ids.
+ *
+ * @author Abe White
+ */
+public class TestFloatingPointIds
+    extends SingleEMFTestCase {
+
+    public void setUp() {
+        setUp(FloatIdEntity.class, DoubleObjIdEntity.class);
+    }
+
+    public void testPersistFloat() {
+        FloatIdEntity e = new FloatIdEntity();
+        e.setId(3F);
+        e.setData(33);
+
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        em.persist(e);
+        em.getTransaction().commit();
+        assertEquals(3F, e.getId());
+        em.close();
+
+        em = emf.createEntityManager();
+        e = em.find(FloatIdEntity.class, 3F);
+        assertEquals(33, e.getData());
+        em.close();
+    }
+
+    public void testPersistDoubleObj() {
+        DoubleObjIdEntity e = new DoubleObjIdEntity();
+        e.setId(new Double(4D));
+        e.setData(44);
+
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        em.persist(e);
+        em.getTransaction().commit();
+        assertEquals(new Double(4D), e.getId());
+        em.close();
+
+        em = emf.createEntityManager();
+        e = em.find(DoubleObjIdEntity.class, new Double(4D));
+        assertEquals(44, e.getData());
+        em.close();
+    }
+
+    public static void main(String[] args) {
+        TestRunner.run(TestFloatingPointIds.class);
+    }
+}
+

Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/TestFloatingPointIds.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistence.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistence.java?view=diff&rev=527648&r1=527647&r2=527648
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistence.java (original)
+++ incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistence.java Wed Apr 11 13:25:11 2007
@@ -35,7 +35,18 @@
 import org.apache.openjpa.lib.conf.ConfigurationProvider;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.util.*;
+import org.apache.openjpa.util.ByteId;
+import org.apache.openjpa.util.CharId;
+import org.apache.openjpa.util.DoubleId;
+import org.apache.openjpa.util.FloatId;
+import org.apache.openjpa.util.Id;
+import org.apache.openjpa.util.ImplHelper;
+import org.apache.openjpa.util.IntId;
+import org.apache.openjpa.util.LongId;
+import org.apache.openjpa.util.ObjectId;
+import org.apache.openjpa.util.OpenJPAId;
+import org.apache.openjpa.util.ShortId;
+import org.apache.openjpa.util.StringId;
 
 /**
  * Static helper method for JPA users, including switching
@@ -373,6 +384,10 @@
             return new ByteId(cls, (Byte) oid);
         if (oid instanceof Character)
             return new CharId(cls, (Character) oid);
+        if (oid instanceof Double)
+            return new DoubleId(cls, (Double) oid);
+        if (oid instanceof Float)
+            return new FloatId(cls, (Float) oid);
         if (oid instanceof Integer)
             return new IntId(cls, (Integer) oid);
         if (oid instanceof Long)
@@ -440,6 +455,10 @@
             return Byte.class;
         if (oidClass == CharId.class)
             return Character.class;
+        if (oidClass == DoubleId.class)
+            return Double.class;
+        if (oidClass == FloatId.class)
+            return Float.class;
         if (oidClass == IntId.class)
             return Integer.class;
         if (oidClass == LongId.class)