Author: curtisr7
Date: Tue Nov  2 14:19:30 2010
New Revision: 1030056

URL: http://svn.apache.org/viewvc?rev=1030056&view=rev
Log:
OPENJPA-1867: Fix ClassCastException when loading from DataCache.

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/TestInheritanceWithDataCache.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java?rev=1030056&r1=1030055&r2=1030056&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java
 Tue Nov  2 14:19:30 2010
@@ -149,7 +149,7 @@ public class DataCacheStoreManager
                     mods.additions.add(new PCDataHolder(data, sm));
                     CacheStatistics stats = cache.getStatistics();
                     if (stats.isEnabled()) {
-                        
((CacheStatisticsSPI)stats).newPut(sm.getMetaData().getDescribedType());
+                        ((CacheStatisticsSPI)stats).newPut(data.getType());
                     }
                 }
             }
@@ -188,7 +188,7 @@ public class DataCacheStoreManager
                     }
                     CacheStatistics stats = cache.getStatistics();
                     if (stats.isEnabled()) {
-                        
((CacheStatisticsSPI)stats).newPut(sm.getMetaData().getDescribedType());
+                        ((CacheStatisticsSPI)stats).newPut(data.getType());
                     }
                 }
             }
@@ -339,7 +339,7 @@ public class DataCacheStoreManager
         // if we have a cached version update from there
         if (version != null) {
             if(stats.isEnabled()){
-                
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), true);
+                ((CacheStatisticsSPI)stats).newGet(data.getType(), true);
             }
             if (!version.equals(sm.getVersion())) {
                 sm.setVersion(version);
@@ -349,7 +349,8 @@ public class DataCacheStoreManager
         }
 
         if(stats.isEnabled()){
-            
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
+            Class<?> cls = (data == null) ? 
sm.getMetaData().getDescribedType() : data.getType();
+            ((CacheStatisticsSPI) stats).newGet(cls, false);
         }
         // use data store version
         return super.syncVersion(sm, edata);
@@ -360,7 +361,7 @@ public class DataCacheStoreManager
         if (cache == null) {
             return super.initialize(sm, state, fetch, edata);
         }
-        Class<?> cls = sm.getMetaData().getDescribedType();
+
         DataCachePCData data = cache.get(sm.getObjectId());
         CacheStatistics stats = cache.getStatistics();
         boolean fromDatabase = false; 
@@ -373,14 +374,15 @@ public class DataCacheStoreManager
         } else {
             if (alreadyCached && !isLocking(fetch)) {
                 if (stats.isEnabled()) {
-                    ((CacheStatisticsSPI)stats).newGet(cls, true);
+                    ((CacheStatisticsSPI)stats).newGet(data.getType(), true);
                 }
-                sm.initialize(cls, state);
+                sm.initialize(data.getType(), state);
                 data.load(sm, fetch, edata);
             } else {
                 if (!alreadyCached) {
                     if (stats.isEnabled()) {
-                        ((CacheStatisticsSPI)stats).newGet(cls, false);
+                        // Get the classname from MetaData... but this won't 
be right in every case. 
+                        
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
                     }
                 }
                 fromDatabase = super.initialize(sm, state, fetch, edata);
@@ -391,10 +393,10 @@ public class DataCacheStoreManager
                            && ((fetch.getCacheStoreMode() == 
DataCacheStoreMode.USE && !alreadyCached)
                             || (fetch.getCacheStoreMode() == 
DataCacheStoreMode.REFRESH));
         if (updateCache) {
+            cacheStateManager(cache, sm, data);
             if (stats.isEnabled()) {
-                ((CacheStatisticsSPI)stats).newPut(cls);
+                ((CacheStatisticsSPI) 
stats).newPut(sm.getMetaData().getDescribedType());
             }
-            cacheStateManager(cache, sm, data);
         }
         return fromDatabase || alreadyCached;
     }
@@ -435,12 +437,12 @@ public class DataCacheStoreManager
             return super.load(sm, fields, fetch, lockLevel, edata);
 
         CacheStatistics stats = cache.getStatistics();
-        Class<?> cls = sm.getMetaData().getDescribedType();
         DataCachePCData data = cache.get(sm.getObjectId());
         if (lockLevel == LockLevels.LOCK_NONE && !isLocking(fetch) && data != 
null)
             data.load(sm, fields, fetch, edata);
         if (fields.length() == 0){
             if (stats.isEnabled()) {
+                Class<?> cls = (data == null) ? 
sm.getMetaData().getDescribedType() : data.getType();
                 ((CacheStatisticsSPI)stats).newGet(cls, true);
             }
             return true;
@@ -509,7 +511,7 @@ public class DataCacheStoreManager
                         //### the 'data.type' access here probably needs
                         //### to be addressed for bug 511
                         if (stats.isEnabled()) {
-                            
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), true);
+                            ((CacheStatisticsSPI) 
stats).newGet(data.getType(), true);
                         }
                         sm.initialize(data.getType(), state);
                         data.load(sm, fetch, edata);
@@ -529,11 +531,11 @@ public class DataCacheStoreManager
                         if (fields.length() > 0){
                             unloaded = addUnloaded(sm, fields, unloaded);
                             if (stats.isEnabled()) {
-                                
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
+                                
((CacheStatisticsSPI)stats).newGet(data.getType(), false);
                             }
                         }else{
                             if (stats.isEnabled()) {
-                                
((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), true);
+                                
((CacheStatisticsSPI)stats).newGet(data.getType(), true);
                             }
                         }
                     } else{
@@ -588,7 +590,7 @@ public class DataCacheStoreManager
                     cache.update(data);
                 CacheStatistics stats = cache.getStatistics();
                 if (stats.isEnabled()) {
-                    
((CacheStatisticsSPI)stats).newPut(sm.getMetaData().getDescribedType());
+                    ((CacheStatisticsSPI)stats).newPut(data.getType());
                 }
             } finally {
                 cache.writeUnlock();

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/TestInheritanceWithDataCache.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/TestInheritanceWithDataCache.java?rev=1030056&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/TestInheritanceWithDataCache.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/datacache/TestInheritanceWithDataCache.java
 Tue Nov  2 14:19:30 2010
@@ -0,0 +1,70 @@
+/*
+ * 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.persistence.inheritance.datacache;
+
+import javax.persistence.EntityManager;
+
+import org.apache.openjpa.persistence.inheritance.entity.Department;
+import org.apache.openjpa.persistence.inheritance.entity.Employee;
+import org.apache.openjpa.persistence.inheritance.entity.FTEmployee;
+import org.apache.openjpa.persistence.inheritance.entity.Manager;
+import org.apache.openjpa.persistence.inheritance.entity.PTEmployee;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestInheritanceWithDataCache extends SingleEMFTestCase {
+    Object[] props =
+        new Object[] { FTEmployee.class, Employee.class, Manager.class, 
PTEmployee.class, Department.class,
+            "openjpa.DataCache", "true", CLEAR_TABLES };
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp(props);
+    }
+
+    public void test() throws Exception {
+        EntityManager em = emf.createEntityManager();
+        try {
+            // Create a manager and a department
+            em.getTransaction().begin();
+            Manager m = new Manager();
+            m.setId(1);
+            em.persist(m);
+            Department dept = new Department();
+            dept.setId(1);
+            dept.setDepartmentManager(m);
+            em.persist(dept);
+            m.setDepartment(dept);
+            em.getTransaction().commit();
+            em.clear();
+
+            emf.getCache().evictAll();
+
+            Employee e = em.find(Employee.class, 1);
+            assertNotNull(e);
+            assertTrue(e instanceof Manager);
+            em.clear();
+            e = em.find(Employee.class, 1);
+            assertNotNull(e);
+            assertTrue(e instanceof Manager);
+        } finally {
+            em.close();
+        }
+
+    }
+}

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


Reply via email to