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: [email protected] > To: [email protected] > Date: Wed, 22 Apr 2015 14:59:26 -0500 > CC: [email protected] > 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: [email protected] >> To: [email protected] >> CC: [email protected] >> 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 >>> >>
