import jalview.datamodel.Sequence;
import jalview.gui.AlignFrame;
import jalview.gui.AlignViewport;
+import jalview.gui.Desktop;
import jalview.gui.JvSwingUtils;
import jalview.gui.WebserviceInfo;
import jalview.gui.WsJobParameters;
import jalview.ws2.ResultSupplier;
import jalview.ws2.WSJob;
import jalview.ws2.WSJobStatus;
-import jalview.ws2.WebServiceExecutor;
+import jalview.ws2.PollingTaskExecutor;
import jalview.ws2.WebServiceI;
import jalview.ws2.WebServiceInfoUpdater;
import jalview.ws2.WebServiceWorkerI;
}
@Override
+ public String getName()
+ {
+ return service.getName();
+ }
+
+ @Override
public String getTypeName()
{
return "Multiple Sequence Alignment";
}
@Override
+ public String getHostName()
+ {
+ return service.getHostName();
+ }
+
+ @Override
public int getMinSequences()
{
return 2;
{
return true;
}
+
+ @Override
+ public boolean isAlignmentAnalysis()
+ {
+ return false;
+ }
@Override
public boolean canSubmitGaps()
}
@Override
+ public boolean isInteractive()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean getFilterNonStandardSymbols()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean getNeedsAlignedSequences()
+ {
+ return false;
+ }
+
+ @Override
public MenuEntryProviderI getMenuBuilder()
{
return this::buildMenu;
final String action = submitGaps ? "Align" : "Realign";
final var calcName = service.getName();
- final AlignmentView msa = frame.gatherSequencesForAlignment();
- final AlignViewport viewport = frame.getViewport();
- final AlignmentI alignment = frame.getViewport().getAlignment();
String title = frame.getTitle();
- WebServiceExecutor executor = frame.getViewport().getWSExecutor();
+ PollingTaskExecutor executor = frame.getViewport().getWSExecutor();
{
var item = new JMenuItem(MessageManager.formatMessage(
"label.calcname_with_default_settings", calcName));
item.setToolTipText(MessageManager
.formatMessage("label.action_with_default_settings", action));
item.addActionListener((event) -> {
+ final AlignmentView msa = frame.gatherSequencesForAlignment();
+ final AlignViewport viewport = frame.getViewport();
+ final AlignmentI alignment = frame.getViewport().getAlignment();
if (msa != null)
{
WebServiceWorkerI worker = new AlignmentWorker(msa,
- Collections.emptyList(), title, submitGaps, true,
- alignment, viewport);
+ Collections.emptyList(), title, submitGaps, true,
+ alignment, viewport);
executor.submit(worker);
}
});
item.setToolTipText(MessageManager.getString(
"label.view_and_change_parameters_before_alignment"));
item.addActionListener((event) -> {
+ final AlignmentView msa = frame.gatherSequencesForAlignment();
+ final AlignViewport viewport = frame.getViewport();
+ final AlignmentI alignment = frame.getViewport().getAlignment();
if (msa != null)
{
openEditParamsDialog(service, null, null)
- .thenAcceptAsync((arguments) -> {
- if (arguments != null)
- {
- WebServiceWorkerI worker = new AlignmentWorker(msa,
- arguments, title, submitGaps, true, alignment,
- viewport);
- executor.submit(worker);
- }
- });
+ .thenAcceptAsync((arguments) -> {
+ if (arguments != null)
+ {
+ WebServiceWorkerI worker = new AlignmentWorker(msa,
+ arguments, title, submitGaps, true, alignment,
+ viewport);
+ executor.submit(worker);
+ }
+ });
}
});
parent.add(item);
preset.getDescription()));
item.setToolTipText(tooltip);
item.addActionListener((event) -> {
+ final AlignmentView msa = frame.gatherSequencesForAlignment();
+ final AlignViewport viewport = frame.getViewport();
+ final AlignmentI alignment = frame.getViewport().getAlignment();
if (msa != null)
{
WebServiceWorkerI worker = new AlignmentWorker(msa,
- preset.getArguments(), title, submitGaps, true,
- alignment, viewport);
+ preset.getArguments(), title, submitGaps, true,
+ alignment, viewport);
executor.submit(worker);
}
});
private final AlignmentI dataset;
+ private final AlignViewport viewport;
+
private final List<AlignedCodonFrame> codonFrame = new ArrayList<>();
private List<ArgumentI> args = Collections.emptyList();
this.alnTitle = alnTitle;
this.submitGaps = submitGaps;
this.preserveOrder = preserveOrder;
+ this.viewport = viewport;
this.gapCharacter = viewport.getGapCharacter();
String panelInfo = String.format("%s using service hosted at %s%n%s",
}
@Override
- public void startJobs() throws IOException
+ public void start() throws IOException
{
+ Cache.log.info(format("Starting new %s job.", service.getName()));
String outputHeader = String.format("%s of %s%nJob details%n",
submitGaps ? "Re-alignment" : "Alignment", alnTitle);
SequenceI[][] conmsa = msa.getVisibleContigs('-');
WSJob job = new WSJob(service.getProviderName(), service.getName(),
service.getHostName());
job.setJobNum(wsInfo.addJobPane());
- if (conmsa.length > 0)
+ if (conmsa.length > 1)
{
wsInfo.setProgressName(String.format("region %d", i),
job.getJobNum());
}
@Override
- public boolean pollJobs()
+ public boolean poll()
{
boolean done = true;
for (WSJob job : getJobs())
{
- if (!job.getStatus().isDone())
+ if (!job.getStatus().isDone() && !job.getStatus().isFailed())
{
Cache.log.debug(format("Polling job %s.", job));
try
Cache.log.debug(
format("Job %s status is %s", job, job.getStatus()));
}
- done &= job.getStatus().isDone();
+ done &= job.getStatus().isDone() || job.getStatus().isFailed();
}
updateWSInfoGlobalStatus();
return done;
Map<Long, AlignmentI> results = new LinkedHashMap<>();
for (WSJob job : getJobs())
{
+ if (job.getStatus().isFailed())
+ continue;
try
{
- AlignmentI alignment = supplier.getResult(job);
+ AlignmentI alignment = supplier.getResult(job, dataset.getSequences(), viewport);
if (alignment != null)
{
results.put(job.getUid(), alignment);
updateWSInfoGlobalStatus();
if (results.size() > 0)
{
- wsInfo.showResultsNewFrame
- .addActionListener(evt -> displayResults(results));
+ OutputWrapper out = prepareOutput(results);
+ wsInfo.showResultsNewFrame.addActionListener(evt -> displayNewFrame(
+ new Alignment(out.aln), out.alorders, out.hidden));
wsInfo.setResultsReady();
}
else
wsInfo.removeProgressBar(progbarId);
}
- private void displayResults(Map<Long, AlignmentI> alignments)
+ private class OutputWrapper
+ {
+ AlignmentI aln;
+
+ List<AlignmentOrder> alorders;
+
+ HiddenColumns hidden;
+
+ OutputWrapper(AlignmentI aln, List<AlignmentOrder> alorders,
+ HiddenColumns hidden)
+ {
+ this.aln = aln;
+ this.alorders = alorders;
+ this.hidden = hidden;
+ }
+ }
+
+ private OutputWrapper prepareOutput(Map<Long, AlignmentI> alignments)
{
List<AlignmentOrder> alorders = new ArrayList<>();
SequenceI[][] results = new SequenceI[jobs.size()][];
{
WSJob job = jobs.get(i);
AlignmentI aln = alignments.get(job.getUid());
- if (aln != null)
- { // equivalent of job.hasResults()
+ if (aln != null) // equivalent of job.hasResults()
+ {
/* Get the alignment including any empty sequences in the original
* order with original ids. */
JobInput input = inputs.get(job.getUid());
// temporary workaround for deuniquify
@SuppressWarnings({ "rawtypes", "unchecked" })
Hashtable names = new Hashtable(input.sequenceNames);
+ // FIXME first call to deuniquify alters original alignment
SeqsetUtils.deuniquify(names, result);
alorders.add(msaOrder);
results[i] = result;
aln.setDataset(dataset);
propagateDatasetMappings(aln);
-
- displayNewFrame(aln, alorders, hidden);
+ return new OutputWrapper(aln, alorders, hidden);
+ // displayNewFrame(aln, alorders, hidden);
}
/*
* If alignment was requested from one half of a SplitFrame, show in a
* SplitFrame with the other pane similarly aligned.
*/
+
+ Desktop.addInternalFrame(frame, alnTitle, AlignFrame.DEFAULT_WIDTH,
+ AlignFrame.DEFAULT_HEIGHT);
}
private List<List<Integer>> sortOrders(List<?> alorders)
}
else
{
- String seqString = null;
- if (seq.getEnd() >= seq.getStart()) // is it ever false?
+ String seqString = "";
+ if (seq.getEnd() >= seq.getStart()) // true if gaps only
{
seqString = seq.getSequenceAsString();
if (!submitGaps)