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