sequence db fetcher and db reference validation/annotation transfer
[jalview.git] / src / jalview / ws / dbsources / EmblXmlSource.java
1 package jalview.ws.dbsources;\r
2 \r
3 import jalview.datamodel.Alignment;\r
4 import jalview.datamodel.AlignmentI;\r
5 import jalview.datamodel.SequenceI;\r
6 import jalview.datamodel.xdb.embl.EmblEntry;\r
7 import jalview.ws.ebi.EBIFetchClient;\r
8 \r
9 import java.io.File;\r
10 import java.util.Iterator;\r
11 import java.util.Vector;\r
12 \r
13 public abstract class EmblXmlSource extends EbiFileRetrievedProxy\r
14 {\r
15 \r
16   /**\r
17    * Last properly parsed embl file.\r
18    */\r
19   public jalview.datamodel.xdb.embl.EmblFile efile = null;\r
20 \r
21   public EmblXmlSource()\r
22   {\r
23     super();\r
24   }\r
25   /**\r
26    * retrieve and parse an emblxml file\r
27    * @param emprefx either EMBL or EMBLCDS strings are allowed - anything else will not retrieve emblxml\r
28    * @param query\r
29    * @return\r
30    * @throws Exception\r
31    */\r
32   public AlignmentI getEmblSequenceRecords(String emprefx, String query) throws Exception\r
33   {\r
34     startQuery();\r
35     EBIFetchClient dbFetch = new EBIFetchClient();\r
36     File reply; \r
37     try {\r
38       reply = dbFetch.fetchDataAsFile(\r
39             emprefx.toLowerCase() + ":" + query.trim(),\r
40           "emblxml",null);\r
41     }\r
42     catch (Exception e)\r
43     {\r
44       stopQuery();\r
45       throw new Exception("EBI EMBL XML retrieval failed on "+emprefx.toLowerCase()+":"+query.trim(),e);\r
46     }\r
47     return getEmblSequenceRecords(emprefx, query, reply);\r
48   }\r
49   /**\r
50    * parse an emblxml file stored locally\r
51    * @param emprefx either EMBL or EMBLCDS strings are allowed - anything else will not retrieve emblxml\r
52    * @param query\r
53    * @param file the EMBL XML file containing the results of a query\r
54    * @return\r
55    * @throws Exception\r
56    */\r
57   public AlignmentI getEmblSequenceRecords(String emprefx, String query, File reply) throws Exception\r
58   {\r
59     SequenceI seqs[] = null;\r
60     StringBuffer result = new StringBuffer();\r
61     if (reply != null && reply.exists())\r
62       {\r
63         efile=null;\r
64         file = reply.getAbsolutePath();\r
65         if (reply.length()>25)\r
66         {\r
67             efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply);\r
68         } else {\r
69           result.append("# No EMBL record retrieved for "+emprefx.toLowerCase()+":"+query.trim());\r
70         }\r
71       }\r
72       if (efile!=null) {\r
73         for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) {\r
74           EmblEntry entry = (EmblEntry) i.next();\r
75           SequenceI[] seqparts = entry.getSequences(false, true, emprefx); // TODO: use !fetchNa,!fetchPeptide here instead - see todo in emblEntry\r
76           if (seqparts!=null) {\r
77             SequenceI[] newseqs = null;\r
78             int si=0;\r
79             if (seqs==null) {\r
80               newseqs = new SequenceI[seqparts.length];\r
81             } else {\r
82               newseqs  = new SequenceI[seqs.length+seqparts.length];\r
83   \r
84               for (;si<seqs.length; si++) {\r
85                 newseqs[si] = seqs[si];\r
86                 seqs[si] = null;\r
87               }\r
88             }\r
89             for (int j=0;j<seqparts.length; si++, j++) {\r
90               newseqs[si] = seqparts[j].deriveSequence(); // place DBReferences on dataset and refer\r
91             }\r
92             seqs=newseqs;\r
93   \r
94           }\r
95         }\r
96       } else {\r
97         result=null;\r
98       }\r
99     AlignmentI al =null;\r
100     if (seqs!=null && seqs.length>0)\r
101     {\r
102       al = new Alignment(seqs);\r
103       result.append("# Successfully parsed the "+emprefx+" queries into an Alignment");\r
104       results = result;\r
105     }\r
106     stopQuery();\r
107     return al;\r
108   }\r
109 \r
110 }