refactored ebi soap client and AbstractSequenceFetcher machinery to their own packages.
[jalview.git] / src / jalview / ws / SequenceFetcher.java
1 package jalview.ws;\r
2 \r
3 import java.util.Enumeration;\r
4 import java.util.Vector;\r
5 \r
6 import jalview.datamodel.Alignment;\r
7 import jalview.datamodel.AlignmentI;\r
8 import jalview.datamodel.DBRefSource;\r
9 import jalview.datamodel.SequenceI;\r
10 import jalview.ws.seqfetcher.ASequenceFetcher;\r
11 import jalview.ws.seqfetcher.DbSourceProxy;\r
12 \r
13 /**\r
14  * This is the the concrete implementation of the sequence retrieval interface\r
15  * and abstract class in jalview.ws.seqfetcher. This implements the discovery \r
16  * \r
17  */\r
18 public class SequenceFetcher extends ASequenceFetcher\r
19 {\r
20   /**\r
21    * Thread safe construction of database proxies TODO: extend to a configurable\r
22    * database plugin mechanism where classes are instantiated by reflection and\r
23    * queried for their DbRefSource and version association.\r
24    * \r
25    */\r
26   public SequenceFetcher()\r
27   {\r
28     addDBRefSourceImpl(jalview.ws.dbsources.EmblSource.class);\r
29     addDBRefSourceImpl(jalview.ws.dbsources.EmblCdsSouce.class);\r
30     addDBRefSourceImpl(jalview.ws.dbsources.Uniprot.class);\r
31     addDBRefSourceImpl(jalview.ws.dbsources.UnprotName.class);\r
32     addDBRefSourceImpl(jalview.ws.dbsources.Pdb.class);\r
33     addDBRefSourceImpl(jalview.ws.dbsources.Pfam.class);\r
34   };\r
35 \r
36   public static void main(String[] argv)\r
37   {\r
38     AlignmentI ds = null;\r
39     Vector noProds = new Vector();\r
40     if (argv != null && argv.length > 0)\r
41     {\r
42       System.out\r
43               .println("Ignoring arguments. Future Usage = dbname:query1;query2;...");\r
44     }\r
45     ASequenceFetcher sfetcher = new SequenceFetcher();\r
46     String[] dbSources = sfetcher.getSupportedDb();\r
47     for (int dbsource=0; dbsource<dbSources.length;dbsource++)\r
48     {\r
49       String db = dbSources[dbsource];\r
50       // skip me\r
51       if (db.equals(DBRefSource.PDB))\r
52         continue;\r
53       DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
54       System.out\r
55               .println("" + db + ": retrieving test:" + sp.getTestQuery());\r
56       AlignmentI al = null;\r
57       try\r
58       {\r
59         al = sp.getSequenceRecords(sp.getTestQuery());\r
60         if (al != null && al.getHeight() > 0)\r
61         {\r
62           boolean dna = sp.getDbSourceProperties().containsKey(\r
63                   DBRefSource.DNACODINGSEQDB)\r
64                   || sp.getDbSourceProperties().containsKey(\r
65                           DBRefSource.DNASEQDB)\r
66                   || sp.getDbSourceProperties().containsKey(\r
67                           DBRefSource.CODINGSEQDB);\r
68           // try and find products\r
69           String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
70                   dna, al.getSequencesArray());\r
71           if (types != null)\r
72           {\r
73             System.out.println("Xref Types for: " + (dna ? "dna" : "prot"));\r
74             for (int t = 0; t < types.length; t++)\r
75             {\r
76               System.out.println("Type: " + types[t]);\r
77               SequenceI[] prod = jalview.analysis.CrossRef\r
78                       .findXrefSequences(al.getSequencesArray(), dna,\r
79                               types[t]).getSequencesArray();\r
80               System.out.println("Found "\r
81                       + ((prod == null) ? "no" : "" + prod.length)\r
82                       + " products");\r
83               if (prod != null)\r
84               {\r
85                 for (int p = 0; p < prod.length; p++)\r
86                 {\r
87                   System.out.println("Prod " + p + ": "\r
88                           + prod[p].getDisplayId(true));\r
89                 }\r
90               }\r
91             }\r
92           }\r
93           else\r
94           {\r
95             noProds.addElement((dna ? new Object[]\r
96             { al, al } : new Object[]\r
97             { al }));\r
98           }\r
99 \r
100         }\r
101       } catch (Exception ex)\r
102       {\r
103         System.out.println("ERROR:Failed to retrieve test query.");\r
104         ex.printStackTrace(System.out);\r
105       }\r
106       if (al == null)\r
107       {\r
108         System.out.println("ERROR:No alignment retrieved.");\r
109         StringBuffer raw = sp.getRawRecords();\r
110         if (raw != null)\r
111           System.out.println(raw.toString());\r
112         else\r
113           System.out.println("ERROR:No Raw results.");\r
114       }\r
115       else\r
116       {\r
117         System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
118         for (int s = 0; s < al.getHeight(); s++)\r
119         {\r
120           SequenceI sq = al.getSequenceAt(s);\r
121           while (sq.getDatasetSequence() != null)\r
122           {\r
123             sq = sq.getDatasetSequence();\r
124 \r
125           }\r
126           if (ds == null)\r
127           {\r
128             ds = new Alignment(new SequenceI[]\r
129             { sq });\r
130 \r
131           }\r
132           else\r
133           {\r
134             ds.addSequence(sq);\r
135           }\r
136         }\r
137       }\r
138       System.out.flush();\r
139       System.err.flush();\r
140 \r
141     }\r
142     if (noProds.size() > 0)\r
143     {\r
144       Enumeration ts = noProds.elements();\r
145       while (ts.hasMoreElements())\r
146 \r
147       {\r
148         Object[] typeSq = (Object[]) ts.nextElement();\r
149         boolean dna = (typeSq.length > 1);\r
150         AlignmentI al = (AlignmentI) typeSq[0];\r
151         System.out.println("Trying getProducts for "\r
152                 + al.getSequenceAt(0).getDisplayId(true));\r
153         System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot"));\r
154         // have a bash at finding the products amongst all the retrieved\r
155         // sequences.\r
156         SequenceI[] seqs = al.getSequencesArray();\r
157         Alignment prodal = jalview.analysis.CrossRef.findXrefSequences(\r
158                 seqs, dna, null, ds);\r
159         System.out.println("Found "\r
160                 + ((prodal == null) ? "no" : "" + prodal.getHeight()) + " products");\r
161         if (prodal != null)\r
162         {\r
163           SequenceI[] prod = prodal.getSequencesArray(); // note\r
164           // should\r
165           // test\r
166           // rather\r
167           // than\r
168           // throw\r
169           // away\r
170           // codon\r
171           // mapping\r
172           // (if\r
173           // present)\r
174             for (int p = 0; p < prod.length; p++)\r
175           {\r
176             System.out.println("Prod " + p + ": "\r
177                     + prod[p].getDisplayId(true));\r
178           }\r
179         }\r
180       }\r
181 \r
182     }\r
183   }\r
184 }\r