From: Mateusz Warowny Date: Tue, 27 Jul 2021 15:36:15 +0000 (+0200) Subject: Merge branch 'bug/JAL-3807_jpred-with-slivka' into alpha/JAL-3066_Jalview_212_slivka... X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=eb6d7c560434c986f1dc76f6243d1493688f397e;hp=b6bd3fa646b6728cd59c8d0de91270ab6c70f86f;p=jalview.git Merge branch 'bug/JAL-3807_jpred-with-slivka' into alpha/JAL-3066_Jalview_212_slivka-integration --- diff --git a/src/jalview/api/AlignCalcManagerI.java b/src/jalview/api/AlignCalcManagerI.java deleted file mode 100644 index 005ecd7..0000000 --- a/src/jalview/api/AlignCalcManagerI.java +++ /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 . - * 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 workerClass); - - /** - * return any registered workers of the given class - * - * @param workerClass - * @return null or one or more workers of the given class - */ - List getRegisteredWorkersOfClass( - Class 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 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); -} diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 9d8407a..db6870e 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -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(); - } /** diff --git a/src/jalview/gui/WsJobParameters.java b/src/jalview/gui/WsJobParameters.java index 719b7d9..c1a925d 100644 --- a/src/jalview/gui/WsJobParameters.java +++ b/src/jalview/gui/WsJobParameters.java @@ -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 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 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 jobArgset) diff --git a/src/jalview/javascript/log4j/Logger.java b/src/jalview/javascript/log4j/Logger.java index 183328d..340e1f9 100644 --- a/src/jalview/javascript/log4j/Logger.java +++ b/src/jalview/javascript/log4j/Logger.java @@ -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)); } diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index 4aec9d2..1a08b1b 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -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 index ec80576..0000000 --- a/src/jalview/workers/AlignCalcManager.java +++ /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 . - * 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 restartable = Collections - .synchronizedList(new ArrayList()); - - /* - * types of worker _not_ to run (for example, because they have - * previously thrown errors) - */ - private final List> blackList = Collections - .synchronizedList(new ArrayList>()); - - /* - * global record of calculations in progress - */ - private final List inProgress = Collections - .synchronizedList(new ArrayList()); - - /* - * record of calculations pending or in progress in the current context - */ - private final Map, List> updating = - new Hashtable, List>(); - - /* - * workers that have run to completion so are candidates for visual-only - * update of their results - */ - private HashSet canUpdate = new HashSet<>();; - - private static boolean listContains(List 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 upd = updating.get(worker.getClass()); - if (upd == null) - { - updating.put(worker.getClass(), upd = Collections - .synchronizedList(new ArrayList())); - } - 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 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 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 workers : updating.values()) - { - for (AlignCalcWorkerI worker : workers) - { - if (worker.involves(alignmentAnnotation)) - { - return true; - } - } - } - } - return false; - } - - @Override - public void updateAnnotationFor( - Class 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 getRegisteredWorkersOfClass( - Class workerClass) - { - List 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 typeToRemove) - { - List removable = new ArrayList<>(); - Set 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 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 upd = updating.get(worker.getClass()); - if (upd != null) - { - upd.remove(worker); - } - } - } - } -} diff --git a/src/jalview/workers/AlignCalcWorker.java b/src/jalview/workers/AlignCalcWorker.java index c94032f..16fc467 100644 --- a/src/jalview/workers/AlignCalcWorker.java +++ b/src/jalview/workers/AlignCalcWorker.java @@ -20,7 +20,6 @@ */ package jalview.workers; -import jalview.api.AlignCalcManagerI; import jalview.api.AlignCalcManagerI2; import jalview.api.AlignCalcWorkerI; import jalview.api.AlignViewportI; diff --git a/src/jalview/ws/WSClient.java b/src/jalview/ws/WSClient.java index 33aea90..a68f3f3 100755 --- a/src/jalview/ws/WSClient.java +++ b/src/jalview/ws/WSClient.java @@ -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 arguments) + List 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 processParams(ServiceWithParameters sh, + boolean editParams) { return processParams(sh, editParams, false); } - protected boolean processParams(ServiceWithParameters sh, - boolean editParams, - boolean adjustingExisting) + protected CompletionStage 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) null); + && paramset.size() > 0) + ? new WsJobParameters((ParamDatastoreI) null, sh, + (WsParamSetI) null, paramset) + : new WsJobParameters((ParamDatastoreI) null, sh, + preset, (List) 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); } } diff --git a/src/jalview/ws/jws2/MsaWSClient.java b/src/jalview/ws/jws2/MsaWSClient.java index e44381c..3123078 100644 --- a/src/jalview/ws/jws2/MsaWSClient.java +++ b/src/jalview/ws/jws2/MsaWSClient.java @@ -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() diff --git a/src/jalview/ws/jws2/SeqAnnotationServiceCalcWorker.java b/src/jalview/ws/jws2/SeqAnnotationServiceCalcWorker.java index 4c807e1..aafbbab 100644 --- a/src/jalview/ws/jws2/SeqAnnotationServiceCalcWorker.java +++ b/src/jalview/ws/jws2/SeqAnnotationServiceCalcWorker.java @@ -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) diff --git a/src/jalview/ws/jws2/SequenceAnnotationWSClient.java b/src/jalview/ws/jws2/SequenceAnnotationWSClient.java index 6939db4..aae6f79 100644 --- a/src/jalview/ws/jws2/SequenceAnnotationWSClient.java +++ b/src/jalview/ws/jws2/SequenceAnnotationWSClient.java @@ -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 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)); + } + }); } } diff --git a/src/jalview/ws/slivkaws/SlivkaWSInstance.java b/src/jalview/ws/slivkaws/SlivkaWSInstance.java index 138b432..fa54cf0 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaWSInstance.java @@ -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 args) throws Throwable { SlivkaForm form = service.getForm(); - Optional 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) { diff --git a/test/jalview/gui/AlignViewportTest.java b/test/jalview/gui/AlignViewportTest.java index 9c1a412..f675f68 100644 --- a/test/jalview/gui/AlignViewportTest.java +++ b/test/jalview/gui/AlignViewportTest.java @@ -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) { diff --git a/test/jalview/workers/AlignCalcManagerTest.java b/test/jalview/workers/AlignCalcManagerTest.java index f0fcdba..fca61d0 100644 --- a/test/jalview/workers/AlignCalcManagerTest.java +++ b/test/jalview/workers/AlignCalcManagerTest.java @@ -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;