Merge branch 'bug/JAL-3807_jpred-with-slivka' into alpha/JAL-3066_Jalview_212_slivka...
authorMateusz Warowny <mmzwarowny@dundee.ac.uk>
Tue, 27 Jul 2021 15:36:15 +0000 (17:36 +0200)
committerMateusz Warowny <mmzwarowny@dundee.ac.uk>
Tue, 27 Jul 2021 15:36:15 +0000 (17:36 +0200)
14 files changed:
src/jalview/api/AlignCalcManagerI.java [deleted file]
src/jalview/gui/AlignFrame.java
src/jalview/gui/WsJobParameters.java
src/jalview/javascript/log4j/Logger.java
src/jalview/viewmodel/AlignmentViewport.java
src/jalview/workers/AlignCalcManager.java [deleted file]
src/jalview/workers/AlignCalcWorker.java
src/jalview/ws/WSClient.java
src/jalview/ws/jws2/MsaWSClient.java
src/jalview/ws/jws2/SeqAnnotationServiceCalcWorker.java
src/jalview/ws/jws2/SequenceAnnotationWSClient.java
src/jalview/ws/slivkaws/SlivkaWSInstance.java
test/jalview/gui/AlignViewportTest.java
test/jalview/workers/AlignCalcManagerTest.java

diff --git a/src/jalview/api/AlignCalcManagerI.java b/src/jalview/api/AlignCalcManagerI.java
deleted file mode 100644 (file)
index 005ecd7..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
- * 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/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.api;
-
-import jalview.datamodel.AlignmentAnnotation;
-
-import java.util.List;
-
-public interface AlignCalcManagerI
-{
-
-  /**
-   * tell manager that a worker is initialised and has started to run
-   * 
-   * @param worker
-   */
-  void notifyStarted(AlignCalcWorkerI worker);
-
-  /**
-   * tell manager that a thread running worker's run() loop is ready to start
-   * processing data
-   * 
-   * @param worker
-   * @return true if worker should start processing, false if another thread is
-   *         in progress
-   */
-  boolean notifyWorking(AlignCalcWorkerI worker);
-
-  /**
-   * notify manager that the worker has completed, and results may be ready to
-   * collect
-   * 
-   * @param worker
-   */
-  void workerComplete(AlignCalcWorkerI worker);
-
-  /**
-   * indicate that a worker like this cannot run on the platform and shouldn't
-   * be started again
-   * 
-   * @param worker
-   */
-  void disableWorker(AlignCalcWorkerI worker);
-
-  /**
-   * indicate that a worker like this may be run on the platform.
-   * 
-   * @param worker
-   *          of class to be removed from the execution blacklist
-   */
-  void enableWorker(AlignCalcWorkerI worker);
-
-  /**
-   * Answers true if the worker is disabled from running
-   * 
-   * @param worker
-   * @return
-   */
-  boolean isDisabled(AlignCalcWorkerI worker);
-
-  /**
-   * launch a new worker
-   * 
-   * @param worker
-   */
-  void startWorker(AlignCalcWorkerI worker);
-
-  /**
-   * 
-   * @param worker
-   * @return true if the worker is currently running
-   */
-  boolean isWorking(AlignCalcWorkerI worker);
-
-  /**
-   * if any worker thread is operational, return true!
-   * 
-   * @return
-   */
-  boolean isWorking();
-
-  /**
-   * register a restartable worker
-   * 
-   * @param worker
-   */
-  void registerWorker(AlignCalcWorkerI worker);
-
-  /**
-   * restart any registered workers
-   */
-  void restartWorkers();
-
-  /**
-   * 
-   * @param alignmentAnnotation
-   * @return true if a currently registered and working worker indicates its
-   *         involvement with the given alignmentAnnotation
-   */
-  boolean workingInvolvedWith(AlignmentAnnotation alignmentAnnotation);
-
-  /**
-   * kick any known instances of the given worker class to update their
-   * annotation
-   * 
-   * @param workerClass
-   */
-  void updateAnnotationFor(Class<? extends AlignCalcWorkerI> workerClass);
-
-  /**
-   * return any registered workers of the given class
-   * 
-   * @param workerClass
-   * @return null or one or more workers of the given class
-   */
-  List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
-          Class<? extends AlignCalcWorkerI> workerClass);
-
-  /**
-   * work out if there is an instance of a worker that is *waiting* to start
-   * calculating
-   * 
-   * @param workingClass
-   * @return true if workingClass is already waiting to calculate. false if it
-   *         is calculating, or not queued.
-   */
-  boolean isPending(AlignCalcWorkerI workingClass);
-
-  /**
-   * deregister and otherwise remove any registered and working instances of the
-   * given worker type
-   * 
-   * @param typeToRemove
-   */
-  void removeWorkersOfClass(
-          Class<? extends AlignCalcWorkerI> typeToRemove);
-
-  /**
-   * Removes the worker that produces the given annotation, provided it is
-   * marked as 'deletable'. Some workers may need to continue to run as the
-   * results of their calculations are needed, e.g. for colour schemes.
-   * 
-   * @param ann
-   */
-  void removeWorkerForAnnotation(AlignmentAnnotation ann);
-}
index 9d8407a..db6870e 100644 (file)
@@ -1141,16 +1141,18 @@ public class AlignFrame extends GAlignFrame
     {
       WsParamSetI set = new HMMERPreset();
       WsJobParameters params = new WsJobParameters(store, set, args);
-      if (params.showRunDialog())
-      {
-        args = params.getJobParams();
-      }
-      else
-      {
-        return; // user cancelled
-      }
+      params.showRunDialog().thenAccept((startJob) -> {
+        if (startJob)
+        {
+          var args2 = params.getJobParams();
+          new Thread(new HMMBuild(this, args2)).start();
+        }
+      });
+    }
+    else
+    {
+      new Thread(new HMMBuild(this, args)).start();
     }
-    new Thread(new HMMBuild(this, args)).start();
   }
 
   @Override
@@ -1172,16 +1174,18 @@ public class AlignFrame extends GAlignFrame
     {
       WsParamSetI set = new HMMERPreset();
       WsJobParameters params = new WsJobParameters(store, set, args);
-      if (params.showRunDialog())
-      {
-        args = params.getJobParams();
-      }
-      else
-      {
-        return; // user cancelled
-      }
+      params.showRunDialog().thenAccept((startJob) -> {
+        if (startJob)
+        {
+          var args2 = params.getJobParams();
+          new Thread(new HMMAlign(this, args2)).start();
+        }
+      });
+    }
+    else
+    {
+      new Thread(new HMMAlign(this, args)).start();
     }
-    new Thread(new HMMAlign(this, args)).start();
   }
 
   @Override
@@ -1203,17 +1207,20 @@ public class AlignFrame extends GAlignFrame
     {
       WsParamSetI set = new HMMERPreset();
       WsJobParameters params = new WsJobParameters(store, set, args);
-      if (params.showRunDialog())
-      {
-        args = params.getJobParams();
-      }
-      else
-      {
-        return; // user cancelled
-      }
+      params.showRunDialog().thenAccept((startJob) -> {
+        if (startJob)
+        {
+          var args2 = params.getJobParams();
+          new Thread(new HMMSearch(this, args2)).start();
+          alignPanel.repaint();
+        }
+      });
+    }
+    else
+    {
+      new Thread(new HMMSearch(this, args)).start();
+      alignPanel.repaint();
     }
-    new Thread(new HMMSearch(this, args)).start();
-    alignPanel.repaint();
   }
 
   @Override
@@ -1232,18 +1239,20 @@ public class AlignFrame extends GAlignFrame
     {
       WsParamSetI set = new HMMERPreset();
       WsJobParameters params = new WsJobParameters(store, set, args);
-      if (params.showRunDialog())
-      {
-        args = params.getJobParams();
-      }
-      else
-      {
-        return; // user cancelled
-      }
+      params.showRunDialog().thenAccept((startJob) -> {
+        if (startJob)
+        {
+          var args2 = params.getJobParams();
+          new Thread(new JackHMMER(this, args2)).start();
+          alignPanel.repaint();
+        }
+      });
+    }
+    else
+    {
+      new Thread(new JackHMMER(this, args)).start();
+      alignPanel.repaint();
     }
-    new Thread(new JackHMMER(this, args)).start();
-    alignPanel.repaint();
-
   }
 
   /**
index 719b7d9..c1a925d 100644 (file)
@@ -48,14 +48,18 @@ import java.awt.event.ItemListener;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
 
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JDialog;
+import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
+import javax.swing.WindowConstants;
 import javax.swing.border.TitledBorder;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
@@ -93,6 +97,9 @@ public class WsJobParameters extends JPanel implements ItemListener,
 
   // TODO ABSRACT FROM JABAWS CLASSES
 
+  // completion stage representing whether start was clicked
+  private final CompletableFuture<Boolean> completionStage = new CompletableFuture<>();
+  
   /**
    * manager for options and parameters.
    */
@@ -123,13 +130,22 @@ public class WsJobParameters extends JPanel implements ItemListener,
   JTextArea setDescr = new JTextArea();
 
   JScrollPane paramPane = new JScrollPane();
+  
+  JButton startjob = JvSwingUtils.makeButton(
+          MessageManager.getString("action.start_job"),
+          MessageManager.getString("label.start_job_current_settings"),
+          this::startjob_actionPerformed);
+  JButton canceljob = JvSwingUtils.makeButton(
+          MessageManager.getString("action.cancel_job"),
+          MessageManager.getString("label.cancel_job_close_dialog"),
+          this::canceljob_actionPerformed);
 
   ParamDatastoreI paramStore;
 
   // set true when 'Start Job' is clicked
   boolean startJob = false;
 
-  JDialog frame = null;
+  JFrame frame = null;
 
   UIinfo service;
 
@@ -195,19 +211,15 @@ public class WsJobParameters extends JPanel implements ItemListener,
    * 
    * @return
    */
-  public boolean showRunDialog()
+  public CompletionStage<Boolean> showRunDialog()
   {
-
-    frame = new JDialog(Desktop.getInstance(), true);
+    frame = new JFrame();
+    frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
     if (service != null)
     {
       frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
-              new String[]
-      { service.getActionText() }));
+              new String[] { service.getActionText() }));
     }
-    frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
-            new String[]
-            { service.getActionText() }));
     Rectangle deskr = Desktop.getInstance().getBounds();
     Dimension pref = this.getPreferredSize();
     frame.setBounds(
@@ -228,9 +240,9 @@ public class WsJobParameters extends JPanel implements ItemListener,
 
       }
     });
+    
     frame.setVisible(true);
-
-    return startJob;
+    return completionStage;
   }
 
   private void jbInit()
@@ -254,75 +266,21 @@ public class WsJobParameters extends JPanel implements ItemListener,
     updatepref = JvSwingUtils.makeButton(
             MessageManager.getString("action.update"),
             MessageManager.getString("label.update_user_parameter_set"),
-            new ActionListener()
-            {
-
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                update_actionPerformed();
-              }
-            });
+            this::update_actionPerformed);
     deletepref = JvSwingUtils.makeButton(
             MessageManager.getString("action.delete"),
             MessageManager.getString("label.delete_user_parameter_set"),
-            new ActionListener()
-            {
-
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                delete_actionPerformed();
-              }
-            });
+            this::delete_actionPerformed);
     createpref = JvSwingUtils.makeButton(
             MessageManager.getString("action.create"),
             MessageManager.getString("label.create_user_parameter_set"),
-            new ActionListener()
-            {
-
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                create_actionPerformed();
-              }
-            });
+            this::create_actionPerformed);
     revertpref = JvSwingUtils.makeButton(
             MessageManager.getString("action.revert"),
             MessageManager
                     .getString("label.revert_changes_user_parameter_set"),
-            new ActionListener()
-            {
+            this::revert_actionPerformed);
 
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                revert_actionPerformed();
-              }
-            });
-
-    JButton startjob = JvSwingUtils.makeButton(
-            MessageManager.getString("action.start_job"),
-            MessageManager.getString("label.start_job_current_settings"),
-            new ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                startjob_actionPerformed();
-              }
-            });
-    JButton canceljob = JvSwingUtils.makeButton(
-            MessageManager.getString("action.cancel_job"),
-            MessageManager.getString("label.cancel_job_close_dialog"),
-            new ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                canceljob_actionPerformed();
-              }
-            });
 
     JPanel setDetails = new JPanel();
     setDetails.setBorder(
@@ -424,13 +382,13 @@ public class WsJobParameters extends JPanel implements ItemListener,
     validate();
   }
 
-  protected void revert_actionPerformed()
+  protected void revert_actionPerformed(ActionEvent e)
   {
     reInitDialog(lastParmSet);
     updateWebServiceMenus();
   }
 
-  protected void update_actionPerformed()
+  protected void update_actionPerformed(ActionEvent e)
   {
     if (isUserPreset)
     {
@@ -448,7 +406,7 @@ public class WsJobParameters extends JPanel implements ItemListener,
     paramStore.deletePreset(lastParmSet2);
   }
 
-  protected void delete_actionPerformed()
+  protected void delete_actionPerformed(ActionEvent e)
   {
     if (isUserPreset)
     {
@@ -459,7 +417,7 @@ public class WsJobParameters extends JPanel implements ItemListener,
     updateWebServiceMenus();
   }
 
-  protected void create_actionPerformed()
+  protected void create_actionPerformed(ActionEvent e)
   {
     String curname = ((String) setName.getSelectedItem()).trim();
     if (curname.length() > 0)
@@ -478,22 +436,24 @@ public class WsJobParameters extends JPanel implements ItemListener,
     }
   }
 
-  protected void canceljob_actionPerformed()
+  protected void canceljob_actionPerformed(ActionEvent e)
   {
     startJob = false;
     if (frame != null)
     {
       frame.setVisible(false);
     }
+    completionStage.complete(false);
   }
 
-  protected void startjob_actionPerformed()
+  protected void startjob_actionPerformed(ActionEvent e)
   {
     startJob = true;
     if (frame != null)
     {
       frame.setVisible(false);
     }
+    completionStage.complete(true);
   }
 
   void initForService(WsParamSetI paramSet, List<ArgumentI> jobArgset)
index 183328d..340e1f9 100644 (file)
@@ -56,7 +56,7 @@ public class Logger
     if (logger == null)
     {
       registry.put(name, logger = new Logger(name));
-      logger.setLevel(Level.INFO);
+      logger.setLevel(Level.DEBUG);
     }
     return logger;
   }
@@ -80,6 +80,21 @@ public class Logger
   {
     return isEnabled;
   }
+  
+  public void trace(Object o)
+  {
+    trace(o, null);
+  }
+  
+  public void trace(Object o, Throwable e)
+  {
+    switch (level.level)
+    {
+    case Level.TRACE_INT:
+      log(o, e);
+      break;
+    }
+  }
 
   public void debug(Object o)
   {
@@ -91,6 +106,7 @@ public class Logger
     switch (level.level)
     {
     case Priority.DEBUG_INT:
+    case Level.TRACE_INT:
       log(o, e);
       break;
     }
@@ -107,6 +123,7 @@ public class Logger
     {
     case Priority.INFO_INT:
     case Priority.DEBUG_INT:
+    case Level.TRACE_INT:
       log(o, e);
       break;
     }
@@ -125,6 +142,7 @@ public class Logger
     case Priority.WARN_INT:
     case Priority.INFO_INT:
     case Priority.DEBUG_INT:
+    case Level.TRACE_INT:
       log(o, e);
       break;
     }
@@ -144,6 +162,7 @@ public class Logger
     case Priority.WARN_INT:
     case Priority.INFO_INT:
     case Priority.DEBUG_INT:
+    case Level.TRACE_INT:
       log(o, e);
       break;
     }
@@ -155,27 +174,15 @@ public class Logger
     switch (level.level)
     {
     case Priority.ERROR_INT:
-      if (appender == null)
-      {
-        System.err.println(s);
-        return;
-      }
-      break;
     case Priority.WARN_INT:
       if (appender == null)
       {
         System.err.println(s);
         return;
       }
-      break;
     case Priority.INFO_INT:
-      if (appender == null)
-      {
-        System.out.println(s);
-        return;
-      }
-      break;
     case Priority.DEBUG_INT:
+    case Level.TRACE_INT:
       if (appender == null)
       {
         System.out.println(s);
@@ -183,7 +190,10 @@ public class Logger
       }
       break;
     }
-    e.printStackTrace();
+    if (e != null)
+    {
+      e.printStackTrace();
+    }
     appender.append(new LoggingEvent(this, s.toString(), level));
   }
 
index 4aec9d2..1a08b1b 100644 (file)
@@ -23,7 +23,6 @@ package jalview.viewmodel;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.Conservation;
 import jalview.analysis.TreeModel;
-import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcManagerI2;
 import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignExportSettingsI;
@@ -58,7 +57,6 @@ import jalview.util.MapList;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 import jalview.viewmodel.styles.ViewStyle;
-import jalview.workers.AlignCalcManager;
 import jalview.workers.AlignCalcManager2;
 import jalview.workers.ComplementConsensusThread;
 import jalview.workers.ConsensusThread;
diff --git a/src/jalview/workers/AlignCalcManager.java b/src/jalview/workers/AlignCalcManager.java
deleted file mode 100644 (file)
index ec80576..0000000
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
- * 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/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.workers;
-
-import jalview.api.AlignCalcManagerI;
-import jalview.api.AlignCalcWorkerI;
-import jalview.bin.Cache;
-import jalview.datamodel.AlignmentAnnotation;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class AlignCalcManager implements AlignCalcManagerI
-{
-  /*
-   * list of registered workers
-   */
-  private final List<AlignCalcWorkerI> restartable = Collections
-          .synchronizedList(new ArrayList<AlignCalcWorkerI>());
-
-  /*
-   * types of worker _not_ to run (for example, because they have
-   * previously thrown errors)
-   */
-  private final List<Class<? extends AlignCalcWorkerI>> blackList = Collections
-          .synchronizedList(new ArrayList<Class<? extends AlignCalcWorkerI>>());
-
-  /*
-   * global record of calculations in progress
-   */
-  private final List<AlignCalcWorkerI> inProgress = Collections
-          .synchronizedList(new ArrayList<AlignCalcWorkerI>());
-
-  /*
-   * record of calculations pending or in progress in the current context
-   */
-  private final Map<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>> updating =
-          new Hashtable<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>>();
-
-  /*
-   * workers that have run to completion so are candidates for visual-only 
-   * update of their results
-   */
-  private HashSet<AlignCalcWorkerI> canUpdate = new HashSet<>();;
-
-  private static boolean listContains(List<AlignCalcWorkerI> upd,
-          AlignCalcWorkerI worker)
-  {
-    // avoid use of 'Contains' in case
-    for (AlignCalcWorkerI _otherworker : upd)
-    {
-      if (_otherworker == upd)
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-  @Override
-  public void notifyStarted(AlignCalcWorkerI worker)
-  {
-    synchronized (updating)
-    {
-      List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
-      if (upd == null)
-      {
-        updating.put(worker.getClass(), upd = Collections
-                .synchronizedList(new ArrayList<AlignCalcWorkerI>()));
-      }
-      synchronized (upd)
-      {
-        if (listContains(upd, worker))
-        {
-          Cache.log.debug(
-                    "Ignoring second call to notifyStart for worker "
-                            + worker);
-        }
-        else
-        {
-          upd.add(worker);
-        }
-      }
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see jalview.api.AlignCalcManagerI#isPending(jalview.api.AlignCalcWorkerI)
-   */
-  @Override
-  public boolean isPending(AlignCalcWorkerI workingClass)
-  {
-    synchronized (updating)
-    {
-      List<AlignCalcWorkerI> upd = updating.get(workingClass.getClass());
-      return upd != null && upd.size() > 1;
-    }
-  }
-
-  @Override
-  public boolean notifyWorking(AlignCalcWorkerI worker)
-  {
-    synchronized (inProgress)
-    {
-      if (listContains(inProgress, worker))
-      {
-        return false; // worker is already working, so ask caller to wait around
-      }
-      else
-      {
-        inProgress.add(worker);
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public void workerComplete(AlignCalcWorkerI worker)
-  {
-    synchronized (inProgress)
-    {
-      Cache.log.debug("Worker " + worker + " marked as complete.");
-      inProgress.remove(worker);
-      List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
-      if (upd != null)
-      {
-        synchronized (upd)
-        {
-          upd.remove(worker);
-        }
-        canUpdate.add(worker);
-      }
-    }
-  }
-
-  @Override
-  public void disableWorker(AlignCalcWorkerI worker)
-  {
-    synchronized (blackList)
-    {
-      blackList.add(worker.getClass());
-    }
-  }
-
-  @Override
-  public boolean isDisabled(AlignCalcWorkerI worker)
-  {
-    synchronized (blackList)
-    {
-      return blackList.contains(worker.getClass());
-    }
-  }
-
-  @Override
-  public void startWorker(AlignCalcWorkerI worker)
-  {
-    if (!isDisabled(worker))
-    {
-      Thread tw = new Thread(() -> {
-        try
-        {
-          worker.run();
-        } catch (Throwable e)
-        {
-          e.printStackTrace();
-        }
-      });
-      tw.setName(worker.getClass().toString());
-      tw.start();
-    }
-  }
-
-  @Override
-  public boolean isWorking(AlignCalcWorkerI worker)
-  {
-    synchronized (inProgress)
-    {// System.err.println("isWorking : worker "+(worker!=null ?
-     // worker.getClass():"null")+ " "+hashCode());
-      return worker != null && inProgress.contains(worker);
-    }
-  }
-
-  @Override
-  public boolean isWorking()
-  {
-    synchronized (inProgress)
-    {
-      // System.err.println("isWorking "+hashCode());
-      return inProgress.size() > 0;
-    }
-  }
-
-  public int getQueueLength() {
-    return inProgress.size();
-  }
-  
-  @Override
-  public void registerWorker(AlignCalcWorkerI worker)
-  {
-    synchronized (restartable)
-    {
-      if (!listContains(restartable, worker))
-      {
-        restartable.add(worker);
-      }
-      startWorker(worker);
-    }
-  }
-
-  @Override
-  public void restartWorkers()
-  {
-    synchronized (restartable)
-    {
-      for (AlignCalcWorkerI worker : restartable)
-      {
-        startWorker(worker);
-      }
-    }
-  }
-
-  @Override
-  public boolean workingInvolvedWith(
-          AlignmentAnnotation alignmentAnnotation)
-  {
-    synchronized (inProgress)
-    {
-      for (AlignCalcWorkerI worker : inProgress)
-      {
-        if (worker.involves(alignmentAnnotation))
-        {
-          return true;
-        }
-      }
-    }
-    synchronized (updating)
-    {
-      for (List<AlignCalcWorkerI> workers : updating.values())
-      {
-        for (AlignCalcWorkerI worker : workers)
-        {
-          if (worker.involves(alignmentAnnotation))
-          {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public void updateAnnotationFor(
-          Class<? extends AlignCalcWorkerI> workerClass)
-  {
-
-    AlignCalcWorkerI[] workers;
-    synchronized (canUpdate)
-    {
-      workers = canUpdate.toArray(new AlignCalcWorkerI[0]);
-    }
-    for (AlignCalcWorkerI worker : workers)
-    {
-      if (workerClass.equals(worker.getClass()))
-      {
-        worker.updateAnnotation();
-      }
-    }
-  }
-
-  @Override
-  public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
-          Class<? extends AlignCalcWorkerI> workerClass)
-  {
-    List<AlignCalcWorkerI> workingClass = new ArrayList<>();
-    synchronized (canUpdate)
-    {
-      for (AlignCalcWorkerI worker : canUpdate)
-      {
-        if (workerClass.equals(worker.getClass()))
-        {
-          workingClass.add(worker);
-        }
-      }
-    }
-    return (workingClass.size() == 0) ? null : workingClass;
-  }
-
-  @Override
-  public void enableWorker(AlignCalcWorkerI worker)
-  {
-    synchronized (blackList)
-    {
-      blackList.remove(worker.getClass());
-    }
-  }
-
-  @Override
-  public void removeWorkersOfClass(
-          Class<? extends AlignCalcWorkerI> typeToRemove)
-  {
-    List<AlignCalcWorkerI> removable = new ArrayList<>();
-    Set<AlignCalcWorkerI> toremovannot = new HashSet<>();
-    synchronized (restartable)
-    {
-      for (AlignCalcWorkerI worker : restartable)
-      {
-        if (typeToRemove.equals(worker.getClass()))
-        {
-          removable.add(worker);
-          toremovannot.add(worker);
-        }
-      }
-      restartable.removeAll(removable);
-    }
-    synchronized (canUpdate)
-    {
-      for (AlignCalcWorkerI worker : canUpdate)
-      {
-        if (typeToRemove.equals(worker.getClass()))
-        {
-          removable.add(worker);
-          toremovannot.add(worker);
-        }
-      }
-      canUpdate.removeAll(removable);
-    }
-    // TODO: finish testing this extension
-
-    /*
-     * synchronized (inProgress) { // need to kill or mark as dead any running
-     * threads... (inProgress.get(typeToRemove)); }
-     * 
-     * if (workers == null) { return; } for (AlignCalcWorkerI worker : workers)
-     * {
-     * 
-     * if (isPending(worker)) { worker.abortAndDestroy(); startWorker(worker); }
-     * else { System.err.println("Pending exists for " + workerClass); } }
-     */
-  }
-
-  /**
-   * Deletes the worker that update the given annotation, provided it is marked
-   * as deletable.
-   */
-  @Override
-  public void removeWorkerForAnnotation(AlignmentAnnotation ann)
-  {
-    /*
-     * first just find those to remove (to avoid
-     * ConcurrentModificationException)
-     */
-    List<AlignCalcWorkerI> toRemove = new ArrayList<>();
-    for (AlignCalcWorkerI worker : restartable)
-    {
-      if (worker.involves(ann))
-      {
-        if (worker.isDeletable())
-        {
-          toRemove.add(worker);
-        }
-      }
-    }
-
-    /*
-     * remove all references to deleted workers so any references 
-     * they hold to annotation data can be garbage collected 
-     */
-    for (AlignCalcWorkerI worker : toRemove)
-    {
-      restartable.remove(worker);
-      blackList.remove(worker.getClass());
-      inProgress.remove(worker);
-      canUpdate.remove(worker);
-      synchronized (updating)
-      {
-        List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
-        if (upd != null)
-        {
-          upd.remove(worker);
-        }
-      }
-    }
-  }
-}
index c94032f..16fc467 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.workers;
 
-import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcManagerI2;
 import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignViewportI;
index 33aea90..a68f3f3 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.ws;
 
+import jalview.bin.Cache;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.WebserviceInfo;
@@ -32,6 +33,8 @@ import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.WsParamSetI;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
 
 public abstract class WSClient // implements WSMenuEntryProviderI
 {
@@ -116,7 +119,7 @@ public abstract class WSClient // implements WSMenuEntryProviderI
    * @param arguments
    */
   public WSClient(AlignFrame _alignFrame, WsParamSetI preset,
-          List<ArgumentI> arguments)
+      List<ArgumentI> arguments)
   {
     alignFrame = _alignFrame;
     this.preset = preset;
@@ -131,12 +134,12 @@ public abstract class WSClient // implements WSMenuEntryProviderI
     if (!b)
     {
       return new WebserviceInfo(WebServiceJobTitle,
-              WebServiceJobTitle + " using service hosted at "
-                      + WsURL + "\n"
-                      + (serv.getDescription() != null
-                              ? serv.getDescription()
-                              : ""),
-              false);
+          WebServiceJobTitle + " using service hosted at "
+              + WsURL + "\n"
+              + (serv.getDescription() != null
+                  ? serv.getDescription()
+                  : ""),
+          false);
     }
     return null;
   }
@@ -148,15 +151,14 @@ public abstract class WSClient // implements WSMenuEntryProviderI
    * @param editParams
    * @return
    */
-  protected boolean processParams(ServiceWithParameters sh,
-          boolean editParams)
+  protected CompletionStage<Boolean> processParams(ServiceWithParameters sh,
+      boolean editParams)
   {
     return processParams(sh, editParams, false);
   }
 
-  protected boolean processParams(ServiceWithParameters sh,
-          boolean editParams,
-          boolean adjustingExisting)
+  protected CompletionStage<Boolean> processParams(ServiceWithParameters sh,
+      boolean editParams, boolean adjustingExisting)
   {
 
     if (editParams)
@@ -165,35 +167,38 @@ public abstract class WSClient // implements WSMenuEntryProviderI
       sh.initParamStore(Desktop.getUserParameterStore());
 
       WsJobParameters jobParams = (preset == null && paramset != null
-              && paramset.size() > 0)
-                      ? new WsJobParameters((ParamDatastoreI) null, sh,
-                              (WsParamSetI) null, paramset)
-                      : new WsJobParameters((ParamDatastoreI) null, sh,
-                              preset, (List<ArgumentI>) null);
+          && paramset.size() > 0)
+              ? new WsJobParameters((ParamDatastoreI) null, sh,
+                  (WsParamSetI) null, paramset)
+              : new WsJobParameters((ParamDatastoreI) null, sh,
+                  preset, (List<ArgumentI>) null);
       if (adjustingExisting)
       {
         jobParams.setName(MessageManager
-                .getString("label.adjusting_parameters_for_calculation"));
+            .getString("label.adjusting_parameters_for_calculation"));
       }
-      if (!jobParams.showRunDialog())
-      {
-        return false; // dialog cancelled
-      }
-
-      WsParamSetI prset = jobParams.getPreset();
-      if (prset == null)
-      {
-        paramset = jobParams.isServiceDefaults() ? null
+      var stage = jobParams.showRunDialog();
+      return stage.thenApply((startJob) -> {
+        if (startJob)
+        {
+          WsParamSetI prset = jobParams.getPreset();
+          if (prset == null)
+          {
+            paramset = jobParams.isServiceDefaults() ? null
                 : jobParams.getJobParams();
-        this.preset = null;
-      }
-      else
-      {
-        this.preset = prset; // ((JabaPreset) prset).p;
-        paramset = null; // no user supplied parameters.
-      }
+            this.preset = null;
+          }
+          else
+          {
+            this.preset = prset; // ((JabaPreset) prset).p;
+            paramset = null; // no user supplied parameters.
+          }
+        }
+        return startJob;
+      });
+
     }
-    return true;
+    return CompletableFuture.completedFuture(true);
   }
 
 }
index e44381c..3123078 100644 (file)
@@ -110,42 +110,41 @@ public class MsaWSClient extends Jws2Client implements WSMenuEntryProviderI
           AlignFrame _alignFrame)
   {
     super(_alignFrame, preset, arguments);
-    if (!processParams(sh, editParams))
-    {
-      return;
-    }
-
-    if (!(sh instanceof JalviewServiceEndpointProviderI
-            && ((JalviewServiceEndpointProviderI) sh)
-                    .getEndpoint() instanceof MultipleSequenceAlignmentI))
-    {
-      // redundant at mo - but may change
-      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
-              MessageManager.formatMessage(
-                      "label.service_called_is_not_msa_service",
-                      new String[]
-                      { sh.getName() }),
-              MessageManager.getString("label.internal_jalview_error"),
-              JvOptionPane.WARNING_MESSAGE);
-
-      return;
-    }
-    serviceHandle = sh;
-    server = (MultipleSequenceAlignmentI) ((JalviewServiceEndpointProviderI) sh)
-            .getEndpoint();
-    if ((wsInfo = setWebService(sh, false)) == null)
-    {
-      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
-              .formatMessage("label.msa_service_is_unknown", new String[]
-              { sh.getName() }),
-              MessageManager.getString("label.internal_jalview_error"),
-              JvOptionPane.WARNING_MESSAGE);
-
-      return;
-    }
-
-    startMsaWSClient(altitle, msa, submitGaps, preserveOrder, seqdataset);
-
+    processParams(sh, editParams).thenAccept((startJob) -> {
+      if (!startJob)
+        return;
+      
+      if (!(sh instanceof JalviewServiceEndpointProviderI
+              && ((JalviewServiceEndpointProviderI) sh)
+                      .getEndpoint() instanceof MultipleSequenceAlignmentI))
+      {
+        // redundant at mo - but may change
+        JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
+                MessageManager.formatMessage(
+                        "label.service_called_is_not_msa_service",
+                        new String[]
+                        { sh.getName() }),
+                MessageManager.getString("label.internal_jalview_error"),
+                JvOptionPane.WARNING_MESSAGE);
+  
+        return;
+      }
+      serviceHandle = sh;
+      server = (MultipleSequenceAlignmentI) ((JalviewServiceEndpointProviderI) sh)
+              .getEndpoint();
+      if ((wsInfo = setWebService(sh, false)) == null)
+      {
+        JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
+                .formatMessage("label.msa_service_is_unknown", new String[]
+                { sh.getName() }),
+                MessageManager.getString("label.internal_jalview_error"),
+                JvOptionPane.WARNING_MESSAGE);
+  
+        return;
+      }
+  
+      startMsaWSClient(altitle, msa, submitGaps, preserveOrder, seqdataset);
+    });
   }
 
   public MsaWSClient()
index 4c807e1..aafbbab 100644 (file)
@@ -274,7 +274,6 @@ public class SeqAnnotationServiceCalcWorker extends AlignCalcWorker
     // TODO: handle job submission error reporting here.
     Cache.log.debug("Service " + service.getUri() + "\nSubmitted job ID: "
             + rslt);
-    ;
     // ///
     // otherwise, construct WsJob and any UI handlers
     running = new AnnotationWsJob();
@@ -336,7 +335,7 @@ public class SeqAnnotationServiceCalcWorker extends AlignCalcWorker
       Cache.log.debug("Ignoring exception during progress update.",
               thr);
     }
-    Cache.log.trace("Result of poll: " + running.getStatus());
+    Cache.log.debug("Result of poll: " + running.getStatus());
     
     
     if (finished)
index 6939db4..aae6f79 100644 (file)
@@ -61,8 +61,8 @@ public class SequenceAnnotationWSClient extends Jws2Client
   // dan think. Do I need to change this method to run RNAalifold through the
   // GUI
 
-  public void initSequenceAnnotationWSClient(final ServiceWithParameters sh,
-          AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
+  private void initSequenceAnnotationWSClient(final ServiceWithParameters sh,
+      AlignFrame alignFrame, final WsParamSetI preset, boolean editParams)
   {
     // dan changed! dan test. comment out if conditional
     // if (alignFrame.getViewport().getAlignment().isNucleotide())
@@ -82,74 +82,92 @@ public class SequenceAnnotationWSClient extends Jws2Client
       // columns
 
       List<AlignCalcWorkerI> clnts = alignFrame.getViewport()
-              .getCalcManager()
-              .getWorkersOfClass(SeqAnnotationServiceCalcWorker.class);
+          .getCalcManager()
+          .getWorkersOfClass(SeqAnnotationServiceCalcWorker.class);
 
-      SeqAnnotationServiceCalcWorker worker = null;
+      SeqAnnotationServiceCalcWorker tmpworker = null;
       if (clnts != null)
       {
         for (AlignCalcWorkerI _worker : clnts)
         {
-          worker = (SeqAnnotationServiceCalcWorker) _worker;
-          if (worker.hasService()
-                  && worker.getService().getClass().equals(clientClass))
+          tmpworker = (SeqAnnotationServiceCalcWorker) _worker;
+          if (tmpworker.hasService()
+              && tmpworker.getService().getClass().equals(clientClass))
           {
             break;
           }
-          worker = null;
+          tmpworker = null;
         }
       }
+      final var worker = tmpworker;
       if (worker == null)
       {
-        if (!processParams(sh, editParams))
-        {
-          return;
-        }
-        try
-        {
-          worker = new SeqAnnotationServiceCalcWorker(sh, alignFrame, this.preset,
+        processParams(sh, editParams).thenAccept((startJob) -> {
+          if (startJob)
+          {
+            final SeqAnnotationServiceCalcWorker worker_;
+            try
+            {
+              worker_ = new SeqAnnotationServiceCalcWorker(sh, alignFrame, this.preset,
                   paramset);
-        } catch (Exception x)
-        {
-          x.printStackTrace();
-          throw new Error(
+            } catch (Exception x)
+            {
+              x.printStackTrace();
+              throw new Error(
                   MessageManager.getString("error.implementation_error"),
                   x);
-        }
-        alignFrame.getViewport().getCalcManager().registerWorker(worker); // also
-                                                                          // starts
-                                                                          // the
-                                                                          // worker
+            }
+            alignFrame.getViewport().getCalcManager().registerWorker(worker_);
+                // also starts the worker
+            startSeqAnnotationWorker(sh, alignFrame, preset, editParams);
+          }
+        });
       }
       else
       {
+        WsParamSetI preset_;
         if (editParams)
         {
           paramset = worker.getArguments();
-          preset = worker.getPreset();
+          preset_ = worker.getPreset();
         }
-
-        if (!processParams(sh, editParams, true))
+        else
         {
-          return;
+          preset_ = preset;
         }
-        // reinstate worker if it was blacklisted (might have happened due to
-        // invalid parameters)
-        alignFrame.getViewport().getCalcManager().enableWorker(worker);
-        worker.updateParameters(this.preset, paramset);
+        processParams(sh, editParams, true).thenAccept((startJob) -> {
+          if (startJob)
+          {
+            // reinstate worker if it was blacklisted (might have happened due
+            // to
+            // invalid parameters)
+            alignFrame.getViewport().getCalcManager().enableWorker(worker);
+            worker.updateParameters(this.preset, paramset);
+            startSeqAnnotationWorker(sh, alignFrame, preset_, editParams);
+          }
+        });
       }
     }
+    else
+    {
+      startSeqAnnotationWorker(sh, alignFrame, preset, editParams);
+    }
+  }
+
+  private void startSeqAnnotationWorker(ServiceWithParameters sh,
+      AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
+  {
     if (!sh.isInteractiveUpdate())
     {
       // build IUPred style client. take sequences, returns annotation per
       // sequence.
-      if (!processParams(sh, editParams))
-      {
-        return;
-      }
-
-      alignFrame.getViewport().getCalcManager().startWorker(
+      processParams(sh, editParams).thenAccept((startJob) -> {
+        if (startJob)
+        {
+          alignFrame.getViewport().getCalcManager().startWorker(
               new SeqAnnotationServiceCalcWorker(sh, alignFrame, preset, paramset));
+        }
+      });
     }
   }
 
index 138b432..fa54cf0 100644 (file)
@@ -28,6 +28,7 @@ import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.ParamManager;
 import jalview.ws.params.WsParamSetI;
 import uk.ac.dundee.compbio.slivkaclient.FieldType;
+import uk.ac.dundee.compbio.slivkaclient.FileField;
 import uk.ac.dundee.compbio.slivkaclient.FormField;
 import uk.ac.dundee.compbio.slivkaclient.FormValidationException;
 import uk.ac.dundee.compbio.slivkaclient.JobState;
@@ -76,21 +77,34 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
           WsParamSetI preset, List<ArgumentI> args) throws Throwable
   {
     SlivkaForm form = service.getForm();
-    Optional<FormField> inputField = form.getFields().stream()
-            .filter(f -> f.getType() == FieldType.FILE).findFirst();
-    if (inputField.isPresent())
+    for (FormField field : form.getFields())
     {
-      StringBuilder builder = new StringBuilder();
-      for (SequenceI seq : sequences)
+      if (field.getType() == FieldType.FILE)
       {
-        builder.append(">").append(seq.getName()).append("\n")
-                .append(seq.getSequence()).append("\n");
+        FormatAdapter fa = new FormatAdapter();
+        fa.setNewlineString("\r\n");
+        FileField fileField = (FileField) field;
+        FileFormat format;
+        switch (fileField.getMediaType())
+        {
+        case "application/pfam":
+          format = FileFormat.Pfam;
+          break;
+        case "application/stockholm":
+          format = FileFormat.Stockholm;
+          break;
+        default:
+        case "application/fasta":
+          format = FileFormat.Fasta;
+          break;
+        }
+        InputStream stream = new ByteArrayInputStream(
+            fa.formatSequences(format, sequences.toArray(new SequenceI[0]))
+                .getBytes());
+        RemoteFile rf = client.uploadFile(stream, "input",
+            fileField.getMediaType());
+        form.insert(field.getName(), rf);
       }
-      InputStream stream = new ByteArrayInputStream(
-              builder.toString().getBytes());
-      RemoteFile file = client.uploadFile(stream, "input.fa",
-              "application/fasta");
-      form.insert(inputField.get().getName(), file);
     }
     if (args != null)
     {
index 9c1a412..f675f68 100644 (file)
@@ -57,7 +57,6 @@ import jalview.structure.StructureSelectionManager;
 import jalview.util.MapList;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.ViewportRanges;
-import jalview.workers.AlignCalcManager;
 
 public class AlignViewportTest
 {
@@ -330,7 +329,6 @@ public class AlignViewportTest
       {
         try
         {
-          System.out.print(((AlignCalcManager) viewport.getCalcManager()).getQueueLength());
           wait(50);
         } catch (InterruptedException e)
         {
index f0fcdba..fca61d0 100644 (file)
@@ -24,7 +24,6 @@ import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertTrue;
 
-import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcManagerI2;
 import jalview.api.AlignCalcWorkerI;
 import jalview.api.FeatureRenderer;