openjpa-dev mailing list archives

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

     [ https://issues.apache.org/jira/browse/OPENJPA-383?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

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 PCEnhancer.java 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. PCEnhancer.java 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: https://issues.apache.org/jira/browse/OPENJPA-383
>             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.


Mime
View raw message