JDK-8038999 : In Java 8 java.awt.datatransfer.DataFlavor.equals is no longer symmetric
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 8
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux
  • CPU: x86_64
  • Submitted: 2014-03-24
  • Updated: 2014-07-29
  • Resolved: 2014-04-03
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8 JDK 9
8u20Fixed 9 b12Fixed
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Linux devel 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Microsoft Windows [Versjon 6.1.7601]

A DESCRIPTION OF THE PROBLEM :
In Java 8 java.awt.datatransfer.DataFlavor.equals fails to honor the equals contract by no longer beeing symmetric as the JavaDoc descibes it: 
"It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true."

This occurs when testing two DataFlavors of the MIME-type "text/html" for equality and only one of them has the "document" parameter set. 

REGRESSION.  Last worked in version 7u51

ADDITIONAL REGRESSION INFORMATION: 
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac DataFlavorTest.java
java DataFlavorTest

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Equals is symmetric for minimalHtmlFlavor and allHtmlFlavor
Equals is symmetric for minimalHtmlFlavor and fragmentHtmlFlavor
Equals is symmetric for minimalHtmlFlavor and selectionHtmlFlavor

ACTUAL -
Equals not symmetric for minimalHtmlFlavor and allHtmlFlavor
Equals not symmetric for minimalHtmlFlavor and fragmentHtmlFlavor
Equals not symmetric for minimalHtmlFlavor and selectionHtmlFlavor


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.datatransfer.DataFlavor;

public class DataFlavorTest {

    public static void main(String[] args) throws ClassNotFoundException {
        equalsShouldBySymetric();
    }

    public static void equalsShouldBySymetric() throws ClassNotFoundException {
        DataFlavor minimalHtmlFlavor = new DataFlavor("text/html; class=java.lang.String");

        // Static DataFlavors introduced in Java 8
        DataFlavor allHtmlFlavor = new DataFlavor("text/html; class=java.lang.String;document=all;charset=Unicode");
        DataFlavor fragmentHtmlFlavor = new DataFlavor("text/html; class=java.lang.String;document=fragment;charset=Unicode");
        DataFlavor selectionHtmlFlavor = new DataFlavor("text/html; class=java.lang.String;document=selection;charset=Unicode");

        if ((minimalHtmlFlavor.equals(allHtmlFlavor) == allHtmlFlavor.equals(minimalHtmlFlavor))) {
            System.out.println("Equals is symmetric for minimalHtmlFlavor and allHtmlFlavor");
        } else {
            System.out.println("Equals not symmetric for minimalHtmlFlavor and allHtmlFlavor");
        }

        if ((minimalHtmlFlavor.equals(fragmentHtmlFlavor) == fragmentHtmlFlavor.equals(minimalHtmlFlavor))) {
            System.out.println("Equals is symmetric for minimalHtmlFlavor and fragmentHtmlFlavor");
        } else {
            System.out.println("Equals not symmetric for minimalHtmlFlavor and fragmentHtmlFlavor");
        }

        if ((minimalHtmlFlavor.equals(selectionHtmlFlavor) == selectionHtmlFlavor.equals(minimalHtmlFlavor))) {
            System.out.println("Equals is symmetric for minimalHtmlFlavor and selectionHtmlFlavor");
        } else {
            System.out.println("Equals not symmetric for minimalHtmlFlavor and selectionHtmlFlavor");
        }
    }

}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
We could invert the equals check in our part of the code and thereby avoiding the comparison of the document parameter