RuntimeUnenhancedClasses support can go into a "half baked" state
-----------------------------------------------------------------

                 Key: OPENJPA-377
                 URL: https://issues.apache.org/jira/browse/OPENJPA-377
             Project: OpenJPA
          Issue Type: Bug
          Components: kernel
    Affects Versions: 1.0.0
            Reporter: Kevin Sutter
             Fix For: 1.0.1, 1.1.0


As we continue to push OpenJPA through it's paces in an application server 
environment, I've hit a problem with the new dynamic unenhanced classes support 
that I haven't been able to figure out yet.  Maybe by writing this JIRA issue, 
it will ring a bell with Patrick or one of the other developers.

Here's an example of the callstack that we get.  In this case, the container 
classloader transformer doesn't process the Entity for some reason.  (I realize 
that this the root cause of the problems, but I don't think we fail like we 
do.)  Since the Entity has not been enhanced, we fall into the dynamic 
unenhanced classes support.  We determine that we're persistence capable, but 
something wasn't quite "baked" yet since we hit this exception:

        <openjpa-1.1.0-SNAPSHOT-r420667:573398M nonfatal general error> 
org.apache.openjpa.persistence.PersistenceException: !(x instanceof Integer)
[9/14/07 11:31:52:040 EST] 00000031 SystemOut     O 
<openjpa-1.1.0-SNAPSHOT-r420667:573398M nonfatal general error> 
org.apache.openjpa.persistence.PersistenceException: !(x instanceof Integer)
        at java.lang.Throwable.<init>(Throwable.java:196)
        at java.lang.RuntimeException.<init>(RuntimeException.java:43)
        at 
org.apache.openjpa.util.OpenJPAException.<init>(OpenJPAException.java:77)
        at 
org.apache.openjpa.util.OpenJPAException.<init>(OpenJPAException.java:70)
        at 
org.apache.openjpa.util.GeneralException.<init>(GeneralException.java:43)
        at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2410)
        at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2224)
        at 
org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1005)
        at 
org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:541)
           :
           :
Caused by: java.lang.ClassCastException: !(x instanceof Integer)
        at java.lang.Throwable.<init>(Throwable.java:196)
        at java.lang.RuntimeException.<init>(RuntimeException.java:43)
        at java.lang.ClassCastException.<init>(ClassCastException.java:39)
        at 
org.apache.openjpa.util.ApplicationIds.fromPKValues(ApplicationIds.java:151)
        at 
org.apache.openjpa.enhance.ReflectingPersistenceCapable.pcNewObjectIdInstance(Ref
lectingPersistenceCapable.java:257)
        at 
org.apache.openjpa.util.ApplicationIds.create(ApplicationIds.java:384)
        at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2378)
        ... 20 more

(I also run across this same type of problem in a Java SE environment when 
running within Eclipse.  But, at the time, I got around the problem by just 
running the PCEnhancer tool beforehand.  And, since this was not the main 
problem I was driving, I forgot about it.  I'm just stating this to indicate 
that this not just a Container classloader issue.)

In both cases, it does seem like it's related to creating or using 
ApplicationIds.  But, I haven't dug down deeper yet.

On a related note, I have two other questions related to this scenario:

o  When we are running in a Container environment, should the 
RuntimeUnenhancedClasses support be turned off?  Since the Container is 
supposed to be intercepting these Entities and passing them through the 
Transformer interface, should the RuntimeUnenhancedClasses support be turned 
off so that we can more easily detect when this is not working as expected?

o  I think the "unsupported" option for the openjpa.RuntimeUnenhancedClasses 
property is hiding a more meaningful message.  For example, if I run with 
"warn" option, I get the warning message (runtime-optimization-disabled) and a 
null is returned.  In this scenario, the processing continues and then I get 
this message:

<openjpa-1.1.0-SNAPSHOT-r420667:573398M nonfatal user error> 
org.apache.openjpa.persistence.ArgumentException: Attempt to cast instance 
"..." to 
PersistenceCapable failed.  Ensure that it has been enhanced.

But, if I run with the "unsupported" option, then the only message I get is the 
(runtime-optimization-disabled) exception.  Although it still indicates an 
error exists, it's not as clear as the "PersistenceCapable" message.  Not sure 
if we should re-think the "warn" vs "unsupported" argument, or maybe just an 
update to the message text for (runtime-optimization-disabled).

Anyway, the main problem is the ClassCastException.
Thanks,
Kevin


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to