[
https://issues.apache.org/jira/browse/OPENJPA-1790?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12913187#action_12913187
]
Jody Grassel commented on OPENJPA-1790:
---------------------------------------
It turns out that the problem is with the way OpenJPA extends a Map type to
implement Proxy and ProxyMap during runtime with the ProxyManagerImpl when the
type of the map is a ConcurrentMap type, in Kai's case it is ConcurrentHashMap.
ConcurrentMap defines a method "boolean replace(Object, Object)" -- the very
method that is in the reported Exception:
java.lang.VerifyError: (class:
org/apache/openjpa/util/java$util$concurrent$ConcurrentHashMap$11$proxy,
method: remove signature: (Ljava/lang/Object;Ljava/lang/Object;)Z) Expecting to
find integer on stack
After researching more on the VerifyError, it looks like the version of remove
(remove methods are considered to be setter methods by
ProxyManagerImpl.isSetter()) is wrappered by ProxyManagerImpl.proxySetter().
And while it looks like proxySetter() is taking care to ensure the return type
is preserved, the VerifyError suggests the bytecode is trying to return an
object of type integer instead.
I've reproduced this problem with a junit test, all that needed to be done was
to initialize a relationship field of type Map with a ConcurrentHashMap, and
the Exception surfaced during transaction commit:
<testcase time="0.158"
classname="org.apache.openjpa.persistence.relations.TestConcurrentMap"
name="testConcurrentMap001">
<error message="(class:
org/apache/openjpa/util/java$util$concurrent$ConcurrentHashMap$1$proxy, method:
remove signature: (Ljava/lang/Object;Ljava/lang/Object;)Z) Expecting to find
integer on stack" type="java.lang.VerifyError">java.lang.VerifyError: (class:
org/apache/openjpa/util/java$util$concurrent$ConcurrentHashMap$1$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:247)
at
org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:71)
at
org.apache.openjpa.util.ProxyManagerImpl.getFactoryProxyMap(ProxyManagerImpl.java:382)
at
org.apache.openjpa.util.ProxyManagerImpl.newMapProxy(ProxyManagerImpl.java:207)
at
org.apache.openjpa.kernel.StateManagerImpl.newFieldProxy(StateManagerImpl.java:1829)
at
org.apache.openjpa.kernel.SingleFieldManager.proxy(SingleFieldManager.java:117)
at
org.apache.openjpa.kernel.StateManagerImpl.proxyFields(StateManagerImpl.java:2896)
at
org.apache.openjpa.kernel.PNonTransState.initialize(PNonTransState.java:45)
at
org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:287)
at
org.apache.openjpa.kernel.StateManagerImpl.commit(StateManagerImpl.java:1128)
at
org.apache.openjpa.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2383)
at
org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:1975)
at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:94)
at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479)
at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:560)
at
org.apache.openjpa.persistence.relations.TestConcurrentMap.testConcurrentMap001(TestConcurrentMap.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:154)
at
org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runTest(AbstractPersistenceTestCase.java:516)
This junit should provide a baseline with developing a fix for this problem.
> java.lang.VerifyError thrown when trying to commit entity.
> ----------------------------------------------------------
>
> Key: OPENJPA-1790
> URL: https://issues.apache.org/jira/browse/OPENJPA-1790
> Project: OpenJPA
> Issue Type: Bug
> Components: kernel
> Affects Versions: 2.0.1
> Environment: JDK1.6 u20, maven 2.2.1, Apache Shindig 2.0, OpenJPA
> 2.0.1
> Reporter: Kai Feng Zhang
> Assignee: Jody Grassel
> Priority: Critical
> Attachments: concurrent_junit.patch, persistence.xml,
> PersonServiceDbTest.java, pom.xml, SpiDatabaseBootstrap.java
>
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> Hi,
> Now I am working on OpenJPA support for Apache Shindig 2.0. There is a test
> case to insert some entity into backend derby database, but every time when
> running to commint(), there is such error thrown, unfortunately I am not to
> work it out, and ask here if this is a known issue? Thanks.
> I searched an issue past of:
> https://issues.apache.org/jira/browse/OPENJPA-91, and tried to put all
> openjpa related jars into jdk/jre/lib/ext, but it does not work for.
> In DOS cmd line or in eclipse IDE, I run the junit test case with jdk 1.6,
> both returning same error:
> -------------------------------------------------------------------------------
> Test set: org.apache.shindig.social.opensocial.jpa.spi.PersonServiceDbTest
> -------------------------------------------------------------------------------
> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.391 sec <<<
> FAILURE!
> org.apache.shindig.social.opensocial.jpa.spi.PersonServiceDbTest Time
> elapsed: 0.438 sec <<< ERROR!
> java.lang.VerifyError: (class:
> org/apache/openjpa/util/java$util$concurrent$ConcurrentHashMap$11$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:247)
> at
> org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:67)
> at
> org.apache.openjpa.util.ProxyManagerImpl.getFactoryProxyMap(ProxyManagerImpl.java:382)
> at
> org.apache.openjpa.util.ProxyManagerImpl.newMapProxy(ProxyManagerImpl.java:207)
> at
> org.apache.openjpa.kernel.StateManagerImpl.newFieldProxy(StateManagerImpl.java:1829)
> at
> org.apache.openjpa.kernel.SingleFieldManager.proxy(SingleFieldManager.java:117)
> at
> org.apache.openjpa.kernel.StateManagerImpl.proxyFields(StateManagerImpl.java:2896)
> at
> org.apache.openjpa.kernel.PNonTransState.initialize(PNonTransState.java:45)
> at
> org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:287)
> at
> org.apache.openjpa.kernel.StateManagerImpl.commit(StateManagerImpl.java:1128)
> at
> org.apache.openjpa.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2383)
> at
> org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:1975)
> at
> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:94)
> at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479)
> at
> org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
> at
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:560)
> at
> org.apache.shindig.social.opensocial.jpa.spi.SpiDatabaseBootstrap.bootstrapDatabase(SpiDatabaseBootstrap.java:186)
> at
> org.apache.shindig.social.opensocial.jpa.spi.SpiDatabaseBootstrap.init(SpiDatabaseBootstrap.java:85)
> at
> org.apache.shindig.social.opensocial.jpa.spi.PersonServiceDbTest.setup(PersonServiceDbTest.java:71)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
> at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> at
> org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
> at
> org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
> at
> org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
> at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
> at
> org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.