Re: Caynne with Geronimo NPE

From: Lasantha Ranaweera (lasanth..pensource.lk)
Date: Tue Feb 27 2007 - 11:54:04 EST

  • Next message: Andrus Adamchik: "Re: Build performance"

    Thanks Andrus for your explanation... I will investigate this more bit &
    create a patch pretty soon. We will try to get some help from Geronimo
    side too. May be you can participate the discussions too. ;)

    Thanks,
    Lasantha

    >
    > On Feb 27, 2007, at 4:37 PM, Lasantha Ranaweera wrote:
    >
    >
    >> BTW as a solution I changed the given lines in EntityMapLoader
    >> class, then
    >> it goes bit further and failed in Visitor classes again.
    >>
    >> ClassLoader loader = context.getTempClassLoader(); //caynne
    >> existing one
    >> ClassLoader loader = persistenceUnit.getClassLoader(); //my
    >> soultion since
    >
    > We can't use the unit main ClassLoader at the point of loading the
    > annotations, as annotations processing predates class enhancement,
    > and we can't pollute the main class loader with unenhanced classes.
    >
    >
    >> Caused by: java.lang.NullPointerException
    >> at
    >> org.apache.cayenne.jpa.conf.ClassAnnotationProcessorFactory
    >> $EntityProcessor.onStartElement
    >> (ClassAnnotationProcessorFactory.java:85)
    >> at
    >> org.apache.cayenne.jpa.conf.EntityMapAnnotationLoader.loadClassMapping
    >> (EntityMapAnnotationLoader.java:202)
    >> at
    >> org.apache.cayenne.jpa.conf.EntityMapLoader.loadFromAnnotations
    >> (EntityMapLoader.java:195)
    >> at
    >> org.apache.cayenne.jpa.conf.EntityMapLoader.loadEntityMap
    >> (EntityMapLoader.java:97)
    >> ... 28 more
    >
    >
    > I assume there is a line mismatch, and the NPE is really at line 84,
    > so "element.getAnnotation(Entity.class)" returns null:
    >
    > public void onStartElement(
    > AnnotatedElement element,
    > AnnotationProcessorStack context) {
    > Entity entityAnnotation = element.getAnnotation
    > (Entity.class);
    >
    > JpaEntity entity = new JpaEntity();
    > entity.setClassName(((Class) element).getName());
    > entity.setAttributes(new JpaAttributes());
    >
    > if (!Util.isEmptyString(entityAnnotation.name()))
    > { // LINE 84
    > entity.setName(entityAnnotation.name
    > ()); // LINE 85
    > }
    >
    > context.push(entity);
    > }
    >
    > OpenEJB TemporaryClassLoader has this code that I suspect may causes
    > this error?? (I can't confirm it - it works in my OpenEJB integration
    > test environment):
    >
    > // Annotation classes must be loaded by the normal classloader
    > if (isAnnotationClass(bytes)) {
    > return Class.forName(name, resolve, getClass
    > ().getClassLoader());
    > }
    >
    > While the bug may still be on Cayenne end, I wonder if Dain or
    > somebody else from Geronimo can comment on this?
    >
    > Andrus
    >



    This archive was generated by hypermail 2.0.0 : Tue Feb 27 2007 - 11:54:55 EST