Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Webster2011-11-29 13:52:35 +0000
committerPaul Webster2011-11-29 13:56:03 +0000
commitb6f90205a98fd94518675fa7517dc47f397005f0 (patch)
tree7ba780cc1cd95bf5fde006df7cffe90c8584aea3
parent52ed8db064ace7c83cff1ad6f046f3fba1f2fc03 (diff)
downloadeclipse.platform.ui-b6f90205a98fd94518675fa7517dc47f397005f0.tar.gz
eclipse.platform.ui-b6f90205a98fd94518675fa7517dc47f397005f0.tar.xz
eclipse.platform.ui-b6f90205a98fd94518675fa7517dc47f397005f0.zip
Bug 364735 - ViewerComparator violates its general contractv20111129-1356
add some logging.
-rw-r--r--bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java75
1 files changed, 44 insertions, 31 deletions
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java
index 893cfd147bd..578a5624cce 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java
@@ -14,6 +14,8 @@ package org.eclipse.jface.viewers;
import java.util.Arrays;
import java.util.Comparator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
import org.eclipse.jface.util.Policy;
/**
@@ -121,34 +123,32 @@ public class ViewerComparator {
return cat1 - cat2;
}
- String name1;
- String name2;
-
- if (viewer == null || !(viewer instanceof ContentViewer)) {
- name1 = e1.toString();
- name2 = e2.toString();
- } else {
- IBaseLabelProvider prov = ((ContentViewer) viewer)
- .getLabelProvider();
- if (prov instanceof ILabelProvider) {
- ILabelProvider lprov = (ILabelProvider) prov;
- name1 = lprov.getText(e1);
- name2 = lprov.getText(e2);
- } else {
- name1 = e1.toString();
- name2 = e2.toString();
- }
- }
- if (name1 == null) {
- name1 = "";//$NON-NLS-1$
- }
- if (name2 == null) {
- name2 = "";//$NON-NLS-1$
- }
+ String name1 = getLabel(viewer, e1);
+ String name2 = getLabel(viewer, e2);
// use the comparator to compare the strings
return getComparator().compare(name1, name2);
}
+
+ private String getLabel(Viewer viewer, Object e1) {
+ String name1;
+ if (viewer == null || !(viewer instanceof ContentViewer)) {
+ name1 = e1.toString();
+ } else {
+ IBaseLabelProvider prov = ((ContentViewer) viewer)
+ .getLabelProvider();
+ if (prov instanceof ILabelProvider) {
+ ILabelProvider lprov = (ILabelProvider) prov;
+ name1 = lprov.getText(e1);
+ } else {
+ name1 = e1.toString();
+ }
+ }
+ if (name1 == null) {
+ name1 = "";//$NON-NLS-1$
+ }
+ return name1;
+ }
/**
* Returns whether this viewer sorter would be affected
@@ -181,11 +181,24 @@ public class ViewerComparator {
* @param viewer the viewer
* @param elements the elements to sort
*/
- public void sort(final Viewer viewer, Object[] elements) {
- Arrays.sort(elements, new Comparator() {
- public int compare(Object a, Object b) {
- return ViewerComparator.this.compare(viewer, a, b);
- }
- });
- }
+ public void sort(final Viewer viewer, Object[] elements) {
+ try {
+ Arrays.sort(elements, new Comparator() {
+ public int compare(Object a, Object b) {
+ return ViewerComparator.this.compare(viewer, a, b);
+ }
+ });
+ } catch (IllegalArgumentException e) {
+ String msg = "Workaround for comparator violation:\n\t- set system property java.util.Arrays.useLegacyMergeSort=true\n\t- use a 1.6 JRE " //$NON-NLS-1$
+ + "\nmessage: " + e.getLocalizedMessage() //$NON-NLS-1$
+ + "\nthis: " + getClass().getName() //$NON-NLS-1$
+ + "\ncomparator: " + comparator.getClass().getName() //$NON-NLS-1$
+ + "\narray:"; //$NON-NLS-1$
+ for (int i = 0; i < elements.length; i++) {
+ msg += "\n\t" + getLabel(viewer, elements[i]); //$NON-NLS-1$
+ }
+ Policy.getLog().log(new Status(IStatus.ERROR, "org.eclipse.jface", msg)); //$NON-NLS-1$
+ throw e;
+ }
+ }
}

Back to the top