+/*\r
+* Jalview - A Sequence Alignment Editor and Viewer\r
+* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+*\r
+* This program is free software; you can redistribute it and/or\r
+* modify it under the terms of the GNU General Public License\r
+* as published by the Free Software Foundation; either version 2\r
+* of the License, or (at your option) any later version.\r
+*\r
+* This program is distributed in the hope that it will be useful,\r
+* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+* GNU General Public License for more details.\r
+*\r
+* You should have received a copy of the GNU General Public License\r
+* along with this program; if not, write to the Free Software\r
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
+*/\r
package jalview.io;\r
\r
-import org.apache.axis.client.*;\r
-import javax.xml.namespace.QName;\r
-import java.util.*;\r
import jalview.datamodel.*;\r
+\r
import jalview.gui.*;\r
+\r
+import org.apache.axis.client.*;\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
+/**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
public class WSWUBlastClient\r
{\r
- CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
-\r
- public WSWUBlastClient(AlignmentI al, ArrayList ids)\r
- {\r
- JInternalFrame frame = new JInternalFrame();\r
- cap.formatForOutput();\r
- frame.setContentPane(cap);\r
- cap.setText("To display sequence features an exact Uniprot id with 100% sequence identity match must be entered."\r
- +"\nIn order to display these features, try changing the names of your sequences to the ids suggested below.");\r
- Desktop.addInternalFrame(frame, "BLASTing for unidentified sequences ", 800,300);\r
-\r
- for(int i=0; i<ids.size(); i++)\r
- {\r
- SequenceI sequence = al.findName( ids.get(i).toString() );\r
- StringBuffer nonGapped = new StringBuffer();\r
- for (int n = 0; n < sequence.getSequence().length(); n++)\r
- {\r
- if (!jalview.util.Comparison.isGap(sequence.getCharAt(n)))\r
- nonGapped.append(sequence.getCharAt(n));\r
- }\r
-\r
- BlastThread thread = new BlastThread(ids.get(i).toString(), nonGapped.toString());\r
- thread.start();\r
- }\r
-\r
- }\r
-\r
- class BlastThread extends Thread\r
- {\r
- String sequence;\r
- String id;\r
- BlastThread(String id, String sequence)\r
+ CutAndPasteTransfer output = new CutAndPasteTransfer();\r
+ int jobsRunning = 0;\r
+\r
+ /**\r
+ * Creates a new WSWUBlastClient object.\r
+ *\r
+ * @param al DOCUMENT ME!\r
+ * @param ids DOCUMENT ME!\r
+ */\r
+ public WSWUBlastClient(AlignmentI al, ArrayList ids)\r
{\r
- this.sequence = sequence;\r
- this.id = id;\r
+ output.setText(\r
+ "To display sequence features an exact Uniprot id with 100% sequence identity match must be entered." +\r
+ "\nIn order to display these features, try changing the names of your sequences to the ids suggested below.");\r
+ Desktop.addInternalFrame(output,\r
+ "BLASTing for unidentified sequences ", 800, 300);\r
+\r
+ for (int i = 0; i < ids.size(); i++)\r
+ {\r
+ SequenceI sequence = al.findName(ids.get(i).toString());\r
+ StringBuffer nonGapped = new StringBuffer();\r
+\r
+ for (int n = 0; n < sequence.getSequence().length(); n++)\r
+ {\r
+ if (!jalview.util.Comparison.isGap(sequence.getCharAt(n)))\r
+ {\r
+ nonGapped.append(sequence.getCharAt(n));\r
+ }\r
+ }\r
+\r
+ BlastThread thread = new BlastThread(ids.get(i).toString(),\r
+ nonGapped.toString());\r
+ thread.start();\r
+ jobsRunning++;\r
+ }\r
+\r
+ ImageTwirler thread = new ImageTwirler();\r
+ thread.start();\r
}\r
\r
- public void run()\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param id1 DOCUMENT ME!\r
+ * @param res DOCUMENT ME!\r
+ */\r
+ void parseResult(String id1, String res)\r
{\r
- FindUniprotIDFromUnknownSequence(id, sequence);\r
- }\r
- }\r
-\r
- public void FindUniprotIDFromUnknownSequence (String id, String s)\r
- {\r
- HashMap params = new HashMap();\r
- params.put("database", "uniprot");\r
- params.put("sensitivity","low");\r
- params.put("sort","totalscore");\r
- params.put("matrix","pam10");\r
- params.put("program","blastp");\r
- params.put("alignments","5");\r
- params.put("outformat","xml");\r
- byte[] sequence = s.getBytes();\r
-\r
- try {\r
- Call call = (Call) new Service().createCall();\r
- call.setTargetEndpointAddress (new java.net.URL("http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast"));\r
- call.setOperationName(new QName("WSWUBlast", "doWUBlast"));\r
-\r
- String result = (String) call.invoke(new Object[] {params,sequence});\r
- parseResult(id, result);\r
+ StringTokenizer st = new StringTokenizer(res, "\n");\r
+ String data;\r
+ String id2;\r
+ int maxFound = 90;\r
+ StringBuffer buffer = new StringBuffer("\n\n" + id1 + " :");\r
+\r
+ while (st.hasMoreTokens())\r
+ {\r
+ data = st.nextToken();\r
+\r
+ if (data.indexOf("database=\"uniprot\" id=") > -1)\r
+ {\r
+ int index = data.indexOf("database=\"uniprot\" id=") + 23;\r
+ id2 = data.substring(index, data.indexOf("\"", index));\r
+\r
+ while (data.indexOf("</alignment>") == -1)\r
+ {\r
+ data = st.nextToken();\r
+\r
+ if (data.indexOf("<identity>") > -1)\r
+ {\r
+ int value = Integer.parseInt(data.substring(data.indexOf(\r
+ "<identity>") + 10,\r
+ data.indexOf("</identity>")));\r
+\r
+ if (value >= maxFound)\r
+ {\r
+ maxFound = value;\r
+ buffer.append(" " + id2 + " " + value + "%; ");\r
+ }\r
+ }\r
+ }\r
}\r
- catch (Exception exp) {\r
- System.err.println ("ERROR:\n" + exp.toString());\r
- exp.printStackTrace();\r
}\r
+\r
+ output.setText(output.getText() + buffer.toString());\r
}\r
\r
- void parseResult(String id1, String res)\r
+ class ImageTwirler extends Thread\r
{\r
- StringTokenizer st = new StringTokenizer(res, "\n");\r
- String data;\r
- String id2;\r
- int maxFound = 90;\r
- StringBuffer buffer = new StringBuffer("\n\n"+id1+" :");\r
+ ImageIcon[] imageIcon;\r
+ int imageIndex = 0;\r
+\r
+ public ImageTwirler()\r
+ {\r
+ imageIcon = new ImageIcon[9];\r
\r
- while( st.hasMoreTokens() )\r
- {\r
- data = st.nextToken();\r
+ for (int i = 0; i < 9; i++)\r
+ {\r
+ java.net.URL url = getClass().getResource("/images/dna" +\r
+ (i + 1) + ".gif");\r
+\r
+ if (url != null)\r
+ {\r
+ imageIcon[i] = new ImageIcon(url);\r
+ }\r
+ }\r
+ }\r
\r
- if(data.indexOf("database=\"uniprot\" id=")>-1)\r
+ public void run()\r
{\r
- int index = data.indexOf("database=\"uniprot\" id=")+ 23;\r
- id2 = data.substring( index, data.indexOf("\"", index) );\r
- while( data.indexOf("</alignment>")==-1)\r
- {\r
- data = st.nextToken();\r
- if(data.indexOf("<identity>")>-1)\r
+ while (jobsRunning > 0)\r
{\r
- int value = Integer.parseInt( data.substring(data.indexOf("<identity>")+10, data.indexOf("</identity>")));\r
- if(value>=maxFound)\r
- {\r
- maxFound = value;\r
- buffer.append(" "+ id2 + " " + value+"%; ");\r
- }\r
+ try\r
+ {\r
+ Thread.sleep(100);\r
+ imageIndex++;\r
+ imageIndex %= 9;\r
+ output.setFrameIcon(imageIcon[imageIndex]);\r
+ output.setTitle("BLASTing for unidentified sequences - " +\r
+ jobsRunning + " jobs running.");\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ }\r
}\r
- }\r
+ }\r
+ }\r
+\r
+ class BlastThread extends Thread\r
+ {\r
+ String sequence;\r
+ String seqid;\r
+ String jobid;\r
+ boolean jobComplete = false;\r
+\r
+ BlastThread(String id, String sequence)\r
+ {\r
+ this.sequence = sequence;\r
+ seqid = id;\r
+ }\r
\r
+ public void run()\r
+ {\r
+ StartJob();\r
+\r
+ while (!jobComplete)\r
+ {\r
+ try\r
+ {\r
+ Call call = (Call) new Service().createCall();\r
+ call.setTargetEndpointAddress(new java.net.URL(\r
+ "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast"));\r
+ call.setOperationName(new QName("WSWUBlast", "polljob"));\r
+\r
+ String result = (String) call.invoke(new Object[]\r
+ {\r
+ jobid, "xml"\r
+ });\r
+\r
+ if ((result.indexOf("JOB PENDING") == -1) &&\r
+ (result.indexOf("JOB RUNNING") == -1))\r
+ {\r
+ parseResult(seqid, result);\r
+ jobComplete = true;\r
+ jobsRunning--;\r
+ }\r
+\r
+ Thread.sleep(5000);\r
+\r
+ // System.out.println("WSWuBlastClient: I'm alive "+seqid+" "+jobid); // log.debug\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ }\r
+ }\r
}\r
\r
+ void StartJob()\r
+ {\r
+ HashMap params = new HashMap();\r
+ params.put("database", "uniprot");\r
+ params.put("sensitivity", "low");\r
+ params.put("sort", "totalscore");\r
+ params.put("matrix", "pam10");\r
+ params.put("program", "blastp");\r
+ params.put("alignments", "5");\r
+ params.put("outformat", "xml");\r
+ params.put("searchtype", "1");\r
\r
- }\r
+ byte[] seqbytes = sequence.getBytes();\r
\r
- cap.setText(cap.getText()+buffer.toString());\r
- }\r
+ try\r
+ {\r
+ Call call = (Call) new Service().createCall();\r
+ call.setTargetEndpointAddress(new java.net.URL(\r
+ "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast"));\r
+ call.setOperationName(new QName("WSWUBlast", "doWUBlast"));\r
\r
+ String result = (String) call.invoke(new Object[]\r
+ {\r
+ params, seqbytes\r
+ });\r
+ jobid = result;\r
+ System.out.println(\r
+ "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast JobId '" +\r
+ jobid + "'");\r
+ }\r
+ catch (Exception exp)\r
+ {\r
+ System.err.println("WSWUBlastClient error:\n" + exp.toString());\r
+ exp.printStackTrace();\r
+ }\r
+ }\r
+ }\r
}\r