Formatted source
[jalview.git] / src / jalview / ws / MsaWSClient.java
index 32f5c43..b5e7938 100755 (executable)
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-*/
-
-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
-{
+*/\r
+package jalview.ws;\r
+\r
+import ext.vamsas.*;\r
+\r
+import jalview.analysis.AlignSeq;\r
+\r
+import jalview.datamodel.*;\r
+\r
+import jalview.gui.*;\r
+\r
+import org.apache.axis.client.*;\r
+\r
+import vamsas.objects.*;\r
+\r
+import java.awt.*;\r
+\r
+import java.util.*;\r
+\r
+import javax.swing.*;\r
+\r
+import javax.xml.namespace.QName;\r
+\r
+\r
+public class MsaWSClient extends WSClient {\r
     /**
-     * server is a WSDL2Java generated stub for an archetypal MsaWSI service.
-     */
-    ext.vamsas.MuscleWS server;
-    // JBPNote Nasty object-global state setting methods shouldn't be allowed
-  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;
-    }
-  }
-
-  private boolean locateWebService() {
-      // TODO: MuscleWS transmuted to generic MsaWS client
-      MuscleWSServiceLocator loc = new MuscleWSServiceLocator(); // Default
-      try {
-        this.server = (MuscleWS) loc.getMuscleWS(new java.net.URL(WsURL));
-        ((MuscleWSSoapBindingStub) this.server).setTimeout(60000); // One minute timeout
-      }
-      catch (Exception ex) {
-        wsInfo.setProgressText("Serious! "+WebServiceName+" Service location failed\nfor URL :"
-                       +WsURL+"\n"+ex.getMessage());
-        wsInfo.setStatus(wsInfo.ERROR);
-        ex.printStackTrace();
-        return false;
-      }
-      loc.getEngine().setOption("axis","1");
-      return true;
-  }
-
-  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);
-
-    if (!locateWebService())
-      return;
-
-    wsInfo.setProgressText(((submitGaps) ? "Re-alignment" : "Alignment")+" of "+altitle+"\nJob details\n");
-
-    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(jalview.util.Comparison.GapChars, msa[i].getSequence()));
-      }
-
-      this.seqs = new vamsas.objects.simple.SequenceSet();
-      this.seqs.setSeqs(seqarray);
-    }
-
-    boolean jobComplete = false;
-
-    public void cancelJob() {
-      if (jobId!=null && !jobId.equals("") && !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");
-      } else {
-        if (!jobComplete)
-        {
-          wsInfo.setProgressText(OutputHeader + "Server cannot cancel this job because it has not been submitted properly. just close the window.\n");
-        }
-      }
-    }
-
-    public void run()
-    {
-
-      StartJob();
-
-      while (!jobComplete && (allowedServerExceptions > 0))
-      {
-        try
-        {
-          if ((result = server.getResult(jobId))==null)
-            throw(new Exception("Timed out when communicating with server\nTry again later.\n"));
-
-          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
-          {
-            if (result.getStatus() != null)
-              wsInfo.setProgressText(OutputHeader + "\n" + result.getStatus());
-            if (! (result.isJobFailed() || result.isServerError()))
-            {
-              Thread.sleep(5000);
-              //  System.out.println("I'm alive "+seqid+" "+jobid);
-            }
-            else
-            {
-              break;
-            }
-          }
-        }
-        catch (Exception ex)
-        {
-          allowedServerExceptions--;
-          wsInfo.appendProgressText("\n" + ServiceName + " Server exception!\n" +
-                                    ex.getMessage());
-          System.err.println(ServiceName + " Server exception: " +
-                                    ex.getMessage());
-          //          ex.printStackTrace(); JBPNote Debug
-          try
-          {
-            if (allowedServerExceptions>0)
-              Thread.sleep(5000);
-          }
-          catch (InterruptedException ex1)
-          {
-          }
-
-        }
-      }
-      if (allowedServerExceptions == 0)
-      {
-        wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);
-      }
-      else
-      {
-        if (! (result != null && (result.isJobFailed() || result.isServerError())))
-          wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);
-        else
-        {
-          if (result.isFailed())
-            wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
-          if (result.isServerError())
-            wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);
-        }
-      }
-    }
-    void StartJob()
-    {
-      try
-      {
-        vamsas.objects.simple.WsJobId jobsubmit = server.align(seqs);
-        if (jobsubmit!=null && jobsubmit.getStatus()==1) {
-          jobId=jobsubmit.getJobId();
-          System.out.println(WsURL+" Job Id '"+jobId+"'");
-        } else {
-          if (jobsubmit == null) {
-            throw new Exception("Server at "+WsURL+" returned null object, it probably cannot be contacted. Try again later ?");
-          }
-          throw new Exception(jobsubmit.getJobId());
-        }
-      }
-      catch (Exception e)
-      {
-        // TODO: JBPNote catch timeout or other fault types explicitly
-        // For unexpected errors
-        System.err.println(WebServiceName + " Client: Failed to submit the sequences for alignment.\n"+WsURL+" : " +
-                           e.toString() + "\n");
-        this.allowedServerExceptions=0;
-        wsInfo.setStatus(wsInfo.STATE_STOPPED_SERVERERROR);
-        wsInfo.appendProgressText("Server problems! "+e.toString()+"\nFailed to submit sequences for alignment. Just close the window\n");
-        // e.printStackTrace(); // TODO: JBPNote DEBUG
-      }
-    }
-
-    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<j;i++)
-        msa[i] = new jalview.datamodel.Sequence(seqs[i].getId(), seqs[i].getSeq());
-      return msa;
-    }
-    void parseResult()
-    {
-      SequenceI[] seqs=null;
-      try {
-        // OutputHeader = output.getText();
-        if (result.isFailed()) {
-          OutputHeader +="Job failed.\n";
-        }
-        if (result.getStatus()!=null) {
-          OutputHeader += "\n"+result.getStatus();
-        }
-        if (result.getMsa()!=null) {
-          OutputHeader += "\nAlignment Object Method Notes\n";
-          String lines[] = result.getMsa().getMethod();
-          for (int line=0;line<lines.length; line++)
-            OutputHeader+=lines[line]+"\n";
-
-          // JBPNote The returned files from a webservice could be hidden behind icons in the monitor window that, when clicked, pop up their corresponding data
-          seqs = getVamsasAlignment(result.getMsa());
-        }
-
-        wsInfo.setProgressText(OutputHeader);
-        if (seqs!=null) {
-          AlignmentOrder msaorder = new AlignmentOrder(seqs);
-
-          if (preserveOrder) {
-            jalview.analysis.AlignmentSorter.recoverOrder(seqs);
-          }
-
-          jalview.analysis.SeqsetUtils.deuniquify(SeqNames, seqs);
-
-          Alignment al = new Alignment(seqs);
-
-          // TODO: JBPNote Should also rename the query sequence sometime...
-          AlignFrame af = new AlignFrame(al);
-          af.addSortByOrderMenuItem(ServiceName+" Ordering", msaorder);
-
-          Desktop.addInternalFrame(af,
-                                   alTitle,
-                                   AlignFrame.NEW_WINDOW_WIDTH,
-                                   AlignFrame.NEW_WINDOW_HEIGHT);
-        }
-      }catch(Exception ex){ex.printStackTrace();}
-
-    }
-
-  }
-}
-
-
+ * server is a WSDL2Java generated stub for an archetypal MsaWSI service.
+ */\r
+    ext.vamsas.MuscleWS server;\r
+\r
+    public MsaWSClient(String MsaWSName, String altitle, SequenceI[] msa,\r
+        boolean submitGaps, boolean preserveOrder) {\r
+        if (setWebService(MsaWSName) == false) {\r
+            JOptionPane.showMessageDialog(Desktop.desktop,\r
+                "The Multiple Sequence Alignment Service named " + MsaWSName +\r
+                " is unknown", "Internal Jalview Error",\r
+                JOptionPane.WARNING_MESSAGE);\r
+\r
+            return;\r
+        }\r
+\r
+        wsInfo = new jalview.gui.WebserviceInfo(WebServiceJobTitle,\r
+                WebServiceReference);\r
+\r
+        if (!locateWebService()) {\r
+            return;\r
+        }\r
+\r
+        wsInfo.setProgressText(((submitGaps) ? "Re-alignment" : "Alignment") +\r
+            " of " + altitle + "\nJob details\n");\r
+\r
+        MsaWSThread musclethread = new MsaWSThread(WebServiceName +\r
+                " alignment of " + altitle, msa, submitGaps, preserveOrder);\r
+        wsInfo.setthisService(musclethread);\r
+        musclethread.start();\r
+    }\r
+\r
+    // JBPNote Nasty object-global state setting methods shouldn't be allowed\r
+    private boolean setWebService(String MsaWSName) {\r
+        if (MsaWServices.info.containsKey(MsaWSName)) {\r
+            WebServiceName = MsaWSName;\r
+\r
+            String[] wsinfo = (String[]) MsaWServices.info.get(MsaWSName);\r
+            WsURL = wsinfo[0];\r
+            WebServiceJobTitle = wsinfo[1];\r
+            WebServiceReference = wsinfo[2];\r
+\r
+            return true;\r
+        } else {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    private boolean locateWebService() {\r
+        // TODO: MuscleWS transmuted to generic MsaWS client\r
+        MuscleWSServiceLocator loc = new MuscleWSServiceLocator(); // Default\r
+\r
+        try {\r
+            this.server = (MuscleWS) loc.getMuscleWS(new java.net.URL(WsURL));\r
+            ((MuscleWSSoapBindingStub) this.server).setTimeout(60000); // One minute timeout\r
+        } catch (Exception ex) {\r
+            wsInfo.setProgressText("Serious! " + WebServiceName +\r
+                " Service location failed\nfor URL :" + WsURL + "\n" +\r
+                ex.getMessage());\r
+            wsInfo.setStatus(wsInfo.ERROR);\r
+            ex.printStackTrace();\r
+\r
+            return false;\r
+        }\r
+\r
+        loc.getEngine().setOption("axis", "1");\r
+\r
+        return true;\r
+    }\r
+\r
+    protected class MsaWSThread extends Thread implements WSClientI {\r
+        String ServiceName = WebServiceName;\r
+        String OutputHeader;\r
+        vamsas.objects.simple.MsaResult result = null;\r
+        vamsas.objects.simple.SequenceSet seqs = new vamsas.objects.simple.SequenceSet();\r
+        Hashtable SeqNames = null;\r
+        boolean submitGaps = false; // and always store and recover sequence order\r
+        boolean preserveOrder = true; // and always store and recover sequence order\r
+        String jobId;\r
+        String alTitle; // name which will be used to form new alignment window.\r
+        int allowedServerExceptions = 3; // thread dies if too many exceptions.\r
+        boolean jobComplete = false;\r
+\r
+        MsaWSThread(String title, SequenceI[] msa, boolean subgaps,\r
+            boolean presorder) {\r
+            alTitle = title;\r
+            submitGaps = subgaps;\r
+            preserveOrder = presorder;\r
+\r
+            OutputHeader = wsInfo.getProgressText();\r
+            SeqNames = new Hashtable();\r
+\r
+            vamsas.objects.simple.Sequence[] seqarray = new vamsas.objects.simple.Sequence[msa.length];\r
+\r
+            for (int i = 0; i < msa.length; i++) {\r
+                String newname = jalview.analysis.SeqsetUtils.unique_name(i);\r
+\r
+                // uniquify as we go\r
+                // TODO: JBPNote: this is a ubiquitous transformation - set of jalview seq objects to vamsas sequences with name preservation\r
+                SeqNames.put(newname,\r
+                    jalview.analysis.SeqsetUtils.SeqCharacterHash(msa[i]));\r
+                seqarray[i] = new vamsas.objects.simple.Sequence();\r
+                seqarray[i].setId(newname);\r
+                seqarray[i].setSeq((submitGaps) ? msa[i].getSequence()\r
+                                                : AlignSeq.extractGaps(\r
+                        jalview.util.Comparison.GapChars, msa[i].getSequence()));\r
+            }\r
+\r
+            this.seqs = new vamsas.objects.simple.SequenceSet();\r
+            this.seqs.setSeqs(seqarray);\r
+        }\r
+\r
+        public boolean isCancellable() {\r
+            return true;\r
+        }\r
+\r
+        public void cancelJob() {\r
+            if ((jobId != null) && !jobId.equals("") && !jobComplete) {\r
+                String cancelledMessage = "";\r
+\r
+                try {\r
+                    vamsas.objects.simple.WsJobId cancelledJob = server.cancel(jobId);\r
+\r
+                    if (cancelledJob.getStatus() == 2) {\r
+                        // CANCELLED_JOB\r
+                        cancelledMessage = "Job cancelled.";\r
+                        wsInfo.setStatus(WebserviceInfo.STATE_CANCELLED_OK);\r
+                        jobComplete = true;\r
+                        jobsRunning--;\r
+                        result = null;\r
+                    } else if (cancelledJob.getStatus() == 3) {\r
+                        // VALID UNSTOPPABLE JOB\r
+                        cancelledMessage += "Server cannot cancel this job. just close the window.\n";\r
+                    }\r
+\r
+                    if (cancelledJob.getJobId() != null) {\r
+                        cancelledMessage += ("[" + cancelledJob.getJobId() +\r
+                        "]");\r
+                    }\r
+\r
+                    cancelledMessage += "\n";\r
+                } catch (Exception exc) {\r
+                    cancelledMessage += ("\nProblems cancelling the job : Exception received...\n" +\r
+                    exc + "\n");\r
+                    exc.printStackTrace();\r
+                }\r
+\r
+                wsInfo.setProgressText(OutputHeader + cancelledMessage + "\n");\r
+            } else {\r
+                if (!jobComplete) {\r
+                    wsInfo.setProgressText(OutputHeader +\r
+                        "Server cannot cancel this job because it has not been submitted properly. just close the window.\n");\r
+                }\r
+            }\r
+        }\r
+\r
+        public void run() {\r
+            StartJob();\r
+\r
+            while (!jobComplete && (allowedServerExceptions > 0)) {\r
+                try {\r
+                    if ((result = server.getResult(jobId)) == null) {\r
+                        throw (new Exception(\r
+                            "Timed out when communicating with server\nTry again later.\n"));\r
+                    }\r
+\r
+                    if (result.isRunning()) {\r
+                        wsInfo.setStatus(WebserviceInfo.STATE_RUNNING);\r
+                    } else if (result.isQueued()) {\r
+                        wsInfo.setStatus(WebserviceInfo.STATE_QUEUING);\r
+                    }\r
+\r
+                    if (result.isFinished()) {\r
+                        parseResult();\r
+                        jobComplete = true;\r
+                        jobsRunning--;\r
+                    } else {\r
+                        if (result.getStatus() != null) {\r
+                            wsInfo.setProgressText(OutputHeader + "\n" +\r
+                                result.getStatus());\r
+                        }\r
+\r
+                        if (!(result.isJobFailed() || result.isServerError())) {\r
+                            Thread.sleep(5000);\r
+\r
+                            //  System.out.println("I'm alive "+seqid+" "+jobid);\r
+                        } else {\r
+                            break;\r
+                        }\r
+                    }\r
+                } catch (Exception ex) {\r
+                    allowedServerExceptions--;\r
+                    wsInfo.appendProgressText("\n" + ServiceName +\r
+                        " Server exception!\n" + ex.getMessage());\r
+                    System.err.println(ServiceName + " Server exception: " +\r
+                        ex.getMessage());\r
+\r
+                    //          ex.printStackTrace(); JBPNote Debug\r
+                    try {\r
+                        if (allowedServerExceptions > 0) {\r
+                            Thread.sleep(5000);\r
+                        }\r
+                    } catch (InterruptedException ex1) {\r
+                    }\r
+                }\r
+            }\r
+\r
+            if (allowedServerExceptions == 0) {\r
+                wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);\r
+            } else {\r
+                if (!((result != null) &&\r
+                        (result.isJobFailed() || result.isServerError()))) {\r
+                    wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);\r
+                } else {\r
+                    if (result.isFailed()) {\r
+                        wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
+                    }\r
+\r
+                    if (result.isServerError()) {\r
+                        wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        void StartJob() {\r
+            try {\r
+                vamsas.objects.simple.WsJobId jobsubmit = server.align(seqs);\r
+\r
+                if ((jobsubmit != null) && (jobsubmit.getStatus() == 1)) {\r
+                    jobId = jobsubmit.getJobId();\r
+                    System.out.println(WsURL + " Job Id '" + jobId + "'");\r
+                } else {\r
+                    if (jobsubmit == null) {\r
+                        throw new Exception("Server at " + WsURL +\r
+                            " returned null object, it probably cannot be contacted. Try again later ?");\r
+                    }\r
+\r
+                    throw new Exception(jobsubmit.getJobId());\r
+                }\r
+            } catch (Exception e) {\r
+                // TODO: JBPNote catch timeout or other fault types explicitly\r
+                // For unexpected errors\r
+                System.err.println(WebServiceName +\r
+                    " Client: Failed to submit the sequences for alignment.\n" +\r
+                    WsURL + " : " + e.toString() + "\n");\r
+                this.allowedServerExceptions = 0;\r
+                wsInfo.setStatus(wsInfo.STATE_STOPPED_SERVERERROR);\r
+                wsInfo.appendProgressText("Server problems! " + e.toString() +\r
+                    "\nFailed to submit sequences for alignment. Just close the window\n");\r
+\r
+                // e.printStackTrace(); // TODO: JBPNote DEBUG\r
+            }\r
+        }\r
+\r
+        private void addFloatAnnotations(Alignment al, int[] gapmap,\r
+            Vector values, String Symname, String Visname, float min,\r
+            float max, int winLength) {\r
+            Annotation[] annotations = new Annotation[al.getWidth()];\r
+\r
+            for (int j = 0; j < values.size(); j++) {\r
+                float value = Float.parseFloat(values.get(j).toString());\r
+                annotations[gapmap[j]] = new Annotation("", value + "", ' ',\r
+                        value);\r
+            }\r
+\r
+            al.addAnnotation(new AlignmentAnnotation(Symname, Visname,\r
+                    annotations, min, max, winLength));\r
+        }\r
+\r
+        private jalview.datamodel.Sequence[] getVamsasAlignment(\r
+            vamsas.objects.simple.Alignment valign) {\r
+            vamsas.objects.simple.Sequence[] seqs = valign.getSeqs().getSeqs();\r
+            jalview.datamodel.Sequence[] msa = new jalview.datamodel.Sequence[seqs.length];\r
+\r
+            for (int i = 0, j = seqs.length; i < j; i++)\r
+                msa[i] = new jalview.datamodel.Sequence(seqs[i].getId(),\r
+                        seqs[i].getSeq());\r
+\r
+            return msa;\r
+        }\r
+\r
+        void parseResult() {\r
+            SequenceI[] seqs = null;\r
+\r
+            try {\r
+                // OutputHeader = output.getText();\r
+                if (result.isFailed()) {\r
+                    OutputHeader += "Job failed.\n";\r
+                }\r
+\r
+                if (result.getStatus() != null) {\r
+                    OutputHeader += ("\n" + result.getStatus());\r
+                }\r
+\r
+                if (result.getMsa() != null) {\r
+                    OutputHeader += "\nAlignment Object Method Notes\n";\r
+\r
+                    String[] lines = result.getMsa().getMethod();\r
+\r
+                    for (int line = 0; line < lines.length; line++)\r
+                        OutputHeader += (lines[line] + "\n");\r
+\r
+                    // JBPNote The returned files from a webservice could be hidden behind icons in the monitor window that, when clicked, pop up their corresponding data\r
+                    seqs = getVamsasAlignment(result.getMsa());\r
+                }\r
+\r
+                wsInfo.setProgressText(OutputHeader);\r
+\r
+                if (seqs != null) {\r
+                    AlignmentOrder msaorder = new AlignmentOrder(seqs);\r
+\r
+                    if (preserveOrder) {\r
+                        jalview.analysis.AlignmentSorter.recoverOrder(seqs);\r
+                    }\r
+\r
+                    jalview.analysis.SeqsetUtils.deuniquify(SeqNames, seqs);\r
+\r
+                    Alignment al = new Alignment(seqs);\r
+\r
+                    // TODO: JBPNote Should also rename the query sequence sometime...\r
+                    AlignFrame af = new AlignFrame(al);\r
+                    af.addSortByOrderMenuItem(ServiceName + " Ordering",\r
+                        msaorder);\r
+\r
+                    Desktop.addInternalFrame(af, alTitle,\r
+                        AlignFrame.NEW_WINDOW_WIDTH,\r
+                        AlignFrame.NEW_WINDOW_HEIGHT);\r
+                }\r
+            } catch (Exception ex) {\r
+                ex.printStackTrace();\r
+            }\r
+        }\r
+    }\r
+}\r