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

Alexander Scherbatiy alexandr.scherbatiy at oracle.com
Thu Sep 3 13:25:47 UTC 2015


  The fix looks good to me.

  Thanks,
  Alexandr.

On 8/25/2015 3:37 PM, Sergey Bylokhov wrote:
> 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.



More information about the beans-dev mailing list