X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fjws2%2FMsaWSThread.java;h=08accbac5d9e91c50f7756662209b6db8020f431;hb=4272f31e9cc505f9a1496e2cd002dc9250c77928;hp=79ffa906120f445f8af301fde349a7c53c0bf002;hpb=2640ef898b186abf1abffedcb7064103f2c919e4;p=jalview.git diff --git a/src/jalview/ws/jws2/MsaWSThread.java b/src/jalview/ws/jws2/MsaWSThread.java index 79ffa90..08accba 100644 --- a/src/jalview/ws/jws2/MsaWSThread.java +++ b/src/jalview/ws/jws2/MsaWSThread.java @@ -1,27 +1,26 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) + * Copyright (C) 2014 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.ws.jws2; import java.util.*; import compbio.data.msa.MsaWS; -import compbio.data.sequence.AlignmentMetadata; -import compbio.data.sequence.Program; import compbio.metadata.Argument; import compbio.metadata.ChunkHolder; import compbio.metadata.JobStatus; @@ -34,27 +33,9 @@ import jalview.gui.*; import jalview.ws.AWsJob; import jalview.ws.WSClientI; import jalview.ws.JobStateSummary; +import jalview.ws.jws2.dm.JabaWsParamSet; +import jalview.ws.params.WsParamSetI; -/** - *

- * Title: - *

- * - *

- * Description: - *

- * - *

- * Copyright: Copyright (c) 2004 - *

- * - *

- * Company: Dundee University - *

- * - * @author not attributable - * @version 1.0 - */ class MsaWSThread extends AWS2Thread implements WSClientI { boolean submitGaps = false; // pass sequences including gaps to alignment @@ -69,7 +50,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI { long lastChunk = 0; - Preset preset = null; + WsParamSetI preset = null; List arguments = null; @@ -373,6 +354,67 @@ class MsaWSThread extends AWS2Thread implements WSClientI return alignmentProgram; } + public boolean hasArguments() + { + return (arguments != null && arguments.size() > 0) + || (preset != null && preset instanceof JabaWsParamSet); + } + + public List getJabaArguments() + { + List newargs = new ArrayList(); + if (preset != null && preset instanceof JabaWsParamSet) + { + newargs.addAll(((JabaWsParamSet) preset).getjabaArguments()); + } + if (arguments != null && arguments.size() > 0) + { + newargs.addAll(arguments); + } + return newargs; + } + + /** + * add a progess header to status string containing presets/args used + */ + public void addInitialStatus() + { + if (preset != null) + { + jobProgress.append("Using " + + (preset instanceof JabaPreset ? "Server" : "User") + + "Preset: " + preset.getName()); + if (preset instanceof JabaWsParamSet) + { + for (Argument opt : ((JabaWsParamSet) preset).getjabaArguments()) + { + jobProgress.append(opt.getName() + " " + opt.getDefaultValue() + + "\n"); + } + } + } + if (arguments != null && arguments.size() > 0) + { + jobProgress.append("With custom parameters : \n"); + // merge arguments with preset's own arguments. + for (Argument opt : arguments) + { + jobProgress.append(opt.getName() + " " + opt.getDefaultValue() + + "\n"); + } + } + jobProgress.append("\nJob Output:\n"); + } + + public boolean isPresetJob() + { + return preset != null && preset instanceof JabaPreset; + } + + public Preset getServerPreset() + { + return (isPresetJob()) ? ((JabaPreset) preset).p : null; + } } String alTitle; // name which will be used to form new alignment window. @@ -416,7 +458,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI * @param seqset * Alignment */ - MsaWSThread(MsaWS server2, Preset preset, List paramset, + MsaWSThread(MsaWS server2, WsParamSetI preset, List paramset, String wsUrl, WebserviceInfo wsinfo, jalview.gui.AlignFrame alFrame, String wsname, String title, AlignmentView _msa, boolean subgaps, boolean presorder, @@ -473,7 +515,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI try { boolean cancelledJob = server.cancelJob(jobs[job].getJobId()); - if (cancelledJob || true) + if (true) // cancelledJob || true) { // CANCELLED_JOB // if the Jaba server indicates the job can't be cancelled, its @@ -503,6 +545,11 @@ class MsaWSThread extends AWS2Thread implements WSClientI } wsInfo.setProgressText(jobs[job].getJobnum(), OutputHeader + cancelledMessage + "\n"); + } else { + // if we hadn't submitted then just mark the job as cancelled. + jobs[job].setSubjobComplete(true); + wsInfo.setStatus(jobs[job].getJobnum(), WebserviceInfo.STATE_CANCELLED_OK); + } } if (cancelled) @@ -533,10 +580,17 @@ class MsaWSThread extends AWS2Thread implements WSClientI updateJobProgress(j); } - protected void updateJobProgress(MsaWSJob j) throws Exception + /** + * + * @param j + * @return true if more job progress data was available + * @throws Exception + */ + protected boolean updateJobProgress(MsaWSJob j) throws Exception { StringBuffer response = j.jobProgress; long lastchunk = j.getLastChunk(); + boolean changed = false; do { j.setLastChunk(lastchunk); @@ -544,11 +598,20 @@ class MsaWSThread extends AWS2Thread implements WSClientI .pullExecStatistics(j.getJobId(), lastchunk); if (chunk != null) { + changed |= chunk.getChunk().length() > 0; response.append(chunk.getChunk()); lastchunk = chunk.getNextPosition(); + try + { + Thread.sleep(50); + } catch (InterruptedException x) + { + } + ; } ; } while (lastchunk >= 0 && j.getLastChunk() != lastchunk); + return changed; } public void StartJob(AWsJob job) @@ -580,21 +643,15 @@ class MsaWSThread extends AWS2Thread implements WSClientI } try { - // TODO: get the parameters (if any) for this job and submit the job - if (j.arguments != null && j.arguments.size() > 0) + j.addInitialStatus(); // list the presets/parameters used for the job in + // status + if (j.isPresetJob()) { - StringBuffer pset = new StringBuffer(); - for (Argument arg : j.arguments) - { - pset.append(arg.getName() + " " + arg.getDefaultValue() + "\n"); - } - j.setStatus("Custom Parameters:\n" + pset.toString() - + "\nJob Output:\n"); - j.setJobId(server.customAlign(j.seqs, j.arguments)); + j.setJobId(server.presetAlign(j.seqs, j.getServerPreset())); } - else if (j.preset != null) + else if (j.hasArguments()) { - j.setJobId(server.presetAlign(j.seqs, j.preset)); + j.setJobId(server.customAlign(j.seqs, j.getJabaArguments())); } else { @@ -606,6 +663,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI j.setSubmitted(true); j.setSubjobComplete(false); // System.out.println(WsURL + " Job Id '" + jobId + "'"); + return; } else { @@ -630,8 +688,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI + _lex.getMessage()); wsInfo.warnUser(_lex.getMessage(), "Input is too big!"); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); - wsInfo.setStatus(j.getJobnum(), - WebserviceInfo.STATE_STOPPED_ERROR); + wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_ERROR); } catch (compbio.metadata.WrongParameterException _lex) { lex = _lex; @@ -640,10 +697,8 @@ class MsaWSThread extends AWS2Thread implements WSClientI + _lex.getMessage() + "\nPlease check to make sure you have used the correct parameter set for this service!\n"); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); - wsInfo.setStatus(j.getJobnum(), - WebserviceInfo.STATE_STOPPED_ERROR); - } - catch (Error e) + wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_ERROR); + } catch (Error e) { // For unexpected errors System.err @@ -654,8 +709,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR); wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_SERVERERROR); - } - catch (Exception e) + } catch (Exception e) { // For unexpected errors System.err @@ -668,18 +722,23 @@ class MsaWSThread extends AWS2Thread implements WSClientI WebserviceInfo.STATE_STOPPED_SERVERERROR); } finally { - // Boilerplate code here - // TODO: JBPNote catch timeout or other fault types explicitly + if (!j.isSubmitted()) + { + // Boilerplate code here + // TODO: JBPNote catch timeout or other fault types explicitly - j.setAllowedServerExceptions(0); - wsInfo.appendProgressText(j.getJobnum(), - "Failed to submit sequences for alignment.\n" - + "Just close the window\n"); + j.setAllowedServerExceptions(0); + wsInfo.appendProgressText(j.getJobnum(), + "Failed to submit sequences for alignment.\n" + + "Just close the window\n"); + } } } public void parseResult() { + long progbar = System.currentTimeMillis(); + wsInfo.setProgressBar("Collecting job results.", progbar); int results = 0; // number of result sets received JobStateSummary finalState = new JobStateSummary(); try @@ -689,16 +748,45 @@ class MsaWSThread extends AWS2Thread implements WSClientI MsaWSJob msjob = ((MsaWSJob) jobs[j]); if (jobs[j].isFinished() && msjob.alignment == null) { - try - { - updateJobProgress(msjob); - } catch (Exception e) + int nunchanged = 3, nexcept = 3; + boolean jpchanged = false, jpex = false; + do { - Cache.log - .warn("Exception when retrieving remaining Job progress data for job " - + msjob.getJobId() + " on server " + WsUrl); - e.printStackTrace(); - } + try + { + jpchanged = updateJobProgress(msjob); + jpex = false; + if (jpchanged) + { + nexcept = 3; + } + } catch (Exception e) + { + + Cache.log + .warn("Exception when retrieving remaining Job progress data for job " + + msjob.getJobId() + " on server " + WsUrl); + e.printStackTrace(); + nexcept--; + nunchanged = 3; + // set flag remember that we've had an exception. + jpex = true; + jpchanged = false; + } + if (!jpchanged) + { + try + { + Thread.sleep(jpex ? 2400 : 1200); // wait a bit longer if we + // experienced an exception. + } catch (Exception ex) + { + } + ; + nunchanged--; + } + } while (nunchanged > 0 && nexcept > 0); + if (Cache.log.isDebugEnabled()) { System.out.println("Job Execution file for job: " @@ -710,9 +798,22 @@ class MsaWSThread extends AWS2Thread implements WSClientI try { msjob.alignment = server.getResult(msjob.getJobId()); + } catch (compbio.metadata.ResultNotAvailableException e) + { + // job has failed for some reason - probably due to invalid + // parameters + Cache.log + .debug("Results not available for finished job - marking as broken job.", + e); + msjob.jobProgress + .append("\nResult not available. Probably due to invalid input or parameter settings. Server error message below:\n\n" + + e.getLocalizedMessage()); + msjob.setjobStatus(JobStatus.FAILED); } catch (Exception e) { Cache.log.error("Couldn't get Alignment for job.", e); + // TODO: Increment count and retry ? + msjob.setjobStatus(JobStatus.UNDEFINED); } } finalState.updateJobPanelState(wsInfo, OutputHeader, jobs[j]); @@ -765,6 +866,8 @@ class MsaWSThread extends AWS2Thread implements WSClientI { wsInfo.setFinishedNoResults(); } + updateGlobalStatus(finalState); + wsInfo.setProgressBar(null, progbar); } void displayResults(boolean newFrame)