JAL-1551 spotlessApply
[jalview.git] / src / jalview / analysis / AnnotationSorter.java
index b0cfe20..1f2e78f 100644 (file)
@@ -1,5 +1,27 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.analysis;
 
+import java.util.Locale;
+
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
@@ -30,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;
 
@@ -88,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>
    */
@@ -133,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
@@ -149,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>
    */
@@ -258,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)
     {
@@ -333,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;
@@ -345,7 +403,8 @@ public class AnnotationSorter
     {
       return 1;
     }
-    return label1.toUpperCase().compareTo(label2.toUpperCase());
+    return label1.toUpperCase(Locale.ROOT)
+            .compareTo(label2.toUpperCase(Locale.ROOT));
   }
 
   /**