[ 
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)

Reply via email to