a209409239 (JAL-976 - add support for storing service parameter sets in project)
authorjprocter <jprocter@compbio.dundee.ac.uk>
Sun, 8 Jul 2012 14:24:05 +0000 (15:24 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Sun, 8 Jul 2012 14:24:05 +0000 (15:24 +0100)
src/jalview/gui/Jalview2XML.java

index 45bab7c..d9aca36 100644 (file)
@@ -38,6 +38,13 @@ import jalview.schemabinding.version2.*;
 import jalview.schemes.*;
 import jalview.util.Platform;
 import jalview.util.jarInputStreamProvider;
+import jalview.ws.jws2.AAConsClient;
+import jalview.ws.jws2.Jws2Discoverer;
+import jalview.ws.jws2.dm.AAConsSettings;
+import jalview.ws.jws2.jabaws2.Jws2Instance;
+import jalview.ws.params.ArgumentI;
+import jalview.ws.params.AutoCalcSetting;
+import jalview.ws.params.WsParamSetI;
 
 /**
  * Write out the current jalview desktop state as a Jalview XML stream.
@@ -457,6 +464,7 @@ public class Jalview2XML
     }
 
     JSeq jseq;
+    Set<String> calcIdSet=new HashSet<String>();
 
     // SAVE SEQUENCES
     String id = "";
@@ -790,7 +798,6 @@ public class Jalview2XML
         }
       }
     }
-
     // SAVE ANNOTATIONS
     /**
      * store forward refs from an annotationRow to any groups
@@ -876,6 +883,7 @@ public class Jalview2XML
 
         if (aa[i].getCalcId()!=null)
         {
+          calcIdSet.add(aa[i].getCalcId());
           an.setCalcId(aa[i].getCalcId());
         }
 
@@ -1228,6 +1236,15 @@ public class Jalview2XML
         }
       }
     }
+    if (calcIdSet.size()>0)
+    {
+      for (String calcId:calcIdSet)
+      {
+        if (calcId.trim().length()>0) {
+          view.addCalcIdParam(createCalcIdParam(calcId, av));
+        }
+      }
+    }
 
     jms.addViewport(view);
 
@@ -1259,6 +1276,85 @@ public class Jalview2XML
     return object;
   }
 
+  private CalcIdParam createCalcIdParam(String calcId, AlignViewport av)
+  {
+    AutoCalcSetting settings = av.getCalcIdSettingsFor(calcId);
+    if (settings != null)
+    {
+      CalcIdParam vCalcIdParam = new CalcIdParam();
+      vCalcIdParam.setCalcId(calcId);
+      vCalcIdParam.addServiceURL(settings.getServiceURI());
+      // generic URI allowing a third party to resolve another instance of the
+      // service used for this calculation
+      for (String urls:settings.getServiceURLs())
+      {
+        vCalcIdParam.addServiceURL(urls);
+      }
+      vCalcIdParam.setVersion("1.0");
+      if (settings.getPreset() != null)
+      {
+        WsParamSetI setting = settings.getPreset();
+        vCalcIdParam.setName(setting.getName());
+        vCalcIdParam.setDescription(setting.getDescription());
+      }
+      else
+      {
+        vCalcIdParam.setName("");
+        vCalcIdParam.setDescription("Last used parameters");
+      }
+      // need to be able to recover 1) settings 2) user-defined presets or
+      // recreate settings from preset 3) predefined settings provided by
+      // service - or settings that can be transferred (or discarded)
+      vCalcIdParam.setParameters(settings
+              .getWsParamFile());
+      vCalcIdParam.setAutoUpdate(settings.isAutoUpdate());
+      // todo - decide if updateImmediately is needed for any projects.
+
+      return vCalcIdParam;
+    }
+    return null;
+  }
+
+  private boolean recoverCalcIdParam(CalcIdParam calcIdParam,
+          AlignViewport av)
+  {
+    if (calcIdParam.getVersion().equals("1.0"))
+    {
+      Jws2Instance service=Jws2Discoverer.getDiscoverer().getPreferredServiceFor(calcIdParam.getServiceURL());
+      if (service!=null)
+      {
+        WsParamSetI parmSet=null;
+        try {
+          service.getParamStore().parseServiceParameterFile(calcIdParam.getName(), calcIdParam.getDescription(), calcIdParam.getServiceURL(), calcIdParam.getParameters());
+        } catch (IOException x)
+        {
+          warn("Couldn't parse parameter data for "+calcIdParam.getCalcId(), x);
+          return false;
+        }
+        List<ArgumentI> argList=null;
+        if (calcIdParam.getName().length()>0) {
+          parmSet = service.getParamStore().getPreset(calcIdParam.getName());
+          if (parmSet!=null)
+          {
+            // TODO : check we have a good match with settings in AACons - otherwise we'll need to create a new preset
+          }
+        }
+        else {
+          argList = parmSet.getArguments();
+          parmSet=null;
+        }
+        AAConsSettings settings = new AAConsSettings(calcIdParam.isAutoUpdate(), service, parmSet, argList);
+        av.setCalcIdSettingsFor(calcIdParam.getCalcId(), settings, calcIdParam.isNeedsUpdate());
+      } else {
+        warn("Cannot resolve a service for the parameters used in this project. Try configuring a JABAWS server.");
+        return false;
+      }
+    }
+    else
+      throw new Error("Unsupported Version for calcIdparam "
+              + calcIdParam.toString());
+    return false;
+  }
   /**
    * External mapping between jalview objects and objects yielding a valid and
    * unique object ID string. This is null for normal Jalview project IO, but