update author list in license for (JAL-826)
[jalview.git] / src / jalview / ws / dbsources / EmblXmlSource.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
10  * \r
11  * Jalview is distributed in the hope that it will be useful, but \r
12  * WITHOUT ANY WARRANTY; without even the implied warranty \r
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
14  * PURPOSE.  See the GNU General Public License for more details.\r
15  * \r
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
17  */\r
18 package jalview.ws.dbsources;\r
19 \r
20 import jalview.datamodel.Alignment;\r
21 import jalview.datamodel.AlignmentI;\r
22 import jalview.datamodel.SequenceI;\r
23 import jalview.datamodel.xdb.embl.EmblEntry;\r
24 import jalview.ws.ebi.EBIFetchClient;\r
25 \r
26 import java.io.File;\r
27 import java.util.Iterator;\r
28 import java.util.Vector;\r
29 \r
30 public abstract class EmblXmlSource extends EbiFileRetrievedProxy\r
31 {\r
32 \r
33   /**\r
34    * Last properly parsed embl file.\r
35    */\r
36   public jalview.datamodel.xdb.embl.EmblFile efile = null;\r
37 \r
38   public EmblXmlSource()\r
39   {\r
40     super();\r
41   }\r
42 \r
43   /**\r
44    * retrieve and parse an emblxml file\r
45    * \r
46    * @param emprefx\r
47    *          either EMBL or EMBLCDS strings are allowed - anything else will\r
48    *          not retrieve emblxml\r
49    * @param query\r
50    * @return\r
51    * @throws Exception\r
52    */\r
53   public AlignmentI getEmblSequenceRecords(String emprefx, String query)\r
54           throws Exception\r
55   {\r
56     startQuery();\r
57     EBIFetchClient dbFetch = new EBIFetchClient();\r
58     File reply;\r
59     try\r
60     {\r
61       reply = dbFetch.fetchDataAsFile(\r
62               emprefx.toLowerCase() + ":" + query.trim(), "emblxml", null);\r
63     } catch (Exception e)\r
64     {\r
65       stopQuery();\r
66       throw new Exception("EBI EMBL XML retrieval failed on "\r
67               + emprefx.toLowerCase() + ":" + query.trim(), e);\r
68     }\r
69     return getEmblSequenceRecords(emprefx, query, reply);\r
70   }\r
71 \r
72   /**\r
73    * parse an emblxml file stored locally\r
74    * \r
75    * @param emprefx\r
76    *          either EMBL or EMBLCDS strings are allowed - anything else will\r
77    *          not retrieve emblxml\r
78    * @param query\r
79    * @param file\r
80    *          the EMBL XML file containing the results of a query\r
81    * @return\r
82    * @throws Exception\r
83    */\r
84   public AlignmentI getEmblSequenceRecords(String emprefx, String query,\r
85           File reply) throws Exception\r
86   {\r
87     SequenceI seqs[] = null;\r
88     StringBuffer result = new StringBuffer();\r
89     if (reply != null && reply.exists())\r
90     {\r
91       efile = null;\r
92       file = reply.getAbsolutePath();\r
93       if (reply.length() > 25)\r
94       {\r
95         efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply);\r
96       }\r
97       else\r
98       {\r
99         result.append("# No EMBL record retrieved for "\r
100                 + emprefx.toLowerCase() + ":" + query.trim());\r
101       }\r
102     }\r
103     if (efile != null)\r
104     {\r
105       for (Iterator i = efile.getEntries().iterator(); i.hasNext();)\r
106       {\r
107         EmblEntry entry = (EmblEntry) i.next();\r
108         SequenceI[] seqparts = entry.getSequences(false, true, emprefx); // TODO:\r
109         // use\r
110         // !fetchNa,!fetchPeptide\r
111         // here\r
112         // instead\r
113         // -\r
114         // see\r
115         // todo\r
116         // in\r
117         // emblEntry\r
118         if (seqparts != null)\r
119         {\r
120           SequenceI[] newseqs = null;\r
121           int si = 0;\r
122           if (seqs == null)\r
123           {\r
124             newseqs = new SequenceI[seqparts.length];\r
125           }\r
126           else\r
127           {\r
128             newseqs = new SequenceI[seqs.length + seqparts.length];\r
129 \r
130             for (; si < seqs.length; si++)\r
131             {\r
132               newseqs[si] = seqs[si];\r
133               seqs[si] = null;\r
134             }\r
135           }\r
136           for (int j = 0; j < seqparts.length; si++, j++)\r
137           {\r
138             newseqs[si] = seqparts[j].deriveSequence(); // place DBReferences on\r
139             // dataset and refer\r
140           }\r
141           seqs = newseqs;\r
142 \r
143         }\r
144       }\r
145     }\r
146     else\r
147     {\r
148       result = null;\r
149     }\r
150     AlignmentI al = null;\r
151     if (seqs != null && seqs.length > 0)\r
152     {\r
153       al = new Alignment(seqs);\r
154       result.append("# Successfully parsed the " + emprefx\r
155               + " queries into an Alignment");\r
156       results = result;\r
157     }\r
158     stopQuery();\r
159     return al;\r
160   }\r
161 \r
162 }\r