apply version 2.7 copyright
[jalview.git] / src / jalview / ws / rest / InputType.java
index 28bfda0..26b5ea6 100644 (file)
@@ -1,5 +1,30 @@
+/*******************************************************************************
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, 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;
 
+import jalview.ws.params.ArgumentI;
+import jalview.ws.params.InvalidArgumentException;
+import jalview.ws.params.OptionI;
+import jalview.ws.params.ParameterI;
+import jalview.ws.params.simple.IntegerParameter;
+import jalview.ws.params.simple.Option;
+import jalview.ws.rest.params.SeqGroupIndexVector;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -8,7 +33,9 @@ import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -29,7 +56,17 @@ public abstract class InputType {
    * not used yet
    */
   boolean replaceids;
-  public enum molType { NUC, PROT, MIX}
+  public enum molType { NUC, PROT, MIX;
+
+  public static Collection<String> toStringValues()
+  {
+    Collection<String> c = new ArrayList<String>();
+    for (molType type:values())
+    {
+      c.add(type.toString());
+    }
+    return c;
+  }}
   public String token;
   public int min=1;
   public int max=0; // unbounded
@@ -117,7 +154,7 @@ public abstract class InputType {
    * @return true if property was set
    */
   public abstract boolean configureProperty(String tok, String val, StringBuffer warnings);
-  
+    
   /**
    * Get unique key for this type of parameter in a URL encoding.
    * @return the string that prefixes an input parameter of InputType<T> type in the string returned from getURLEncodedParameter
@@ -154,7 +191,13 @@ public abstract class InputType {
                 warnings.append("Invalid value for parameter "+mtch.group(1).toLowerCase()+" '"+mtch.group(2)+"' (expected an integer)\n");
             }
           
-          valid = valid && configureProperty(mtch.group(1), mtch.group(2), warnings);
+          if (!configureProperty(mtch.group(1), mtch.group(2), warnings)) {
+            if (warnings.length()==0)
+            {
+              warnings.append("Failed to configure InputType :"+getURLtokenPrefix()+" with property string: '"+mtch.group(0)+"'\n (token is '"+mtch.group(1)+"' and value is '"+mtch.group(2)+"')\n");
+            }
+            valid=false;
+          }
         }
         }
       return valid;
@@ -166,7 +209,58 @@ public abstract class InputType {
       prms.add("min='"+min+"'");
     }
     if (max!=0) {
-      prms.add("min='"+max+"'");
+      prms.add("max='"+max+"'");
+    }
+  }
+  
+  public abstract List<OptionI> getOptions();
+  public List<OptionI> getBaseOptions()
+  {
+    ArrayList<OptionI> opts = new ArrayList<OptionI>();
+    opts.add(new IntegerParameter("min","Minimum number of data of this type",true,1,min,0,-1));
+    opts.add(new IntegerParameter("max","Maximum number of data of this type",false,0,max,0,-1));
+    return opts;
+  }
+  /**
+   * make a copy of this InputType
+   * @return
+   * may not be needed
+  public abstract InputType copy();
+   */
+  
+  /**
+   * parse a set of configuration options
+   * @param currentSettings - modified settings originally from getOptions
+   * @throws InvalidArgumentException thrown if currentSettings contains invalid options for this type.
+   */
+  public void configureFromArgumentI(List<ArgumentI> currentSettings) throws InvalidArgumentException
+  {
+    ArrayList<String> urltoks = new ArrayList<String>();
+    String rg;
+    for (ArgumentI arg: currentSettings)
+    {
+      if (arg instanceof ParameterI)
+      {
+        rg=arg.getName()+"='"+arg.getValue()+"'";
+      } else {
+        // TODO: revise architecture - this is counter intuitive - options with different values to their names are actually parameters
+        rg=(arg.getValue().length()>0) ? (arg.getValue().equals(arg.getName()) ? arg.getName():arg.getName()+"='"+arg.getValue()+"'")
+                : arg.getName();
+      } 
+      if (rg.length()>0) {
+        urltoks.add(rg);
+      }
     }
+    StringBuffer warnings;
+    if (!configureFromURLtokenString(urltoks, warnings=new StringBuffer()))
+    {
+      throw new InvalidArgumentException(warnings.toString());
+    }
+  }
+  protected OptionI createMolTypeOption(String name, String descr,
+          boolean req, molType curType, molType defType)
+  {
+    return new Option(name,descr, req, defType==null ? "" : defType.toString(), curType==null ? "" : curType.toString(),molType.toStringValues(),
+            null);
   }
 }
\ No newline at end of file