update author list in license for (JAL-826)
[jalview.git] / src / jalview / ws / rest / params / SeqGroupIndexVector.java
index 7df7d1c..1af0440 100644 (file)
@@ -1,8 +1,28 @@
+/*******************************************************************************
+ * 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
+ *
+ * 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/>.
+ *******************************************************************************/
 package jalview.ws.rest.params;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.ws.params.OptionI;
+import jalview.ws.params.simple.IntegerParameter;
+import jalview.ws.params.simple.Option;
 import jalview.ws.rest.AlignmentProcessor;
 import jalview.ws.rest.InputType;
 import jalview.ws.rest.NoValidInputDataException;
@@ -12,6 +32,7 @@ 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;
 
@@ -70,12 +91,13 @@ public class SeqGroupIndexVector extends InputType implements
     // assume that alignment is properly ordered so groups form consecutive
     // blocks
     ArrayList<int[]> gl = new ArrayList<int[]>();
-    int p=0;
+    int p = 0;
     for (SequenceGroup sg : (Vector<SequenceGroup>) al.getGroups())
     {
-      if (sg.getSize()<minsize)
+      if (sg.getSize() < minsize)
       {
-        throw new NoValidInputDataException("Group contains less than "+minsize+" sequences.");
+        throw new NoValidInputDataException("Group contains less than "
+                + minsize + " sequences.");
       }
       // TODO: refactor to sequenceGroup for efficiency -
       // getAlignmentRowInterval(AlignmentI al)
@@ -101,40 +123,62 @@ public class SeqGroupIndexVector extends InputType implements
         gl.add(se);
       }
     }
-    // are there any more sequences ungrouped that should be added as a single remaining group ? - these might be at the start or the end
-    if (gl.size()>0)
+    // are there any more sequences ungrouped that should be added as a single
+    // 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 (1+tail[0]>minsize)
+      int[] tail = gl.get(0);
+      if (tail[0] > 0)
       {
-        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.");       
+        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.");
+        }
       }
-      } else {
-        tail=gl.get(gl.size()-1);
-        if (1+tail[1]<al.getHeight())
+      else
+      {
+        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.");       
+          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.");
           }
         }
       }
-    } else {
-      gl.add(new int[] { 0, al.getHeight()-1});
     }
-    if (min>=0 && gl.size()<min)
+    else
     {
-      throw new NoValidInputDataException("Not enough sequence groups for input. Need at least "+min+" groups (including ungrouped regions).");
+      gl.add(new int[]
+      { 0, al.getHeight() - 1 });
     }
-    if (max>0 && gl.size()>max)
+    if (min >= 0 && gl.size() < min)
     {
-      throw new NoValidInputDataException("Too many sequence groups for input. Need at most "+max+" groups (including ungrouped regions).");
+      throw new NoValidInputDataException(
+              "Not enough sequence groups for input. Need at least " + min
+                      + " groups (including ungrouped regions).");
+    }
+    if (max > 0 && gl.size() > max)
+    {
+      throw new NoValidInputDataException(
+              "Too many sequence groups for input. Need at most " + max
+                      + " groups (including ungrouped regions).");
     }
     int[][] vals = gl.toArray(new int[gl.size()][]);
     int[] srt = new int[gl.size()];
@@ -160,28 +204,34 @@ public class SeqGroupIndexVector extends InputType implements
   }
 
   /**
-   * set minimum number of sequences allowed in a partition. Default is 1 sequence.
-   * @param i (number greater than 1)
+   * set minimum number of sequences allowed in a partition. Default is 1
+   * sequence.
+   * 
+   * @param i
+   *          (number greater than 1)
    */
   public void setMinsize(int i)
   {
-    if (minsize>=1)
-      {
-      minsize=i;
-      } else {
-        minsize=1;
-      }
+    if (minsize >= 1)
+    {
+      minsize = i;
+    }
+    else
+    {
+      minsize = 1;
+    }
   }
+
   @Override
   public List<String> getURLEncodedParameter()
   {
     ArrayList<String> prms = new ArrayList<String>();
     super.addBaseParams(prms);
-    prms.add("minsize='"+ minsize+"'");
-    prms.add("sep='"+ sep+"'");
-    if (type!=null)
+    prms.add("minsize='" + minsize + "'");
+    prms.add("sep='" + sep + "'");
+    if (type != null)
     {
-      prms.add("type='"+type+"'");
+      prms.add("type='" + type + "'");
     }
     return prms;
   }
@@ -199,32 +249,36 @@ public class SeqGroupIndexVector extends InputType implements
 
     if (tok.startsWith("sep"))
     {
-      sep=val;
+      sep = val;
       return true;
     }
     if (tok.startsWith("minsize"))
     {
-      try {
-        minsize=Integer.valueOf(val);
-        if (minsize>=0)
-        return true;
+      try
+      {
+        minsize = Integer.valueOf(val);
+        if (minsize >= 0)
+          return true;
       } catch (Exception x)
       {
-        
+
       }
-      warnings.append("Invalid minsize value '"+val+"'. Must be a positive integer.\n");
+      warnings.append("Invalid minsize value '" + val
+              + "'. Must be a positive integer.\n");
     }
     if (tok.startsWith("type"))
     {
-      try {
-        type=molType.valueOf(val);
+      try
+      {
+        type = molType.valueOf(val);
         return true;
       } catch (Exception x)
       {
-        warnings.append("Invalid molecule type '"+val+"'. Must be one of (");
-        for (molType v:molType.values())
+        warnings.append("Invalid molecule type '" + val
+                + "'. Must be one of (");
+        for (molType v : molType.values())
         {
-          warnings.append(" "+v);
+          warnings.append(" " + v);
         }
         warnings.append(")\n");
       }
@@ -232,4 +286,17 @@ public class SeqGroupIndexVector extends InputType implements
     return false;
   }
 
+  @Override
+  public List<OptionI> getOptions()
+  {
+    List<OptionI> lst = getBaseOptions();
+    lst.add(new Option("sep",
+            "Separator character between elements of vector", true, ",",
+            sep, Arrays.asList(new String[]
+            { " ", ",", ";", "\t", "|" }), null));
+    lst.add(new IntegerParameter("minsize", "Minimum size of partition allowed by service", true, 1, minsize, 1,0));
+    lst.add(createMolTypeOption("type", "Sequence type", false, type, molType.MIX));
+    return lst;
+  }
+
 }