Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / ws / rest / params / SeqGroupIndexVector.java
index e47a58b..9210414 100644 (file)
@@ -1,25 +1,29 @@
-/*******************************************************************************
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
- *
+/*
+ * 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.
- *
+ * 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/>.
- *******************************************************************************/
+ * 
+ * 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.ws.rest.params;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
 import jalview.ws.params.OptionI;
 import jalview.ws.params.simple.IntegerParameter;
 import jalview.ws.params.simple.Option;
@@ -27,14 +31,11 @@ import jalview.ws.rest.AlignmentProcessor;
 import jalview.ws.rest.InputType;
 import jalview.ws.rest.NoValidInputDataException;
 import jalview.ws.rest.RestJob;
-import jalview.ws.rest.RestServiceDescription;
-import jalview.ws.rest.InputType.molType;
 
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Vector;
 
 import org.apache.http.entity.mime.content.ContentBody;
 import org.apache.http.entity.mime.content.StringBody;
@@ -47,13 +48,12 @@ import org.apache.http.entity.mime.content.StringBody;
  * @author JimP
  * 
  */
-public class SeqGroupIndexVector extends InputType implements
-        AlignmentProcessor
+public class SeqGroupIndexVector extends InputType
+        implements AlignmentProcessor
 {
   public SeqGroupIndexVector()
   {
-    super(new Class[]
-    { AlignmentI.class });
+    super(new Class[] { AlignmentI.class });
   }
 
   /**
@@ -75,6 +75,7 @@ public class SeqGroupIndexVector extends InputType implements
    *          - alignment to be processed
    * @return al or a new alignment with appropriate attributes/order for input
    */
+  @Override
   public AlignmentI prepareAlignment(AlignmentI al)
   {
     jalview.analysis.AlignmentSorter.sortByGroup(al);
@@ -90,17 +91,19 @@ public class SeqGroupIndexVector extends InputType implements
     AlignmentI al = rj.getAlignmentForInput(token, type);
     // assume that alignment is properly ordered so groups form consecutive
     // blocks
-    ArrayList<int[]> gl = new ArrayList<int[]>();
-    int p = 0;
-    List<SequenceGroup> sgs;
-    synchronized (sgs = al.getGroups())
+    ArrayList<int[]> gl = new ArrayList<>();
+    int p = 0, lowest = al.getHeight(), highest = 0;
+    List<SequenceGroup> sgs = al.getGroups();
+    synchronized (sgs)
     {
       for (SequenceGroup sg : sgs)
       {
         if (sg.getSize() < minsize)
         {
-          throw new NoValidInputDataException("Group contains less than "
-                  + minsize + " sequences.");
+          throw new NoValidInputDataException(MessageManager.formatMessage(
+                  "exception.notvaliddata_group_contains_less_than_min_seqs",
+                  new String[]
+                  { Integer.valueOf(minsize).toString() }));
         }
         // TODO: refactor to sequenceGroup for efficiency -
         // getAlignmentRowInterval(AlignmentI al)
@@ -108,17 +111,28 @@ public class SeqGroupIndexVector extends InputType implements
         for (SequenceI sq : sg.getSequencesInOrder(al))
         {
           p = al.findIndex(sq);
+          if (lowest > p)
+          {
+            lowest = p;
+          }
+          if (highest < p)
+          {
+            highest = p;
+          }
           if (se == null)
           {
-            se = new int[]
-            { p, p };
+            se = new int[] { p, p };
           }
           else
           {
             if (p < se[0])
+            {
               se[0] = p;
+            }
             if (p > se[1])
+            {
               se[1] = p;
+            }
           }
         }
         if (se != null)
@@ -131,46 +145,18 @@ public class SeqGroupIndexVector extends InputType implements
     // remaining group ? - these might be at the start or the end
     if (gl.size() > 0)
     {
-      int[] tail = gl.get(0);
-      if (tail[0] > 0)
+      if (lowest - 1 > minsize)
       {
-        if (1 + tail[0] > minsize)
-        {
-          gl.add(0, new int[]
-          { 0, tail[0] - 1 });
-        }
-        else
-        {
-          // lets be intelligent here - if the remaining sequences aren't enough
-          // to make a final group, then don't make one.
-          // throw new
-          // NoValidInputDataException("Group from remaining ungrouped sequences in input contains less than "+minsize+" sequences.");
-        }
+        gl.add(0, new int[] { 0, lowest - 2 });
       }
-      else
+      if ((al.getHeight() - 1 - highest) > minsize)
       {
-        tail = gl.get(gl.size() - 1);
-        if (1 + tail[1] < al.getHeight())
-        {
-          if (al.getHeight() - (1 + tail[1]) > minsize)
-          {
-            gl.add(new int[]
-            { tail[1] + 1, al.getHeight() - 1 });
-          }
-          else
-          {
-            // lets be intelligent here - if the remaining sequences aren't
-            // enough to make a final group, then don't make one.
-            // throw new
-            // NoValidInputDataException("Group from remaining ungrouped sequences in input contains less than "+minsize+" sequences.");
-          }
-        }
+        gl.add(new int[] { highest + 1, al.getHeight() - 1 });
       }
     }
     else
     {
-      gl.add(new int[]
-      { 0, al.getHeight() - 1 });
+      gl.add(new int[] { 0, al.getHeight() - 1 });
     }
     if (min >= 0 && gl.size() < min)
     {
@@ -187,7 +173,9 @@ public class SeqGroupIndexVector extends InputType implements
     int[][] vals = gl.toArray(new int[gl.size()][]);
     int[] srt = new int[gl.size()];
     for (int i = 0; i < vals.length; i++)
+    {
       srt[i] = vals[i][0];
+    }
     jalview.util.QuickSort.sort(srt, vals);
     list = false;
     int last = vals[0][0] - 1;
@@ -229,7 +217,7 @@ public class SeqGroupIndexVector extends InputType implements
   @Override
   public List<String> getURLEncodedParameter()
   {
-    ArrayList<String> prms = new ArrayList<String>();
+    ArrayList<String> prms = new ArrayList<>();
     super.addBaseParams(prms);
     prms.add("minsize='" + minsize + "'");
     prms.add("sep='" + sep + "'");
@@ -262,7 +250,9 @@ public class SeqGroupIndexVector extends InputType implements
       {
         minsize = Integer.valueOf(val);
         if (minsize >= 0)
+        {
           return true;
+        }
       } catch (Exception x)
       {
 
@@ -278,8 +268,8 @@ public class SeqGroupIndexVector extends InputType implements
         return true;
       } catch (Exception x)
       {
-        warnings.append("Invalid molecule type '" + val
-                + "'. Must be one of (");
+        warnings.append(
+                "Invalid molecule type '" + val + "'. Must be one of (");
         for (molType v : molType.values())
         {
           warnings.append(" " + v);