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());
}
}