new DBRef management and generalised source and entry retrieval mechanism for referen...
[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.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    * set this to false to *not* add protein products to alignment dataset.\r
27    */\r
28   public boolean getProteinProducts=false;\r
29   /**\r
30    * retrieve and parse an emblxml file\r
31    * @param emprefx either EMBL or EMBLCDS strings are allowed - anything else will not retrieve emblxml\r
32    * @param query\r
33    * @return\r
34    * @throws Exception\r
35    */\r
36   public AlignmentI getEmblSequenceRecords(String emprefx, String query) throws Exception\r
37   {\r
38     startQuery();\r
39     SequenceI seqs[] = null;\r
40     Vector alseq = new Vector(); // the sequences that will actually be presented in the alignment\r
41     StringBuffer result = new StringBuffer();\r
42     EBIFetchClient dbFetch = new EBIFetchClient();\r
43     File reply; \r
44     try {\r
45       reply = dbFetch.fetchDataAsFile(\r
46             emprefx.toLowerCase() + ":" + query.trim(),\r
47           "emblxml",null);\r
48     }\r
49     catch (Exception e)\r
50     {\r
51       stopQuery();\r
52       throw new Exception("EBI EMBL XML retrieval failed on "+emprefx.toLowerCase()+":"+query.trim(),e);\r
53     }\r
54     if (reply != null && reply.exists())\r
55       {\r
56         file = reply.getAbsolutePath();\r
57         efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply);\r
58       }\r
59       if (efile!=null) {\r
60         for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) {\r
61           EmblEntry entry = (EmblEntry) i.next();\r
62           SequenceI[] seqparts = entry.getSequences(false,!getProteinProducts, emprefx);\r
63           if (seqparts!=null) {\r
64             SequenceI[] newseqs = null;\r
65             int si=0;\r
66             if (seqs==null) {\r
67               newseqs = new SequenceI[seqparts.length];\r
68             } else {\r
69               newseqs  = new SequenceI[seqs.length+seqparts.length];\r
70   \r
71               for (;si<seqs.length; si++) {\r
72                 newseqs[si] = seqs[si];\r
73                 seqs[si] = null;\r
74               }\r
75             }\r
76             for (int j=0;j<seqparts.length; si++, j++) {\r
77               newseqs[si] = seqparts[j].deriveSequence(); // place DBReferences on dataset and refer\r
78             }\r
79             seqs=newseqs;\r
80   \r
81           }\r
82         }\r
83       } else {\r
84         result=null;\r
85       }\r
86     AlignmentI al =null;\r
87     if (seqs!=null && seqs.length>0)\r
88     {\r
89       al = new Alignment(seqs);\r
90       result.append("# Successfully parsed the "+emprefx+" queries into an Alignment");\r
91       results = result;\r
92     }\r
93     stopQuery();\r
94     return al;\r
95   }\r
96 \r
97 }