JAL-919, JAL-715 - prototype service editing dialog using jalview parameter model...
[jalview.git] / src / jalview / ws / rest / InputType.java
index 3c0b511..bc55893 100644 (file)
@@ -1,5 +1,11 @@
 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;
@@ -10,6 +16,7 @@ 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;
@@ -32,7 +39,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
@@ -120,7 +137,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
@@ -157,7 +174,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;
@@ -169,7 +192,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