Author: kwsutter
Date: Tue Apr 22 16:01:56 2014
New Revision: 1589187

URL: http://svn.apache.org/r1589187
Log:
OPENJPA-2492.  Committing a variation of the patch as provided by Romain 
Manni-Bucau.  This patch clears up the ConcurrentHashMap issues relating to the 
KeySetView return type.  This patch also adds a couple of asserts to an 
existing testcase to verify the results.

Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyMaps.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestConcurrentMap.java

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java?rev=1589187&r1=1589186&r2=1589187&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java
 Tue Apr 22 16:01:56 2014
@@ -1331,6 +1331,9 @@ public class ProxyManagerImpl
         Method match;
         Method after;
         for (int i = 0; i < meths.length; i++) {
+            // Java 8 methods with a return type of KeySetView do not need to 
be proxied
+            if (meths[i].getReturnType().getName().contains("KeySetView")) 
continue;
+
             params = toHelperParameters(meths[i].getParameterTypes(), 
                 proxyType);
 

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyMaps.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyMaps.java?rev=1589187&r1=1589186&r2=1589187&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyMaps.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyMaps.java
 Tue Apr 22 16:01:56 2014
@@ -78,7 +78,8 @@ public class ProxyMaps 
      */
     public static boolean beforeGet(ProxyMap map, Object key) {
         assertAllowedType(key, map.getKeyType());
-        return map.containsKey(key);
+        // Java 8 solution/workaround due to containsKey() calling get!=null, 
which could cause infinite loop
+        return map.keySet().contains(key);
     }
 
     /**

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestConcurrentMap.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestConcurrentMap.java?rev=1589187&r1=1589186&r2=1589187&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestConcurrentMap.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestConcurrentMap.java
 Tue Apr 22 16:01:56 2014
@@ -44,5 +44,8 @@ public class TestConcurrentMap extends S
         right.getLeftEntityMap().put(left.getStrData(), left);
         
         em.getTransaction().commit();
+        
+        assertEquals(1, right.getLeftEntityMap().size());
+        assertEquals(1, 
right.getLeftEntityMap().get(left.getStrData()).getId());
     }
 }


Reply via email to