X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fws%2Fjws2%2FMsaWSThread.java;h=e2f3a7c14dd19bc32a84c225ec647bdf9b6fbf33;hb=99d5f1d805e530f23a53dad4484d44ecd0fbfdf3;hp=4c75756cd37a92b3490f1984940dda2c39a6048a;hpb=e3947854073b52cf92a3f924deed0fda77dc88e6;p=jalview.git
diff --git a/src/jalview/ws/jws2/MsaWSThread.java b/src/jalview/ws/jws2/MsaWSThread.java
index 4c75756..e2f3a7c 100644
--- a/src/jalview/ws/jws2/MsaWSThread.java
+++ b/src/jalview/ws/jws2/MsaWSThread.java
@@ -1,62 +1,59 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * 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.
- *
+ * 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
- * 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 @@ -129,7 +126,8 @@ class MsaWSThread extends AWS2Thread implements WSClientI if (minlen < 0) { throw new Error( - "Implementation error: minlen must be zero or more."); + MessageManager + .getString("error.implementation_error_minlen_must_be_greater_zero")); } for (int i = 0; i < seqs.length; i++) { @@ -168,8 +166,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI .extractGaps(jalview.util.Comparison.GapChars, seqs[i].getSequenceAsString()); } - emptySeqs.add(new String[] - { newname, empty }); + emptySeqs.add(new String[] { newname, empty }); } } return valid; @@ -240,7 +237,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI int ow = w, nw = w; for (i = 0, w = emptySeqs.size(); i < w; i++) { - String[] es = (String[]) emptySeqs.get(i); + String[] es = emptySeqs.get(i); if (es != null && es[1] != null) { int sw = es[1].length(); @@ -271,7 +268,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI } for (i = 0, w = emptySeqs.size(); i < w; i++) { - String[] es = (String[]) emptySeqs.get(i); + String[] es = emptySeqs.get(i); if (es[1] == null) { t_alseqs[i + alseq_l] = new jalview.datamodel.Sequence(es[0], @@ -300,8 +297,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI jalview.analysis.AlignmentSorter.recoverOrder(alseqs); // account for any missing sequences jalview.analysis.SeqsetUtils.deuniquify(SeqNames, alseqs); - return new Object[] - { alseqs, msaorder }; + return new Object[] { alseqs, msaorder }; } return null; } @@ -455,7 +451,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI * @param presorder * boolean */ - MsaWSThread(MsaWS server, String wsUrl, WebserviceInfo wsinfo, + private MsaWSThread(MsaWS server, String wsUrl, WebserviceInfo wsinfo, jalview.gui.AlignFrame alFrame, AlignmentView alview, String wsname, boolean subgaps, boolean presorder) { @@ -493,7 +489,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI SequenceI[][] conmsa = _msa.getVisibleContigs('-'); if (conmsa != null) { - int njobs = conmsa.length; + int nvalid = 0, njobs = conmsa.length; jobs = new MsaWSJob[njobs]; for (int j = 0; j < njobs; j++) { @@ -505,6 +501,10 @@ class MsaWSThread extends AWS2Thread implements WSClientI { jobs[j] = new MsaWSJob(0, conmsa[j]); } + if (((MsaWSJob) jobs[j]).hasValidInput()) + { + nvalid++; + } ((MsaWSJob) jobs[j]).preset = preset; ((MsaWSJob) jobs[j]).arguments = paramset; ((MsaWSJob) jobs[j]).alignmentProgram = wsname; @@ -515,9 +515,21 @@ class MsaWSThread extends AWS2Thread implements WSClientI } wsinfo.setProgressText(jobs[j].getJobnum(), OutputHeader); } + validInput = nvalid > 0; } } + boolean validInput = false; + + /** + * + * @return true if the thread will perform a calculation + */ + public boolean hasValidInput() + { + return validInput; + } + public boolean isCancellable() { return true; @@ -536,7 +548,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 @@ -567,6 +579,14 @@ 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) { @@ -606,7 +626,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI { StringBuffer response = j.jobProgress; long lastchunk = j.getLastChunk(); - boolean changed=false; + boolean changed = false; do { j.setLastChunk(lastchunk); @@ -614,9 +634,16 @@ class MsaWSThread extends AWS2Thread implements WSClientI .pullExecStatistics(j.getJobId(), lastchunk); if (chunk != null) { - changed=chunk.getChunk().length()>0; + 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); @@ -629,8 +656,9 @@ class MsaWSThread extends AWS2Thread implements WSClientI // boiler plate template if (!(job instanceof MsaWSJob)) { - throw new Error("StartJob(MsaWSJob) called on a WSJobInstance " - + job.getClass()); + throw new Error(MessageManager.formatMessage( + "error.implementation_error_msawbjob_called", + new String[] { job.getClass().toString() })); } MsaWSJob j = (MsaWSJob) job; if (j.isSubmitted()) @@ -648,7 +676,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI { // special case - selection consisted entirely of empty sequences... j.setjobStatus(JobStatus.FINISHED); - j.setStatus("Empty Alignment Job"); + j.setStatus(MessageManager.getString("label.empty_alignment_job")); } try { @@ -660,7 +688,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI } else if (j.hasArguments()) { - j.setJobId(server.customAlign(j.seqs,j.getJabaArguments())); + j.setJobId(server.customAlign(j.seqs, j.getJabaArguments())); } else { @@ -676,35 +704,39 @@ class MsaWSThread extends AWS2Thread implements WSClientI } else { - throw new Exception( - "Server at " - + WsUrl - + " returned null string for job id, it probably cannot be contacted. Try again later ?"); + throw new Exception(MessageManager.formatMessage( + "exception.web_service_returned_null_try_later", + new String[] { WsUrl })); } } catch (compbio.metadata.UnsupportedRuntimeException _lex) { lex = _lex; - wsInfo.appendProgressText("Job could not be run because the server doesn't support this program.\n" - + _lex.getMessage()); - wsInfo.warnUser(_lex.getMessage(), "Service not supported!"); + wsInfo.appendProgressText(MessageManager.formatMessage( + "info.job_couldnt_be_run_server_doesnt_support_program", + new String[] { _lex.getMessage() })); + wsInfo.warnUser(_lex.getMessage(), + MessageManager.getString("warn.service_not_supported")); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR); wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_SERVERERROR); } catch (compbio.metadata.LimitExceededException _lex) { lex = _lex; - wsInfo.appendProgressText("Job could not be run because it exceeded a hard limit on the server.\n" - + _lex.getMessage()); - wsInfo.warnUser(_lex.getMessage(), "Input is too big!"); + wsInfo.appendProgressText(MessageManager.formatMessage( + "info.job_couldnt_be_run_exceeded_hard_limit", + new String[] { _lex.getMessage() })); + wsInfo.warnUser(_lex.getMessage(), + MessageManager.getString("warn.input_is_too_big")); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_ERROR); } catch (compbio.metadata.WrongParameterException _lex) { lex = _lex; - wsInfo.warnUser(_lex.getMessage(), "Invalid job parameter set!"); - wsInfo.appendProgressText("Job could not be run because some of the parameter settings are not supported by the server.\n" - + _lex.getMessage() - + "\nPlease check to make sure you have used the correct parameter set for this service!\n"); + wsInfo.warnUser(_lex.getMessage(), + MessageManager.getString("warn.invalid_job_param_set")); + wsInfo.appendProgressText(MessageManager.formatMessage( + "info.job_couldnt_be_run_incorrect_param_setting", + new String[] { _lex.getMessage() })); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); wsInfo.setStatus(j.getJobnum(), WebserviceInfo.STATE_STOPPED_ERROR); } catch (Error e) @@ -737,15 +769,18 @@ class MsaWSThread extends AWS2Thread implements WSClientI // 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"); + wsInfo.appendProgressText(j.getJobnum(), MessageManager + .getString("info.failed_to_submit_sequences_for_alignment")); } } } public void parseResult() { + long progbar = System.currentTimeMillis(); + wsInfo.setProgressBar( + MessageManager.getString("status.collecting_job_results"), + progbar); int results = 0; // number of result sets received JobStateSummary finalState = new JobStateSummary(); try @@ -755,40 +790,45 @@ class MsaWSThread extends AWS2Thread implements WSClientI MsaWSJob msjob = ((MsaWSJob) jobs[j]); if (jobs[j].isFinished() && msjob.alignment == null) { - boolean jpchanged=false,jpex=false; - do { + int nunchanged = 3, nexcept = 3; + boolean jpchanged = false, jpex = false; + do + { try { jpchanged = updateJobProgress(msjob); - jpex=false; + 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(); - if (jpex) { - // give up polling after two consecutive exceptions - jpchanged=false; - } else { - jpchanged=true; - } + nexcept--; + nunchanged = 3; // set flag remember that we've had an exception. - jpex=true; + jpex = true; + jpchanged = false; } - if (jpchanged) + if (!jpchanged) { try { - Thread.sleep(jpex ? 400 : 200); // wait a bit longer if we experienced an exception. + Thread.sleep(jpex ? 2400 : 1200); // wait a bit longer if we + // experienced an exception. } catch (Exception ex) { } ; + nunchanged--; } - } while (jpchanged); - + } while (nunchanged > 0 && nexcept > 0); + if (Cache.log.isDebugEnabled()) { System.out.println("Job Execution file for job: " @@ -807,6 +847,9 @@ class MsaWSThread extends AWS2Thread implements WSClientI 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) { @@ -863,15 +906,22 @@ class MsaWSThread extends AWS2Thread implements WSClientI } else { - wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); wsInfo.setFinishedNoResults(); } + updateGlobalStatus(finalState); + wsInfo.setProgressBar(null, progbar); } + /** + * Display alignment results in a new frame (or - not currently supported - + * added to an existing alignment). + * + * @param newFrame + */ void displayResults(boolean newFrame) { // view input or result data for each block - Vector alorders = new Vector(); + List