JAL-1705 use GET for single queries; set gene name as description on
[jalview.git] / src / jalview / ext / ensembl / EnsemblOverlap.java
1 package jalview.ext.ensembl;
2
3 import jalview.datamodel.Alignment;
4 import jalview.datamodel.AlignmentI;
5 import jalview.io.FeaturesFile;
6 import jalview.io.FileParse;
7
8 import java.io.IOException;
9 import java.net.MalformedURLException;
10 import java.net.URL;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 /**
15  * A client for fetching and processing Ensembl overlap data in GFF feature
16  * format
17  * 
18  * @author gmcarstairs
19  * @see http://rest.ensembl.org/documentation/info/overlap_id
20  */
21 public class EnsemblOverlap extends EnsemblRestClient
22 {
23   /*
24    * The default features to retrieve from Ensembl; can override in getSequenceRecords
25    */
26   private EnsemblFeatureType[] featuresWanted = { EnsemblFeatureType.cds,
27       EnsemblFeatureType.exon, EnsemblFeatureType.variation };
28
29   @Override
30   public String getDbName()
31   {
32     return "ENSEMBL (overlap)";
33   }
34
35   /**
36    * Makes a query to the REST overlap endpoint for the given sequence
37    * identifier. This returns an 'alignment' consisting of one 'dummy sequence'
38    * (the genomic sequence for which overlap features are returned by the
39    * service). This sequence will have on it sequence features which are the
40    * real information of interest, such as CDS regions or sequence variations.
41    */
42   @Override
43   public AlignmentI getSequenceRecords(String query) throws IOException
44   {
45     long now = System.currentTimeMillis();
46     // TODO: use a vararg String... for getSequenceRecords instead?
47     List<String> queries = new ArrayList<String>();
48     queries.add(query);
49     FileParse fp = getSequenceReader(queries);
50     FeaturesFile fr = new FeaturesFile(fp);
51     System.out.println(getClass().getName() + " took "
52             + (System.currentTimeMillis() - now) + "ms to fetch");
53     return new Alignment(fr.getSeqsAsArray());
54   }
55
56   /**
57    * Returns a URL for the REST overlap endpoint
58    * 
59    * @param ids
60    * @return
61    */
62   @Override
63   protected URL getUrl(List<String> ids) throws MalformedURLException
64   {
65     StringBuffer urlstring = new StringBuffer(128);
66     urlstring.append(ENSEMBL_REST).append("/overlap/id/")
67             .append(ids.get(0));
68
69     // @see https://github.com/Ensembl/ensembl-rest/wiki/Output-formats
70     urlstring.append("?content-type=text/x-gff3");
71
72     /*
73      * specify  features to retrieve
74      * @see http://rest.ensembl.org/documentation/info/overlap_id
75      * could make the list a configurable entry in jalview.properties
76      */
77     for (EnsemblFeatureType feature : featuresWanted)
78     {
79       urlstring.append("&feature=").append(feature.name());
80     }
81
82     return new URL(urlstring.toString());
83   }
84
85   @Override
86   protected boolean useGetRequest()
87   {
88     return true;
89   }
90
91   /**
92    * Returns the MIME type for GFF3. For GET requests the Content-type header
93    * describes the required encoding of the response.
94    */
95   @Override
96   protected String getRequestMimeType(boolean multipleIds)
97   {
98     return "text/x-gff3";
99   }
100
101   /**
102    * Returns the MIME type for GFF3.
103    */
104   @Override
105   protected String getResponseMimeType()
106   {
107     return "text/x-gff3";
108   }
109
110   /**
111    * Overloaded method that allows a list of features to retrieve to be
112    * specified
113    * 
114    * @param accId
115    * @param features
116    * @return
117    * @throws IOException
118    */
119   protected AlignmentI getSequenceRecords(String accId,
120           EnsemblFeatureType[] features) throws IOException
121   {
122     featuresWanted = features;
123     return getSequenceRecords(accId);
124   }
125 }