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/03/19 22:46:46 UTC

svn commit: r520117 - in /incubator/openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/main/java/org/apache/openjpa/util/ openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/ openjpa-kernel/src/main/resour...

Author: awhite
Date: Mon Mar 19 14:46:45 2007
New Revision: 520117

URL: http://svn.apache.org/viewvc?view=rev&rev=520117
Log:
OPENJPA-174 : Remove legacy code throwing an exception when attempting to 
construct an oid instance for an abstract persistent type.  Improve error
message in ApplicationIds when attempting to create a new id instance when the
id class is abstract.


Added:
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/AbstractBase.java   (with props)
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/ConcreteSubclass.java   (with props)
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java   (with props)
Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
    incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=520117&r1=520116&r2=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Mon Mar 19 14:46:45 2007
@@ -1080,37 +1080,27 @@
         try {
             ClassMetaData meta = _conf.getMetaDataRepositoryInstance().
                 getMetaData(cls, _loader, true);
-
-            // delegate to store manager for datastore ids
-            if (meta.getIdentityType() == ClassMetaData.ID_DATASTORE) {
+            switch (meta.getIdentityType()) {
+            case ClassMetaData.ID_DATASTORE:
+                // delegate to store manager for datastore ids
                 if (val instanceof String
                     && ((String) val).startsWith(StateManagerId.STRING_PREFIX))
                     return new StateManagerId((String) val);
                 return _store.newDataStoreId(val, meta);
-            } else if (meta.getIdentityType() == ClassMetaData.ID_UNKNOWN)
+            case ClassMetaData.ID_APPLICATION:
+                if (ImplHelper.isAssignable(meta.getObjectIdType(), 
+                    val.getClass())) {
+                    if (!meta.isOpenJPAIdentity() 
+                        && meta.isObjectIdTypeShared())
+                        return new ObjectId(cls, val);
+                    return val;
+                }
+                Object[] arr = (val instanceof Object[]) ? (Object[]) val
+                    : new Object[]{ val };
+                return ApplicationIds.fromPKValues(arr, meta);
+            default:
                 throw new UserException(_loc.get("meta-unknownid", cls));
-
-            if (val instanceof String
-                && !_conf.getCompatibilityInstance().getStrictIdentityValues())
-            {
-                // bug #958: section 9.6 of the JDO 1.0.1 specification states
-                // that a fatal internal exception should be thrown when
-                // invoking this method on an abstract class
-                if (Modifier.isAbstract(cls.getModifiers()))
-                    throw new InternalException(_loc.get("objectid-abstract",
-                        cls));
-                return PCRegistry.newObjectId(cls, (String) val);
             }
-            if (ImplHelper.isAssignable(meta.getObjectIdType(), val.getClass()))
-            {
-                if (!meta.isOpenJPAIdentity() && meta.isObjectIdTypeShared())
-                    return new ObjectId(cls, val);
-                return val;
-            }
-
-            Object[] arr = (val instanceof Object[]) ? (Object[]) val
-                : new Object[]{ val };
-            return ApplicationIds.fromPKValues(arr, meta);
         } catch (OpenJPAException ke) {
             throw ke;
         } catch (ClassCastException cce) {

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=520117&r1=520116&r2=520117
==============================================================================
--- 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 Mon Mar 19 14:46:45 2007
@@ -27,6 +27,7 @@
 import org.apache.openjpa.kernel.ObjectIdStateManager;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.kernel.StoreManager;
+import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.JavaTypes;
@@ -41,6 +42,9 @@
  */
 public class ApplicationIds {
 
+    private static final Localizer _loc = Localizer.forPackage
+        (ApplicationIds.class);
+
     /**
      * Return the primary key values for the given object id. The values
      * will be returned in the same order as the metadata primary key fields.
@@ -165,6 +169,8 @@
 
         // default to reflection
         Class oidType = meta.getObjectIdType();
+        if (Modifier.isAbstract(oidType.getModifiers()))
+            throw new UserException(_loc.get("objectid-abstract", meta));
         Object copy = null;
         try {
             copy = oidType.newInstance();

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?view=diff&rev=520117&r1=520116&r2=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Mon Mar 19 14:46:45 2007
@@ -180,8 +180,6 @@
 	already exists in the L1 cache.  This can occur when you \
 	assign an existing id to a new instance, and before flushing attempt to \
 	load the existing instance for that id.
-objectid-abstract: Cannot create new application identity instance for \
-	abstract class "{0}".
 bad-id-value: The given value "{0}" cannot be converted into an identity \
 	for "{2}".  The value is the wrong type ({1}).
 factory-init: Starting OpenJPA {0}

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties?view=diff&rev=520117&r1=520116&r2=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/util/localizer.properties Mon Mar 19 14:46:45 2007
@@ -16,7 +16,8 @@
 nested: Nested:
 null-oid: Null id value encountered while creating datastore identity for "{0}".
 unknown-oid: While creating datastore identity for "{0}", unknown id value \
-	"{1}" of type "{2}" encountered.  Cannot convert to org.apache.openjpa.util.Id.
+	"{1}" of type "{2}" encountered.  Cannot convert to \
+    org.apache.openjpa.util.Id.
 bad-ser-oid: Encountered object id "{0}" in serialized data, but the \
 	corresponding persistent object no longer exists.  Substituting null into \
 	the deserialization stream. 
@@ -67,3 +68,5 @@
 unique: A unique constraint violation has occurred. 
 ref-integrity: A referential integrity constraint has occurred.
 no-store-exts: No store-specific facade found matching "{0}".  Using default.
+objectid-abstract: Cannot create new application identity instance for \
+	abstract class "{0}".

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/AbstractBase.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/AbstractBase.java?view=auto&rev=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/AbstractBase.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/AbstractBase.java Mon Mar 19 14:46:45 2007
@@ -0,0 +1,38 @@
+/*
+ * 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.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+@Entity
+@Inheritance(strategy=InheritanceType.JOINED)
+public abstract class AbstractBase {
+
+    @Id
+    private String id;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}
+

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

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/ConcreteSubclass.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/ConcreteSubclass.java?view=auto&rev=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/ConcreteSubclass.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/ConcreteSubclass.java Mon Mar 19 14:46:45 2007
@@ -0,0 +1,34 @@
+/*
+ * 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.inheritance;
+
+import javax.persistence.Entity;
+
+@Entity 
+public class ConcreteSubclass 
+    extends AbstractBase {
+
+    private int subclassData;
+
+    public int getSubclassData() {
+        return subclassData;
+    }
+
+    public void setSubclassData(int subclassData) {
+        this.subclassData = subclassData;
+    }
+}
+

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

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java?view=auto&rev=520117
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java Mon Mar 19 14:46:45 2007
@@ -0,0 +1,83 @@
+/*
+ * 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.inheritance;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import junit.framework.TestCase;
+import junit.textui.TestRunner;
+
+/**
+ * Test that you can find a concrete subclass record when passing in its
+ * abstract base class to EntityManager.find().
+ *
+ * @author Abe White
+ */
+public class TestFindAbstractClass
+    extends TestCase {
+
+    private EntityManagerFactory emf;
+
+    public void setUp() {
+        String types = AbstractBase.class.getName() + ";"
+            + ConcreteSubclass.class.getName();
+        Map props = new HashMap(System.getProperties());
+        props.put("openjpa.MetaDataFactory", "jpa(Types=" + types + ")");
+        emf = Persistence.createEntityManagerFactory("test", props);
+
+        ConcreteSubclass e = new ConcreteSubclass();
+        e.setId("id");
+        e.setSubclassData(1); 
+
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        em.persist(e);
+        em.getTransaction().commit();
+        em.close();
+    }
+
+    public void tearDown() {
+        if (emf == null)
+            return;
+        try {
+            EntityManager em = emf.createEntityManager();
+            em.getTransaction().begin();
+            em.createQuery("delete from ConcreteSubclass").executeUpdate();
+            em.getTransaction().commit();
+            em.close();
+            emf.close();
+        } catch (Exception e) {
+        }
+    }
+
+    public void testFind() {
+        EntityManager em = emf.createEntityManager();
+        AbstractBase e = em.find(AbstractBase.class, "id");
+        assertNotNull(e);
+        assertTrue(e instanceof ConcreteSubclass);
+        assertEquals(1, ((ConcreteSubclass) e).getSubclassData());
+        em.close();
+    }
+
+    public static void main(String[] args) {
+        TestRunner.run(TestFindAbstractClass.class);
+    }
+}
+

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