JAL-1551 spotlessApply
[jalview.git] / src / jalview / analysis / AnnotationSorter.java
index 9e35330..1f2e78f 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b1)
- * Copyright (C) 2015 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -20,6 +20,8 @@
  */
 package jalview.analysis;
 
+import java.util.Locale;
+
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
@@ -50,8 +52,8 @@ public class AnnotationSorter
   public enum SequenceAnnotationOrder
   {
     // Text descriptions surface in the Preferences Sort by... options
-    SEQUENCE_AND_LABEL("Sequence"), LABEL_AND_SEQUENCE("Label"), NONE(
-            "No sort");
+    SEQUENCE_AND_LABEL("Sequence"), LABEL_AND_SEQUENCE("Label"),
+    NONE("No sort");
 
     private String description;
 
@@ -108,7 +110,8 @@ public class AnnotationSorter
    * <ul>
    * <li>annotations with a reference to a sequence in the alignment are sorted
    * on sequence ordering</li>
-   * <li>other annotations go 'at the end', with their mutual order unchanged</li>
+   * <li>other annotations go 'at the end', with their mutual order
+   * unchanged</li>
    * <li>within the same sequence ref, sort by label (non-case-sensitive)</li>
    * </ul>
    */
@@ -153,8 +156,16 @@ public class AnnotationSorter
       {
         return showAutocalcAbove ? 1 : -1;
       }
-      int sequenceOrder = compareSequences(o1, o2);
-      return sequenceOrder == 0 ? compareLabels(o1, o2) : sequenceOrder;
+      int computedOrder = compareSequences(o1, o2);
+      if (computedOrder == 0)
+      {
+        computedOrder = compareLabels(o1, o2);
+      }
+      if (computedOrder == 0)
+      {
+        computedOrder = compareDescriptions(o1, o2);
+      }
+      return computedOrder;
     }
 
     @Override
@@ -169,7 +180,8 @@ public class AnnotationSorter
    * <ul>
    * <li>annotations with a reference to a sequence in the alignment are sorted
    * on label (non-case-sensitive)</li>
-   * <li>other annotations go 'at the end', with their mutual order unchanged</li>
+   * <li>other annotations go 'at the end', with their mutual order
+   * unchanged</li>
    * <li>within the same label, sort by order of the related sequences</li>
    * </ul>
    */
@@ -278,7 +290,8 @@ public class AnnotationSorter
     // cache 'alignment sequence position' for the annotations
     saveSequenceIndices(alignmentAnnotations);
 
-    Comparator<? super AlignmentAnnotation> comparator = getComparator(order);
+    Comparator<? super AlignmentAnnotation> comparator = getComparator(
+            order);
 
     if (alignmentAnnotations != null)
     {
@@ -353,6 +366,31 @@ public class AnnotationSorter
     }
     String label1 = o1.label;
     String label2 = o2.label;
+    return compareString(label1, label2);
+  }
+
+  /**
+   * Non-case-sensitive comparison of annotation descriptions. Returns zero if
+   * either argument is null.
+   * 
+   * @param o1
+   * @param o2
+   * @return
+   */
+  private int compareDescriptions(AlignmentAnnotation o1,
+          AlignmentAnnotation o2)
+  {
+    if (o1 == null || o2 == null)
+    {
+      return 0;
+    }
+    String label1 = o1.description;
+    String label2 = o2.description;
+    return compareString(label1, label2);
+  }
+
+  private int compareString(String label1, String label2)
+  {
     if (label1 == null && label2 == null)
     {
       return 0;
@@ -365,7 +403,8 @@ public class AnnotationSorter
     {
       return 1;
     }
-    return label1.toUpperCase().compareTo(label2.toUpperCase());
+    return label1.toUpperCase(Locale.ROOT)
+            .compareTo(label2.toUpperCase(Locale.ROOT));
   }
 
   /**