JAL-591
[jalview.git] / src / jalview / ws / jws2 / JabaParamStore.java
index 0f7d6fa..bdea5be 100644 (file)
@@ -7,6 +7,7 @@ import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.StringTokenizer;
 
 import compbio.metadata.Argument;
 import compbio.metadata.Option;
@@ -21,6 +22,7 @@ import jalview.ws.jws2.dm.JabaParameter;
 import jalview.ws.jws2.dm.JabaWsParamSet;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.ParamDatastoreI;
+import jalview.ws.params.ParamManager;
 import jalview.ws.params.WsParamSetI;
 
 public class JabaParamStore implements ParamDatastoreI
@@ -36,56 +38,44 @@ public class JabaParamStore implements ParamDatastoreI
 
   public JabaParamStore(Jws2Instance service)
   {
-    this.service = service;
-    serviceOptions = service.getRunnerConfig();
-    // TODO: discover all the user's locally sored presets for this service and populate the hash table
-    // TODO: for JAL-632
+    this(service, null);
   }
 
-  /**
-   * store the given parameters in the user parameter set database.
-   * 
-   * @param storeSetName
-   *          - lastParmSet
-   * @param descr
-   *          - setDescr.getText()
-   * @param jobParams
-   *          - getJobParams()
-   */
-  private void _storeUserPreset(String storeSetName, String descr,
-          List<Argument> jobParams)
-  {
-    // this is a simple hash store.
-    editedParams.put(storeSetName, new JabaWsParamSet(storeSetName, descr,
-            JabaParamStore.getJwsArgsfromJaba(jobParams)));
-    // writeParam("Saving " + storeSetName + ": ", jobParams);
-  }
+  ParamManager manager;
 
-  private void writeParam(String nm, List<Argument> params)
+  public JabaParamStore(Jws2Instance service, ParamManager manager)
   {
-    for (Argument p : params)
+    this.service = service;
+    serviceOptions = service.getRunnerConfig();
+    this.manager = manager;
+    // discover all the user's locally stored presets for this service and
+    // populate the hash table
+    if (manager != null)
     {
-      System.out.println(nm + ":" + System.identityHashCode(p) + " Name: "
-              + p.getName() + " Value: " + p.getDefaultValue());
+      manager.registerParser(service.getUri(), this);
+      WsParamSetI[] prams = manager.getParameterSet(null, service.getUri(),
+              true, false);
+      if (prams != null)
+      {
+        for (WsParamSetI paramset : prams)
+        {
+          if (paramset instanceof JabaWsParamSet)
+          {
+            editedParams.put(paramset.getName(), (JabaWsParamSet) paramset);
+          }
+          else
+          {
+            System.err
+                    .println("Warning: Ignoring parameter set instance of type "
+                            + paramset.getClass()
+                            + " : Bound but not applicable for service at "
+                            + service.getUri());
+          }
+        }
+      }
     }
   }
 
-  private JabaWsParamSet _getUserPreset(String setName)
-  {
-    JabaWsParamSet pset = editedParams.get(setName);
-    return pset;
-  }
-
-  /**
-   * remove the given user preset from the preset stash
-   * 
-   * @param setName
-   */
-  private void _deleteUserPreset(String setName)
-  {
-    editedParams.remove(setName);
-  }
-
   @Override
   public List<WsParamSetI> getPresets()
   {
@@ -192,7 +182,12 @@ public class JabaParamStore implements ParamDatastoreI
   {
     if (editedParams.containsKey(name))
     {
+      WsParamSetI parameterSet = editedParams.get(name);
       editedParams.remove(name);
+      if (manager != null)
+      {
+        manager.deleteParameterSet(parameterSet);
+      }
       return;
     }
     if (servicePresets.containsKey(name))
@@ -202,45 +197,125 @@ public class JabaParamStore implements ParamDatastoreI
     }
   }
 
-
   @Override
   public void storePreset(String presetName, String text,
           List<ArgumentI> jobParams)
   {
     JabaWsParamSet jps = new JabaWsParamSet(presetName, text, jobParams);
+    jps.setApplicableUrls(new String[]
+    { service.getUri() });
     editedParams.put(jps.getName(), jps);
+    if (manager != null)
+    {
+      manager.storeParameterSet(jps);
+    }
   }
 
   @Override
-  public boolean readParamSet(WsParamSetI wsp,
-          Reader reader) throws IOException
+  public void updatePreset(String oldName, String presetName, String text,
+          List<ArgumentI> jobParams)
   {
-    if (!(wsp instanceof JabaWsParamSet))
+    JabaWsParamSet jps = (JabaWsParamSet) ((oldName != null) ? getPreset(oldName)
+            : getPreset(presetName));
+    if (jps == null)
     {
-      throw new Error("Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
+      throw new Error("Implementation error: Can't locate either oldname ("
+              + oldName + ") or presetName (" + presetName
+              + "in the datastore!");
     }
-    List<String> lines=new ArrayList<String>();
-    String line;
-    BufferedReader br = new BufferedReader(reader);
-    while ((line=br.readLine())!=null)
+    jps.setName(presetName);
+    jps.setDescription(text);
+    jps.setArguments(jobParams);
+    jps.setApplicableUrls(new String[]
+    { service.getUri() });
+    if (oldName != null && !oldName.equals(jps.getName()))
     {
-      lines.add(line);
+      editedParams.remove(oldName);
+    }
+    editedParams.put(jps.getName(), jps);
+
+    if (manager != null)
+    {
+      manager.storeParameterSet(jps);
     }
-    ((JabaWsParamSet) wsp).setjabaArguments(ParameterUtils.processParameters(lines, serviceOptions, " "));
-    return true;
+  }
+
+  /**
+   * create a new, empty parameter set for this service
+   * 
+   * @return
+   */
+  WsParamSetI newWsParamSet()
+  {
+    return new JabaWsParamSet();
+  };
+
+  private boolean involves(String[] urls)
+  {
+    boolean found = false;
+    for (String url : urls)
+    {
+      if (service.getUri().equalsIgnoreCase(url))
+      {
+        found = true;
+        break;
+      }
+    }
+    return found;
   }
 
   @Override
-  public boolean writeParamSet(WsParamSetI wsp,
-          Writer writer) throws IOException
+  public WsParamSetI parseServiceParameterFile(String name, String descr,
+          String[] urls, String parameterfile) throws IOException
   {
-            if (!(wsp instanceof JabaWsParamSet))
-            {
-              throw new Error("Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
-            }
-            writer.write(ParameterUtils.writeParameterSet(((JabaWsParamSet)wsp).getjabaArguments(), " ")
-                    .toString());
-            return true;
+    if (!involves(urls))
+    {
+      throw new IOException(
+              "Implementation error: Cannot find service url in the given url set!");
+
+    }
+    JabaWsParamSet wsp = new JabaWsParamSet();
+    wsp.setName(name);
+    wsp.setDescription(descr);
+    wsp.setApplicableUrls(urls.clone());
+
+    List<String> lines = new ArrayList<String>();
+    StringTokenizer st = new StringTokenizer(parameterfile, "\n");
+    while (st.hasMoreTokens())
+    {
+      lines.add(st.nextToken());
+    }
+    wsp.setjabaArguments(ParameterUtils.processParameters(lines,
+            serviceOptions, " "));
+    return wsp;
+  }
+
+  @Override
+  public String generateServiceParameterFile(WsParamSetI pset)
+          throws IOException
+  {
+    if (!involves(pset.getApplicableUrls()))
+    {
+      throw new IOException(
+              "Implementation error: Cannot find service url in the given url set for this service parameter store ("
+                      + service.getUri() + ") !");
+
+    }
+    if (!(pset instanceof JabaWsParamSet))
+    {
+      throw new Error(
+              "Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
+    }
+
+    StringBuffer rslt = new StringBuffer();
+    for (String ln : ParameterUtils.writeParameterSet(
+            ((JabaWsParamSet) pset).getjabaArguments(), " "))
+    {
+      rslt.append(ln);
+      rslt.append("\n");
+    }
+    ;
+    return rslt.toString();
   }
 
 }