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 extends WSClient { /** * server is a WSDL2Java generated stub for an archetypal MsaWSI service. */ ext.vamsas.MuscleWS server; private boolean setWebService(String MsaWSName) { if (MsaWServices.info.containsKey(MsaWSName)) { WebServiceName = MsaWSName; String[] wsinfo = (String[]) MsaWServices.info.get(MsaWSName); WsURL = wsinfo[0]; WebServiceJobTitle = wsinfo[1]; WebServiceReference = wsinfo[2]; return true; } else { return false; } } public MsaWSClient(String MsaWSName, String altitle, SequenceI[] msa, boolean submitGaps, boolean preserveOrder) { if (setWebService(MsaWSName)==false) { JOptionPane.showMessageDialog(Desktop.desktop, "The Multiple Sequence Alignment Service named "+MsaWSName+" is unknown", "Internal Jalview Error", JOptionPane.WARNING_MESSAGE); return; } wsInfo = new jalview.gui.WebserviceInfo(WebServiceJobTitle, WebServiceReference); wsInfo.setProgressText("Alignment of "+altitle+"\nJob details\n"); // TODO: MuscleWS transmuted to generic MsaWS client MuscleWSServiceLocator loc = new MuscleWSServiceLocator(); // Default try { this.server = (MuscleWS) loc.getMuscleWS(new java.net.URL(WsURL)); } catch (Exception ex) { wsInfo.setProgressText("Serious! "+WebServiceName+" Service location failed\nfor URL :" +WsURL+"\n"+ex.getMessage()); wsInfo.setStatus(wsInfo.ERROR); ex.printStackTrace(); } MsaWSThread musclethread = new MsaWSThread(WebServiceName+" alignment of "+altitle, msa, submitGaps, preserveOrder); wsInfo.setthisService(musclethread); musclethread.start(); } protected class MsaWSThread extends Thread implements WSClientI { String ServiceName = WebServiceName; public boolean isCancellable() { return true; } String OutputHeader; vamsas.objects.simple.MsaResult result = null; vamsas.objects.simple.SequenceSet seqs = new vamsas.objects.simple. SequenceSet(); Hashtable SeqNames = null; boolean submitGaps = false,// default is to strip gaps from sequences preserveOrder = true; // and always store and recover sequence order String jobId; String alTitle; // name which will be used to form new alignment window. int allowedServerExceptions = 3; // thread dies if too many exceptions. MsaWSThread(String title, SequenceI[] msa, boolean subgaps, boolean presorder) { alTitle = title; submitGaps = subgaps; preserveOrder = presorder; OutputHeader = wsInfo.getProgressText(); SeqNames = new Hashtable(); vamsas.objects.simple.Sequence[] seqarray = new vamsas.objects.simple. Sequence[msa.length]; for (int i = 0; i < msa.length; i++) { String newname = jalview.analysis.SeqsetUtils.unique_name(i); // uniquify as we go // TODO: JBPNote: this is a ubiquitous transformation - set of jalview seq objects to vamsas sequences with name preservation SeqNames.put(newname, jalview.analysis.SeqsetUtils.SeqCharacterHash(msa[i])); seqarray[i] = new vamsas.objects.simple.Sequence(); seqarray[i].setId(newname); seqarray[i].setSeq((submitGaps) ? msa[i].getSequence() : 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) { jobId=jobsubmit.getJobId(); System.out.println(WsURL+" Job Id '"+jobId+"'"); } else { throw new Exception(jobsubmit.getJobId()); } } catch (Exception e) { System.err.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