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