openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Janko Heilgeist (JIRA)" <>
Subject [jira] Updated: (OPENJPA-383) Enhancement may cause corruption of classes using method overloading
Date Tue, 25 Sep 2007 08:59:50 GMT


Janko Heilgeist updated OPENJPA-383:

    Attachment: enh_overloading_fix.patch

The newer version 1.14.0 of serp does mention the problem in the javadoc of getDeclaredMethod
and offers a version of getDeclaredMethod, that takes as an additional parameter the return-type
of a function to make the returned result unique. This patch updates the pom.xml to use 1.14.0
of serp and modifies to use the new getDeclaredMethod with name, return-type
and parameter-types.

This should definitely NOT be included into the SVN before Abe has had a good look at the
patch. is nothing for the faint-hearted and I am not sure, whether my patch
has any side-effects or even solves the problem completely and correctly ;)

> Enhancement may cause corruption of classes using method overloading
> --------------------------------------------------------------------
>                 Key: OPENJPA-383
>                 URL:
>             Project: OpenJPA
>          Issue Type: Bug
>    Affects Versions: 1.0.0, 1.0.1, 1.1.0
>         Environment: Java 1.5.0_12, Java 1.6.0_02
>            Reporter: Janko Heilgeist
>         Attachments: enh_overloading_fix.patch, enh_overloading_unittest.patch
> As already reported on the developers mailing-list, the enhancement of classes that use
method overloading may corrupt these classes. An example:
> public interface GenericEntity<PK extends Serializable> {
>         PK getEntityId();
>         void setEntityId(PK entityId);
> }
> public interface LongObjIdEntity extends GenericEntity<Long> {
>         Long getEntityId();
>         void setEntityId(Long entityId);
> }
> @Entity
> public class SomeEntity implements LongObjIdEntity {
>         private Long entityId;
>         @Id
>         @GeneratedValue
>         public Long getEntityId() { return entityId; }
>         public void setEntityId(Long entityId) { this.entityId = entityId; }
> }
> After enhancement of the class SomeEntity, calls to SomeEntity.class.getDeclaredFields()
may fail with an VerifyError due to a "Wrong return type in function" getEntityId. This is
a serious error because getDeclaredFields() is called for example during the deserialization
of objects from an ObjectInputStream (which prohibits e.g. usage of such an enhanced entity
as argument to an EJB-function) and even in the PCEnhancer class itself, which will fail when
analyizing a previously enhanced class.
> The cause of this error is in my opinion related to bugs OPENJPA-251 and OPENJPA-329.
Reflection on the class returns two versions of the getEntityId()-function: "Serializable
getEntityId()" and "Long getEntityId()". The enhancer uses a version of the function getDeclaredMethod()
of the serp-library, that does not guarantee which of these methods is returned, if only the
name of the function and its parameter-types are specified. If the wrong method is picked,
the enhanced class is no longer usable.

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

View raw message