refactor abstract sequence fetching and DBSource machinery to their own package
[jalview.git] / src / jalview / ws / dbsources / Uniprot.java
1 /**\r
2  * \r
3  */\r
4 package jalview.ws.dbsources;\r
5 \r
6 import java.io.File;\r
7 import java.io.IOException;\r
8 import java.util.Enumeration;\r
9 import java.util.Hashtable;\r
10 import java.util.Vector;\r
11 \r
12 import com.stevesoft.pat.Regex;\r
13 \r
14 import jalview.datamodel.Alignment;\r
15 import jalview.datamodel.AlignmentI;\r
16 import jalview.datamodel.DBRefEntry;\r
17 import jalview.datamodel.DBRefSource;\r
18 import jalview.datamodel.PDBEntry;\r
19 import jalview.datamodel.SequenceFeature;\r
20 import jalview.datamodel.SequenceI;\r
21 import jalview.datamodel.UniprotEntry;\r
22 import jalview.io.FormatAdapter;\r
23 import jalview.io.IdentifyFile;\r
24 import jalview.ws.DBRefFetcher;\r
25 import jalview.ws.EBIFetchClient;\r
26 import jalview.ws.seqfetcher.DbSourceProxy;\r
27 import jalview.ws.seqfetcher.DbSourceProxyImpl;\r
28 \r
29 /**\r
30  * @author JimP\r
31  * \r
32  */\r
33 public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy\r
34 {\r
35   public Uniprot() {\r
36     super();\r
37     addDbSourceProperty(DBRefSource.SEQDB, DBRefSource.SEQDB);\r
38     addDbSourceProperty(DBRefSource.PROTSEQDB);\r
39     addDbSourceProperty(DBRefSource.MULTIACC);\r
40   }\r
41 \r
42   /*\r
43    * (non-Javadoc)\r
44    * \r
45    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()\r
46    */\r
47   public String getAccessionSeparator()\r
48   {\r
49     return ";";\r
50   }\r
51 \r
52   /*\r
53    * (non-Javadoc)\r
54    * \r
55    * @see jalview.ws.DbSourceProxy#getAccessionValidator()\r
56    */\r
57   public Regex getAccessionValidator()\r
58   {\r
59     return null;\r
60   }\r
61 \r
62   /*\r
63    * (non-Javadoc)\r
64    * \r
65    * @see jalview.ws.DbSourceProxy#getDbSource()\r
66    */\r
67   public String getDbSource()\r
68   {\r
69     return DBRefSource.UNIPROT;\r
70   }\r
71 \r
72   /*\r
73    * (non-Javadoc)\r
74    * \r
75    * @see jalview.ws.DbSourceProxy#getDbVersion()\r
76    */\r
77   public String getDbVersion()\r
78   {\r
79     return "0"; // we really don't know what version we're on.\r
80   }\r
81 \r
82   private EBIFetchClient ebi = null;\r
83 \r
84   /*\r
85    * (non-Javadoc)\r
86    * \r
87    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])\r
88    */\r
89   public AlignmentI getSequenceRecords(String queries) throws Exception\r
90   {\r
91     startQuery();\r
92     try\r
93     {\r
94       Alignment al=null;\r
95       ebi = new EBIFetchClient();\r
96       StringBuffer result=new StringBuffer();\r
97       File file = ebi.fetchDataAsFile("uniprot:" + queries, "xml", null);\r
98       DBRefFetcher dbref = new DBRefFetcher();\r
99       Vector entries = dbref.getUniprotEntries(file);\r
100 \r
101       if (entries != null)\r
102       {\r
103         // First, make the new sequences\r
104         Enumeration en = entries.elements();\r
105         while (en.hasMoreElements())\r
106         {\r
107           UniprotEntry entry = (UniprotEntry) en.nextElement();\r
108 \r
109           StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot");\r
110           Enumeration en2 = entry.getAccession().elements();\r
111           while (en2.hasMoreElements())\r
112           {\r
113             name.append("|");\r
114             name.append(en2.nextElement());\r
115           }\r
116           en2 = entry.getName().elements();\r
117           while (en2.hasMoreElements())\r
118           {\r
119             name.append("|");\r
120             name.append(en2.nextElement());\r
121           }\r
122 \r
123           if (entry.getProtein() != null)\r
124           {\r
125             name.append(" " + entry.getProtein().getName().elementAt(0));\r
126           }\r
127 \r
128           result.append(name + "\n"\r
129                   + entry.getUniprotSequence().getContent() + "\n");\r
130 \r
131         }\r
132 \r
133         // Then read in the features and apply them to the dataset\r
134         al = parseResult(result.toString());\r
135         if (al!=null)\r
136         {\r
137           // Decorate the alignment with database entries.\r
138           addUniprotXrefs(al, entries);\r
139         } else {\r
140           results = result;\r
141         }\r
142       }\r
143       stopQuery();\r
144       return al;\r
145     } catch (Exception e)\r
146     {\r
147       stopQuery();\r
148       throw(e);\r
149     }\r
150   }\r
151 \r
152   /**\r
153    * add an ordered set of UniprotEntry objects to an ordered set of seuqences.\r
154    * \r
155    * @param al -\r
156    *          a sequence of n sequences\r
157    * @param entries\r
158    *          a seuqence of n uniprot entries to be analysed.\r
159    */\r
160   public void addUniprotXrefs(Alignment al, Vector entries)\r
161   {\r
162     for (int i = 0; i < entries.size(); i++)\r
163     {\r
164       UniprotEntry entry = (UniprotEntry) entries.elementAt(i);\r
165       Enumeration e = entry.getDbReference().elements();\r
166       Vector onlyPdbEntries = new Vector();\r
167       while (e.hasMoreElements())\r
168       {\r
169         PDBEntry pdb = (PDBEntry) e.nextElement();\r
170         if (!pdb.getType().equals("PDB"))\r
171         {\r
172           continue;\r
173         }\r
174 \r
175         onlyPdbEntries.addElement(pdb);\r
176       }\r
177       SequenceI sq = al.getSequenceAt(i);\r
178       while (sq.getDatasetSequence()!=null)\r
179       {\r
180         sq = sq.getDatasetSequence();\r
181       }\r
182 \r
183       Enumeration en2 = entry.getAccession().elements();\r
184       while (en2.hasMoreElements())\r
185       {\r
186         sq.addDBRef(\r
187                 new DBRefEntry(getDbSource(), getDbVersion(), en2.nextElement()\r
188                         .toString()));\r
189       }\r
190       sq.setPDBId(onlyPdbEntries);\r
191       if (entry.getFeature() != null)\r
192       {\r
193         e = entry.getFeature().elements();\r
194         while (e.hasMoreElements())\r
195         {\r
196           SequenceFeature sf = (SequenceFeature) e.nextElement();\r
197           sf.setFeatureGroup("Uniprot");\r
198           sq.addSequenceFeature(sf);\r
199         }\r
200       }\r
201     }\r
202   }\r
203 \r
204   /*\r
205    * (non-Javadoc)\r
206    * \r
207    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)\r
208    */\r
209   public boolean isValidReference(String accession)\r
210   {\r
211     return true;\r
212   }\r
213   /**\r
214    * return LDHA_CHICK uniprot entry\r
215    */\r
216   public String getTestQuery()\r
217   {\r
218     return "P00340";\r
219   }\r
220 }\r