<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