package jalview.ws; import org.apache.axis.client.*; import javax.xml.namespace.QName; import java.util.*; import jalview.datamodel.*; import jalview.gui.*; import javax.swing.*; import java.util.*; import java.awt.*; import jalview.analysis.AlignSeq; import ext.vamsas.*; import vamsas.objects.*; public class MsaWSClient { int jobsRunning = 0; ext.vamsas.MuscleWS server; WebserviceInfo wsInfo; /** * MsaWSClient * * @param msa SequenceI[] */ public MsaWSClient(SequenceI[] msa) { wsInfo = new jalview.gui.WebserviceInfo("Muscle Alignment job", "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment with high accuracy and high throughput, Nucleic Acids Research 32(5), 1792-97."); wsInfo.setProgressText("Job details\n"); MuscleWSServiceLocator loc = new MuscleWSServiceLocator(); // Default try { this.server = (MuscleWS) loc.getMuscleWS(); // JBPNote will be set from properties } catch (Exception ex) { wsInfo.setProgressText("Serious! MuscleWS Service location failed\nfor URL :" +loc.getMuscleWSAddress()+"\n"+ex.getMessage()); ex.printStackTrace(); } MsaWSThread musclethread = new MsaWSThread(msa); wsInfo.setthisService(musclethread); musclethread.start(); } protected class MsaWSThread extends Thread implements WSClientI { String ServiceName = "MuscleWS"; public boolean isCancellable() { return true; } String OutputHeader; vamsas.objects.simple.MsaResult result = null; vamsas.objects.simple.SequenceSet seqs = new vamsas.objects.simple. SequenceSet(); String jobId; int allowedServerExceptions = 3; // thread dies if too many exceptions. MsaWSThread(SequenceI[] msa) { OutputHeader = wsInfo.getProgressText(); vamsas.objects.simple.Sequence[] seqarray = new vamsas.objects.simple. Sequence[msa.length]; for (int i = 0; i < msa.length; i++) { seqarray[i] = new vamsas.objects.simple.Sequence(); seqarray[i].setId(msa[i].getName()); seqarray[i].setSeq(AlignSeq.extractGaps("-. ", msa[i].getSequence())); } this.seqs = new vamsas.objects.simple.SequenceSet(); this.seqs.setSeqs(seqarray); } boolean jobComplete = false; public void cancelJob() { if (!jobComplete) { String cancelledMessage=""; try { vamsas.objects.simple.WsJobId cancelledJob = server.cancel(jobId); if (cancelledJob.getStatus() == 2) { // CANCELLED_JOB cancelledMessage = "Job cancelled."; wsInfo.setStatus(WebserviceInfo.STATE_CANCELLED_OK); jobComplete = true; jobsRunning--; result = null; } else if (cancelledJob.getStatus() == 3) { // VALID UNSTOPPABLE JOB cancelledMessage += "Server cannot cancel this job. just close the window.\n"; } if (cancelledJob.getJobId() != null) cancelledMessage += "[" + cancelledJob.getJobId() + "]"; cancelledMessage +="\n"; } catch (Exception exc) { cancelledMessage +="\nProblems cancelling the job : Exception received...\n"+exc+"\n"; exc.printStackTrace(); } wsInfo.setProgressText(OutputHeader + cancelledMessage+"\n"); } } public void run() { StartJob(); while (!jobComplete && (allowedServerExceptions > 0)) { try { result = server.getResult(jobId); if( result.isRunning() ) wsInfo.setStatus(WebserviceInfo.STATE_RUNNING); else if( result.isQueued() ) wsInfo.setStatus(WebserviceInfo.STATE_QUEUING); if (result.isFinished()) { parseResult(); jobComplete = true; jobsRunning--; } else { wsInfo.setProgressText(OutputHeader + "\n" + result.getStatus()); if (! (result.isJobFailed() || result.isServerError())) { Thread.sleep(5000); // System.out.println("I'm alive "+seqid+" "+jobid); } } } catch (Exception ex) { allowedServerExceptions--; wsInfo.appendProgressText("\n"+ServiceName+" Server exception!\n" + ex.getMessage()); ex.printStackTrace(); } } if (! (result!=null && (result.isJobFailed() || result.isServerError()))) wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK); else wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); } void StartJob() { try { vamsas.objects.simple.WsJobId jobsubmit = server.align(seqs); if (jobsubmit.getStatus()==1) { System.out.println(jobId=jobsubmit.getJobId()); } else { throw new Exception(jobsubmit.getJobId()); } } catch (Exception e) { System.out.println(ServiceName + " Client: Failed to submit the prediction\n" + e.toString() + "\n"); e.printStackTrace(); } } private void addFloatAnnotations(Alignment al, int[] gapmap, Vector values, String Symname, String Visname, float min, float max, int winLength) { Annotation[] annotations = new Annotation[al.getWidth()]; for (int j = 0; j < values.size(); j++) { float value = Float.parseFloat(values.get(j).toString()); annotations[gapmap[j]] = new Annotation("", value+"",' ',value); } al.addAnnotation(new AlignmentAnnotation(Symname, Visname, annotations, min, max, winLength)); } private jalview.datamodel.Sequence[] getVamsasAlignment(vamsas.objects.simple.Alignment valign) { vamsas.objects.simple.Sequence[] seqs = valign.getSeqs().getSeqs(); jalview.datamodel.Sequence[] msa = new jalview.datamodel.Sequence[seqs.length]; for (int i=0, j=seqs.length; i