<Swing Dev> JDK-8023043 : Clipboard.getAvailableDataFlavors: Comparison method violates contract

Alexander Scherbatiy alexandr.scherbatiy at oracle.com
Fri May 8 12:46:00 UTC 2015


On 5/8/2015 3:41 PM, Anton Nashatyrev wrote:
> Hi Alexander,
>
>     I've updated the existing issue filed by Jason with the new 
> information. So it seems no need to create a new one.
       I see. I have founds this one: 
https://bugs.openjdk.java.net/browse/JDK-8078376

      Thanks,
      Alexandr.
>
> Thanks!
> Anton.
>
> On 08.05.2015 15:38, Alexander Scherbatiy wrote:
>>
>>   Hi Jason,
>>
>>  Please, file it as a new issue in http://bugreport.java.com/bugreport
>>
>>   Thanks,
>>   Alexandr.
>>
>> On 5/7/2015 11:08 PM, Jason Mehrens wrote:
>>> Anton,
>>>
>>>
>>> I finally caught this error in production.  I patched our code to 
>>> launch a JVM (with mergesort) using your test case, modifed to 
>>> output the JVM version followed by the output when this error 
>>> occurs.  The output is as follows:
>>>
>>>
>>>
>>> ============================================================================== 
>>>
>>>
>>> 1.7.0_80-b15
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=java.lang.String] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=application/x-java-text-encoding;representationclass=[B] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.Reader] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.lang.String] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.CharBuffer] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[C] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=unicode] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-8] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-8] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16BE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16BE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16LE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16LE] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=ISO-8859-1] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=ISO-8859-1] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=windows-1252] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=windows-1252] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=windows-1252] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=US-ASCII] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
>>>
>>>
>>> java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=US-ASCII] 
>>>
>>>
>>> ================================================================================== 
>>>
>>>
>>>
>>>
>>> Jason
>>>
>>>
>>>
>>> ----------------------------------------
>>>> From: jason_mehrens at hotmail.com
>>>> To: anton.nashatyrev at oracle.com
>>>> Date: Wed, 22 Apr 2015 14:59:26 -0500
>>>> CC: swing-dev at openjdk.java.net
>>>> Subject: Re: <Swing Dev> JDK-8023043 : 
>>>> Clipboard.getAvailableDataFlavors: Comparison method violates contract
>>>>
>>>> Anton,
>>>>
>>>>
>>>> Thanks for looking at this. Sorry I don't have a test case to give 
>>>> you yet. For sure the machines are using JDK7u80 that are 
>>>> reproducing the error. The common case is that the user is copying 
>>>> text from an email client and then pasting it in to a JTextField. 
>>>> So I imagine that the content type of email is a factor in 
>>>> producing this issue.
>>>>
>>>>
>>>> What I'll do is convert your ClipboardDump into the codebase so 
>>>> that I can just log that information as soon as it happens. We'll 
>>>> see how long it takes to catch this fish.
>>>>
>>>>
>>>> Thanks,
>>>>
>>>>
>>>> Jason
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ----------------------------------------
>>>>> Date: Wed, 22 Apr 2015 17:06:10 +0300
>>>>> From: anton.nashatyrev at oracle.com
>>>>> To: jason_mehrens at hotmail.com
>>>>> CC: swing-dev at openjdk.java.net
>>>>> Subject: Re: <Swing Dev> JDK-8023043 : 
>>>>> Clipboard.getAvailableDataFlavors: Comparison method violates 
>>>>> contract
>>>>>
>>>>> Hi Jason,
>>>>>
>>>>> I've commented in the bug report:
>>>>>
>>>>> Couldn't reproduce locally.
>>>>> Please next time the problem is reproduced on your side, run the 
>>>>> small
>>>>> program below and attach its output to this bug (or file a new one).
>>>>> Make sure NOT using the system clipboard from the moment of exception
>>>>> till running the test program.
>>>>>
>>>>> import java.awt.*;
>>>>> import java.awt.datatransfer.DataFlavor;
>>>>>
>>>>> public class ClipboardDump {
>>>>> public static void main(String[] args) {
>>>>> System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
>>>>>
>>>>> DataFlavor[] dataFlavors =
>>>>> Toolkit.getDefaultToolkit().getSystemClipboard().
>>>>> getAvailableDataFlavors();
>>>>>
>>>>> for (DataFlavor df: dataFlavors) {
>>>>> System.out.println(df);
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> Please also make sure you are running 7u80 (not an earlier version)
>>>>> since the Comparator fix was integrated to 7u80
>>>>>
>>>>> Thanks!
>>>>> Anton.
>>>>> On 21.04.2015 17:29, Jason Mehrens wrote:
>>>>>> Hello Swing-Dev,
>>>>>>
>>>>>>
>>>>>>
>>>>>> Recently we have updated to JDK7u80 and have noticed a pattern of 
>>>>>> users generating the following error:
>>>>>>
>>>>>>
>>>>>>
>>>>>> ==================
>>>>>>
>>>>>> java.lang.IllegalArgumentException: Comparison method violates 
>>>>>> its general contract!
>>>>>>
>>>>>> at java.util.TimSort.mergeHi(Unknown Source)
>>>>>>
>>>>>> at java.util.TimSort.mergeAt(Unknown Source)
>>>>>>
>>>>>> at java.util.TimSort.mergeCollapse(Unknown Source)
>>>>>>
>>>>>> at java.util.TimSort.sort(Unknown Source)
>>>>>>
>>>>>> at java.util.TimSort.sort(Unknown Source)
>>>>>>
>>>>>> at java.util.Arrays.sort(Unknown Source)
>>>>>>
>>>>>> at 
>>>>>> sun.awt.datatransfer.DataTransferer.setToSortedDataFlavorArray(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at sun.awt.datatransfer.ClipboardTransferable.<init>(Unknown Source)
>>>>>>
>>>>>> at sun.awt.datatransfer.SunClipboard.getContents(Unknown Source)
>>>>>>
>>>>>> at 
>>>>>> javax.swing.TransferHandler$TransferAction.actionPerformedImpl(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at javax.swing.TransferHandler$TransferAction.access$700(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at javax.swing.TransferHandler$TransferAction$1.run(Unknown Source)
>>>>>>
>>>>>> at javax.swing.TransferHandler$TransferAction$1.run(Unknown Source)
>>>>>>
>>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at javax.swing.TransferHandler$TransferAction$2.run(Unknown Source)
>>>>>>
>>>>>> at javax.swing.TransferHandler$TransferAction$2.run(Unknown Source)
>>>>>>
>>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at 
>>>>>> javax.swing.TransferHandler$TransferAction.actionPerformed(Unknown Source) 
>>>>>>
>>>>>>
>>>>>> at javax.swing.text.JTextComponent.invokeAction(Unknown Source)
>>>>>>
>>>>>> at javax.swing.text.JTextComponent.paste(Unknown Source)
>>>>>>
>>>>>> at 
>>>>>> javax.swing.text.DefaultEditorKit$PasteAction.actionPerformed(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at javax.swing.SwingUtilities.notifyAction(Unknown Source)
>>>>>>
>>>>>> at javax.swing.JComponent.processKeyBinding(Unknown Source)
>>>>>>
>>>>>> at javax.swing.JComponent.processKeyBindings(Unknown Source)
>>>>>>
>>>>>> at javax.swing.JComponent.processKeyEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.Component.processEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.Container.processEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.Component.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.Container.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.Component.dispatchEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at 
>>>>>> java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at 
>>>>>> java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.Component.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.Container.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.Window.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.Component.dispatchEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventQueue.access$300(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventQueue$3.run(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventQueue$3.run(Unknown Source)
>>>>>>
>>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.EventQueue$4.run(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventQueue$4.run(Unknown Source)
>>>>>>
>>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>>>
>>>>>> at 
>>>>>> java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.EventQueue.dispatchEvent(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown 
>>>>>> Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
>>>>>>
>>>>>> at java.awt.EventDispatchThread.run(Unknown Source)
>>>>>>
>>>>>> =============
>>>>>>
>>>>>>
>>>>>>
>>>>>> When I check the issue tracker 
>>>>>> http://bugs.java.com/view_bug.do?bug_id=8023043 shows as fixed in 
>>>>>> 7u60. Did this get fixed in 7u60 through 7u80? The stacktrace is 
>>>>>> a little different from that bug so should I file this as a new 
>>>>>> issue?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>>
>>>>>>
>>>>>> Jason
>>>>>>
>>>>>
>>
>




More information about the swing-dev mailing list