[
https://issues.apache.org/jira/browse/OPENJPA-2442?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13965756#comment-13965756
]
Kevin Sutter commented on OPENJPA-2442:
---------------------------------------
Looked at the failing tests in openjpa-kernel. Built OpenJPA with Java 7, then
attempted to run the openjpa-kernel tests with Java 8 runtime. I get 3 errors.
They are related to the dynamic custom proxies generated for Map attributes in
an Entity. The errors are due to the fact that OpenJPA does not properly
recognize the new remove(key. value) method on the Map interface. Actually, it
does sort of recognize it due to the ConcurrentHashMap interface, but the
existence of this remove(key, value) method just confuses our proxy generation.
I don't have a complete answer yet, but I thought I would post what I have
found out so that we don't have to start over the next time...
>From the call stack of one of the failures:
testCopyMaps(org.apache.openjpa.util.TestProxyManager) Time elapsed: 0.012 sec
<<< ERROR!
<openjpa-2.4.0-SNAPSHOT-r422266:1580972M nonfatal general error>
org.apache.openjpa.util.GeneralException:
org.apache.openjpa.util.org$apache$openjpa$util$TestProxyManager$CustomMap$9$proxy
at
org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:72)
You can follow the code path and see that we are attempting to generate the
bytecodes right when we're trying to load the class. Eventually, we get to
this portion of the code in ProxyManagerImpl.generateProxyMapBytecode():
Class<? extends ProxyMaps> mapProxyClassType =
ConcurrentMap.class.isAssignableFrom(type) ?
ProxyConcurrentMaps.class : ProxyMaps.class;
proxyRecognizedMethods(bc, type, mapProxyClassType, ProxyMap.class);
This is where things go awry... Since a standard Map now supports a
remove(key, value) method, we end up matching up with ProxyMaps instead of
ProxyConcurrentMaps, which then generates some strange code (from the javap
output):
public boolean remove(java.lang.Object, java.lang.Object);
descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Z
flags: ACC_PUBLIC
Code:
stack=4, locals=4, args_size=3
0: aload_0
1: aload_1
2: aload_2
3: invokespecial #132 // Method
org/apache/openjpa/util/TestProxyManager$CustomMap.remove:(Ljava/lang/Object;Ljava/lang/Object;)Z
6: istore_3
7: aload_0
8: aload_1
9: aload_2
10: iload_3
11: invokestatic #101 // Method
org/apache/openjpa/util/ProxyMaps.afterRemove:(Lorg/apache/openjpa/util/ProxyMap;Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
14: ireturn
There is no matching beforeRemove() method invoked -- which should be a
standard practice of having matching before/after calls. And, the
afterRemove() method that is invoked on ProxyMaps really doesn't match the
expected processing of the remove(key, value) method. Looking at our code a
bit, it looks like the use of the ProxyConcurrentMaps interface would have been
a better match. At least the remove(key, value) method is already recognized...
Anyway, that's what I have so far. I don't know if this is simply a matter of
including processing for remove(key, value) in ProxyMaps, or if there's
something more involved than that. Need more time to experiment and I have run
out of that for the time being... :-) Good luck to the next player.
> java.lang.VerifyError in TestProxyManager when loading a dynamically created
> custom proxy class on Oracle Java 8
> ----------------------------------------------------------------------------------------------------------------
>
> Key: OPENJPA-2442
> URL: https://issues.apache.org/jira/browse/OPENJPA-2442
> Project: OpenJPA
> Issue Type: Bug
> Components: kernel
> Affects Versions: 2.4.0
> Environment: >java -version
> java version "1.8.0-ea"
> Java(TM) SE Runtime Environment (build 1.8.0-ea-b109)
> Java HotSpot(TM) 64-Bit Server VM (build 25.0-b51, mixed mode)
> Reporter: Rick Curtis
>
> While testing with Java 8 I encountered the following error noted below[1].
> I'm opening this JIRA as I want to get all known issues documented.
> [1]
> <openjpa-2.3.0-SNAPSHOT-r422266:1532833M nonfatal general error>
> org.apache.openjpa.util.GeneralException:
> org.apache.openjpa.util.java$util$TreeMap$6$proxy
> at
> org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:71)
> at
> org.apache.openjpa.util.ProxyManagerImpl.getFactoryProxyMap(ProxyManagerImpl.java:407)
> at
> org.apache.openjpa.util.ProxyManagerImpl.copyMap(ProxyManagerImpl.java:222)
> at
> org.apache.openjpa.util.TestProxyManager.testCopySortedMaps(TestProxyManager.java:421)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:491)
> at junit.framework.TestCase.runTest(TestCase.java:154)
> at junit.framework.TestCase.runBare(TestCase.java:127)
> at junit.framework.TestResult$1.protect(TestResult.java:106)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.framework.TestResult.run(TestResult.java:109)
> at junit.framework.TestCase.run(TestCase.java:118)
> at junit.framework.TestSuite.runTest(TestSuite.java:208)
> at junit.framework.TestSuite.run(TestSuite.java:203)
> at
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
> at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: java.lang.VerifyError: (class:
> org/apache/openjpa/util/java$util$TreeMap$6$proxy, method: remove signature:
> (Ljava/lang/Object;Ljava/lang/Object;)Z) Expecting to find integer on stack
> at java.lang.Class.forName0(Native Method)
> at java.lang.Class.forName(Class.java:339)
> at
> org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:67)
> ... 21 more
--
This message was sent by Atlassian JIRA
(v6.2#6252)