refactor abstract sequence fetching and DBSource machinery to their own package
[jalview.git] / src / jalview / ws / SequenceFetcher.java
1 package jalview.ws;\r
2 \r
3 import java.util.Enumeration;\r
4 import java.util.Hashtable;\r
5 import java.util.Vector;\r
6 \r
7 import jalview.datamodel.Alignment;\r
8 import jalview.datamodel.AlignmentI;\r
9 import jalview.datamodel.DBRefSource;\r
10 import jalview.datamodel.SequenceI;\r
11 import jalview.ws.seqfetcher.ASequenceFetcher;\r
12 import jalview.ws.seqfetcher.DbSourceProxy;\r
13 \r
14 /**\r
15  * prototype of abstract sequence retrieval interface\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     FETCHABLEDBS = new Hashtable();\r
29     FETCHABLEDBS.put(DBRefSource.EMBL,\r
30             new jalview.ws.dbsources.EmblSource());\r
31     FETCHABLEDBS.put(DBRefSource.EMBLCDS,\r
32             new jalview.ws.dbsources.EmblCdsSouce());\r
33     FETCHABLEDBS.put(DBRefSource.UNIPROT,\r
34             new jalview.ws.dbsources.Uniprot());\r
35     FETCHABLEDBS.put(DBRefSource.UP_NAME,\r
36             new jalview.ws.dbsources.Uniprot());\r
37     FETCHABLEDBS.put(DBRefSource.PDB, new jalview.ws.dbsources.Pdb());\r
38     FETCHABLEDBS.put(DBRefSource.PFAM, new jalview.ws.dbsources.Pfam());\r
39   };\r
40   \r
41   public static void main(String[] argv)\r
42   {\r
43     AlignmentI ds = null;\r
44     Vector noProds = new Vector();\r
45     if (argv != null && argv.length > 0)\r
46     {\r
47       System.out\r
48               .println("Ignoring arguments. Future Usage = dbname:query1;query2;...");\r
49     }\r
50     SequenceFetcher sfetcher = new SequenceFetcher();\r
51     Enumeration e = sfetcher.FETCHABLEDBS.keys();\r
52     while (e.hasMoreElements())\r
53     {\r
54       String db = (String) e.nextElement();\r
55       // skip me\r
56       if (db.equals(DBRefSource.PDB))\r
57         continue;\r
58       DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
59       System.out\r
60               .println("" + db + ": retrieving test:" + sp.getTestQuery());\r
61       AlignmentI al = null;\r
62       try\r
63       {\r
64         al = sp.getSequenceRecords(sp.getTestQuery());\r
65         if (al != null && al.getHeight() > 0)\r
66         {\r
67           boolean dna = sp.getDbSourceProperties().containsKey(\r
68                   DBRefSource.DNACODINGSEQDB)\r
69                   || sp.getDbSourceProperties().containsKey(\r
70                           DBRefSource.DNASEQDB)\r
71                   || sp.getDbSourceProperties().containsKey(\r
72                           DBRefSource.CODINGSEQDB);\r
73           // try and find products\r
74           String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
75                   dna, al.getSequencesArray());\r
76           if (types != null)\r
77           {\r
78             System.out.println("Xref Types for: "+(dna ? "dna" : "prot"));\r
79             for (int t = 0; t < types.length; t++)\r
80             {\r
81               System.out.println("Type: " + types[t]);\r
82               SequenceI[] prod = jalview.analysis.CrossRef.findXrefSequences(al\r
83                       .getSequencesArray(), dna, types[t]).getSequencesArray();\r
84               System.out.println("Found "\r
85                       + ((prod == null) ? "no" : "" + prod.length)\r
86                       + " products");\r
87               if (prod!=null)\r
88               {\r
89                 for (int p=0; p<prod.length; p++)\r
90                 {\r
91                   System.out.println("Prod "+p+": "+prod[p].getDisplayId(true));\r
92                 }\r
93               }\r
94             }\r
95           } else {\r
96             noProds.addElement((dna ? new Object[] { al, al } : new Object[] { al }) ); \r
97           }\r
98 \r
99         }\r
100       } catch (Exception ex)\r
101       {\r
102         System.out.println("ERROR:Failed to retrieve test query.");\r
103         ex.printStackTrace(System.out);\r
104       }\r
105       if (al == null)\r
106       {\r
107         System.out.println("ERROR:No alignment retrieved.");\r
108         StringBuffer raw = sp.getRawRecords();\r
109         if (raw != null)\r
110           System.out.println(raw.toString());\r
111         else\r
112           System.out.println("ERROR:No Raw results.");\r
113       }\r
114       else\r
115       {\r
116         System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
117         for (int s = 0; s < al.getHeight(); s++)\r
118         {\r
119           SequenceI sq = al.getSequenceAt(s);\r
120           while (sq.getDatasetSequence() != null)\r
121           {\r
122             sq = sq.getDatasetSequence();\r
123 \r
124           }\r
125           if (ds == null)\r
126           {\r
127             ds = new Alignment(new SequenceI[]\r
128             { sq });\r
129 \r
130           }\r
131           else\r
132           {\r
133             ds.addSequence(sq);\r
134           }\r
135         }\r
136       }\r
137       System.out.flush();\r
138       System.err.flush();\r
139 \r
140     }\r
141     if (noProds.size()>0)\r
142     {\r
143       Enumeration ts = noProds.elements();\r
144       while (ts.hasMoreElements())\r
145         \r
146       {\r
147         Object[] typeSq = (Object[]) ts.nextElement();\r
148         boolean dna = (typeSq.length>1);\r
149         AlignmentI al = (AlignmentI) typeSq[0];\r
150         System.out.println("Trying getProducts for "+al.getSequenceAt(0).getDisplayId(true));\r
151         System.out.println("Search DS Xref for: "+(dna ? "dna" : "prot"));\r
152         // have a bash at finding the products amongst all the retrieved sequences.\r
153         SequenceI[] prod = jalview.analysis.CrossRef.findXrefSequences(al\r
154               .getSequencesArray(), dna, null, ds).getSequencesArray(); // note should test rather than throw away codon mapping (if present)\r
155         System.out.println("Found "\r
156                 + ((prod == null) ? "no" : "" + prod.length)\r
157                 + " products");\r
158         if (prod!=null)\r
159         {\r
160           for (int p=0; p<prod.length; p++)\r
161           {\r
162             System.out.println("Prod "+p+": "+prod[p].getDisplayId(true));\r
163           }\r
164         }\r
165       }\r
166 \r
167     }\r
168   }\r
169 }\r