I am not be following you very well, but do think fillInStackTrace()
method may help I mean to call it on the embedded exception while you
are initiating the new thrown exception with it ???
On Thu, May 22, 2008 at 3:33 AM, David Blevins <[EMAIL PROTECTED]> wrote:
>
> On May 21, 2008, at 5:04 PM, Dain Sundstrom wrote:
>
>> I think Rick may be able to provide more insight than me given his work on
>> vm class loading, but I'll take a shot at this one....
>>
>> I think the difference between the two exceptions is based on when the VM
>> discovers it has an invalid class. The second exception shows us that the
>> bad class is openejb.org.superbiz.cmp2.MovieBean, which is a class we
>> generated directly using ASM. In "Style 1", I think something about the
>> code in EjbHomeProxyHandler was causing the VM to perform a full verify on
>> the class (FWIU the vm only verifies what is needs to improve VM startup
>> time). Was EjbHomeProxyHandler doing something like scanning all the Method
>> objects? Anyway, in "Style 1", for some reason the vm didn't have (or
>> didn't provide) additional information about which class was having the
>> error, which based on my coding experience is a pretty common situation. In
>> "Style 2", the vm clearly knows what's going on and tells us everything
>> necessary to fix the problem.
>>
>> In the long term, we could catch this problem with the verifier or if they
>> turn that off, we could just fill in a do nothing implementation.
>
> Huh. Not sure. We're talking about zero code change anywhere in anything
> (even the test case) other than the following patch.
>
> Index: src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> ===================================================================
> --- src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> (revision 655683)
> +++ src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> (working copy)
> @@ -210,7 +210,7 @@
> if (cause instanceof RemoteException && interfaceType.isLocal())
> {
> RemoteException re = (RemoteException) cause;
> Throwable detail = (re.detail != null) ? re.detail : re;
> - cause = new EJBException(re.getMessage(), (Exception)
> detail);
> + cause = new
> EJBException(re.getMessage()).initCause(detail);
> }
> throw cause;
> /*
>
> I'm not sure how class verification, etc. could be affected. Taking a fresh
> look at this, the ClassCastException part of Style 1 looks awfully fishy...
>
> Yea, that's it. Can't believe I missed it.
>
> -David
>
>
>
>>
>>
>> -dain
>>
>> On May 21, 2008, at 4:52 PM, David Blevins wrote:
>>
>>> There seems to be some major difference between these two styles of
>>> EJBException creation. I ran into this working on a CMP example I intend to
>>> use for the whole CMP+JPA->JPA merging logic. The real error is that I
>>> forgot to implement "setEntityContext" which is an easy mistake to make as
>>> the CMP2 bean class is abstract and compiles just fine without it. I got
>>> the first stack trace below, which is useless, and decided on a whim to
>>> tweak EjbHomeProxyHandler line 213 to the second style shown below. I was
>>> and am shocked at the difference in the stack trace.
>>>
>>> [Style 1] throw new EJBException(re.getMessage(), (Exception) detail);
>>> Yields:
>>> java.lang.ClassCastException: java.lang.AbstractMethodError
>>> at
>>> org.apache.openejb.core.ivm.EjbHomeProxyHandler._invoke(EjbHomeProxyHandler.java:213)
>>> at
>>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:274)
>>> at org.superbiz.cmp2.$Proxy26.create(Unknown Source)
>>> at org.superbiz.cmp2.MoviesTest.test(MoviesTest.java:51)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> at
>>> com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:32)
>>>
>>>
>>> [Style 2] throw new EJBException(re.getMessage()).initCause(detail);
>>> Yields:
>>>
>>> javax.ejb.EJBException: The bean encountered a non-application
>>> exception.; nested exception is:
>>> java.lang.AbstractMethodError:
>>> openejb.org.superbiz.cmp2.MovieBean.setEntityContext(Ljavax/ejb/EntityContext;)V
>>> at
>>> org.apache.openejb.core.ivm.EjbHomeProxyHandler._invoke(EjbHomeProxyHandler.java:213)
>>> at
>>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:274)
>>> at org.superbiz.cmp2.$Proxy26.create(Unknown Source)
>>> at org.superbiz.cmp2.MoviesTest.test(MoviesTest.java:51)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> at
>>> com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:32)
>>> Caused by: java.lang.AbstractMethodError:
>>> openejb.org.superbiz.cmp2.MovieBean.setEntityContext(Ljavax/ejb/EntityContext;)V
>>> at
>>> org.apache.openejb.core.cmp.CmpContainer.setEntityContext(CmpContainer.java:318)
>>> at
>>> org.apache.openejb.core.cmp.CmpContainer.createEJBObject(CmpContainer.java:592)
>>> at
>>> org.apache.openejb.core.cmp.CmpContainer.invoke(CmpContainer.java:250)
>>> at
>>> org.apache.openejb.core.ivm.EjbHomeProxyHandler.create(EjbHomeProxyHandler.java:267)
>>> at
>>> org.apache.openejb.core.ivm.EjbHomeProxyHandler._invoke(EjbHomeProxyHandler.java:158)
>>> ... 21 more
>>>
>>>
>>> Able to verify the stack trace behavior is this way in both intellij and
>>> maven. Obviously the stack trace for style #1 completely obfuscates the
>>> problem which is itself a big problem.
>>>
>>> Anyone have any idea, what causes this difference?
>>>
>>> Needless to say, I'll shortly be switching all our code over....
>>>
>>> -David
>>>
>>
>>
>
>
--
Thanks
- Mohammad Nour