<Beans Dev> [9] Review Request: 8060027 Tests java/beans/XMLEncoder/Test4903007.java and java/beans/XMLEncoder/java_awt_GridBagLayout.java

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Tue Aug 25 12:37:08 UTC 2015


Hello.
Please review the fix for jdk9.

Short description:
XMLEncoder incorrectly reference a non-static fields, when these fields 
were assigned to some other fields.
The bug was uncovered by some existing tests after the fix for [1].

Long description:

The next code is serialized incorrectly:
     public static final class Test {
         public Integer integer_10_default = new Integer(10);
         public Integer integer_10_set1; // will be set to the same as 
default
     }

Result:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.9.0-internal" class="java.beans.XMLDecoder">
  <object class="FieldsEncode$Test" id="FieldsEncode$Test0">
   <void class="FieldsEncode$Test" method="getField">
    <string>integer_10_set1</string>
    <void method="set">
     <object idref="FieldsEncode$Test0"/>
     <object class="FieldsEncode$Test" field="integer_10_default"/>
    </void>
   </void>
  </object>
</java>

Note that the encoder reference to the integer_10_default as a static 
field. So when the decoder will try to load it, it will fail:

java.lang.NoSuchFieldException: Field 'integer_10_default' is not static
     at 
com.sun.beans.finder.FieldFinder.findStaticField(FieldFinder.java:99)
     at 
com.sun.beans.decoder.FieldElementHandler.findField(FieldElementHandler.java:186)
     at 
com.sun.beans.decoder.FieldElementHandler.getFieldValue(FieldElementHandler.java:158)
     at 
com.sun.beans.decoder.ObjectElementHandler.getValueObject(ObjectElementHandler.java:141)
     at 
com.sun.beans.decoder.NewElementHandler.getValueObject(NewElementHandler.java:123)
     at 
com.sun.beans.decoder.ObjectElementHandler.startElement(ObjectElementHandler.java:113)
     at 
com.sun.beans.decoder.DocumentHandler.startElement(DocumentHandler.java:300)

After the fix we will use "<object class=" only for static field, and 
resulted xml will be:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.9.0-internal" class="java.beans.XMLDecoder">
  <object class="FieldsEncode$Test" id="FieldsEncode$Test0">
   <void class="FieldsEncode$Test" method="getField">
    <string>integer_10_set1</string>
    <void method="set">
     <object idref="FieldsEncode$Test0"/>
     <void class="FieldsEncode$Test" id="Field0" method="getField">
      <string>integer_10_default</string>
      <void id="Integer0" method="get">
       <object idref="FieldsEncode$Test0"/>
      </void>
     </void>
     <object idref="Integer0"/>
    </void>
   </void>
  </object>
</java>

Note that in this case we will access the integer_10_default using getField.

The new test which covers this issue in general is provided.

Bug: https://bugs.openjdk.java.net/browse/JDK-8060027
Webrev can be found at: http://cr.openjdk.java.net/~serb/8060027/webrev.00

[1]https://bugs.openjdk.java.net/browse/JDK-5043030

-- 
Best regards, Sergey.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/beans-dev/attachments/20150825/116c3305/attachment.html>


More information about the beans-dev mailing list