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

Albert Lee updated OPENJPA-2351:
--------------------------------

    Attachment: OPENJPA-2351.20x.patch
    
> Subclasses writeExternal method trys to access a super class' private field.
> ----------------------------------------------------------------------------
>
>                 Key: OPENJPA-2351
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2351
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: Enhance
>    Affects Versions: 2.0.3, 2.1.2, 2.2.2, 2.2.1.1
>            Reporter: Heath Thomann
>            Assignee: Heath Thomann
>         Attachments: ExternalizableIssue.zip, OPENJPA-2351.20x.patch
>
>
> HI!  I have a test (see attachment ExternalizableIssues.zip) which 
> demonstrates the following issue:
> java.lang.IllegalAccessError: tried to access field hat.test.SuperEntity.id 
> from class hat.test.SimpleEntity
>       at hat.test.SimpleEntity.writeExternal(SimpleEntity.java)
>       at 
> java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1429)
>       at 
> java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1398)
>       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
>       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
>       at hat.test.TestMain.roundtrip(TestMain.java:28)
>       at hat.test.TestMain.main(TestMain.java:16)
> As I'll explain, the generated classes seem to be incorrect when a 
> DetachState is used:
>     <properties>
>       <property name="openjpa.DetachState" 
> value="fetch-groups(DetachedStateField=true)"/>
>     </properties>
> In this case, OpenJPA enhancer would generate the classes as Externalizable, 
> rather than Serializable, and it is the implementation of a writeExternal 
> method which causes a problem. NOTE: when running the test and playing around 
> with DetachState setting, make sure to use a runtime enhancer/javaagent and 
> not to pre-enhance as the entities need to be re-enhanced as the value of 
> DetachState changes or is removed.
> If one decompiles the enhnaced version (see 
> 'SimpleEntity_Enhnaced_Externalizable.java.txt' in the provided zip) of 
> SimpleEntity with 'openjpa.DetachState' set, we get a writeExternal method 
> like the following where the private field in the parent class is accessed 
> (i.e. 'this.superText'):
>   public void writeExternal(ObjectOutput paramObjectOutput)
>     throws IOException
>   {
>     pcWriteUnmanaged(paramObjectOutput);
>     if (this.pcStateManager != null)
>     {
>       if (!this.pcStateManager.writeDetached(paramObjectOutput));
>     }
>     else
>     {
>       paramObjectOutput.writeObject(pcGetDetachedState());
>       paramObjectOutput.writeObject(null);
>     }
>     paramObjectOutput.writeInt(this.id);
>     paramObjectOutput.writeObject(this.superText);
>     paramObjectOutput.writeObject(this.text);
>   }
> For comparison purposes only, if we look at the enhanced version (see 
> 'SimpleEntity_Enhnaced_Serializable.java.txt' in the provided zip) of 
> SimpleEntity with 'openjpa.DetachState' NOT set, we see the following 
> writeObject method:
>   private void writeObject(ObjectOutputStream paramObjectOutputStream)
>     throws IOException
>   {
>     boolean bool = pcSerializing();
>     paramObjectOutputStream.defaultWriteObject();
>     if (bool)
>       pcSetDetachedState(null);
>   }
> Seems like generated code should detect the private field and call the get 
> method?
> The provided test (ExternalizableIssues.zip), is a simple Java Eclipse 
> project.  You can import this zip and run the test class.  Simply point to an 
> OpenJPA jar (I'm using an OpenJPA 2.0.x jar) and use an enhancer at runtime.
> Thanks,
> Heath

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to