JAL-2523 basic sleep and retry (3 times) on 429 response code with
[jalview.git] / src / jalview / ext / ensembl / EnsemblXref.java
index 7b5f9da..c002c08 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.ext.ensembl;
 
 import jalview.datamodel.AlignmentI;
@@ -27,20 +47,27 @@ import org.json.simple.parser.ParseException;
 class EnsemblXref extends EnsemblRestClient
 {
 
+  private static final String GO_GENE_ONTOLOGY = "GO";
+
+  private String dbName = "ENSEMBL (xref)";
+
   /**
    * Constructor given the target domain to fetch data from
    * 
    * @param d
    */
-  public EnsemblXref(String d)
+  public EnsemblXref(String d, String dbSource, String version)
   {
     super(d);
+    dbName = dbSource;
+    xrefVersion = dbSource + ":" + version;
+
   }
 
   @Override
   public String getDbName()
   {
-    return "ENSEMBL (xref)";
+    return dbName;
   }
 
   @Override
@@ -77,17 +104,14 @@ class EnsemblXref extends EnsemblRestClient
    * Calls the Ensembl xrefs REST endpoint and retrieves any cross-references
    * ("primary_id") for the given identifier (Ensembl accession id) and database
    * names. The "dbname" returned by Ensembl is canonicalised to Jalview's
-   * standard version, and a DBRefEntry constructed. If no databases are
-   * specified, all available cross-references are retrieved.
+   * standard version, and a DBRefEntry constructed. Currently takes all
+   * identifiers apart from GO terms and synonyms.
    * 
    * @param identifier
    *          an Ensembl stable identifier
-   * @param databases
-   *          optional list of Ensembl cross-referenced databases of interest
    * @return
    */
-  public List<DBRefEntry> getCrossReferences(String identifier,
-          List<String> databases)
+  public List<DBRefEntry> getCrossReferences(String identifier)
   {
     List<DBRefEntry> result = new ArrayList<DBRefEntry>();
     List<String> ids = new ArrayList<String>();
@@ -100,8 +124,11 @@ class EnsemblXref extends EnsemblRestClient
       if (url != null)
       {
         br = getHttpResponse(url, ids);
+        if (br != null)
+        {
+          result = parseResponse(br);
+        }
       }
-      return (parseResponse(br, databases));
     } catch (IOException e)
     {
       // ignore
@@ -124,17 +151,15 @@ class EnsemblXref extends EnsemblRestClient
 
   /**
    * Parses "primary_id" and "dbname" values from the JSON response and
-   * constructs a DBRefEntry if the dbname is in the list supplied. Returns a
-   * list of the DBRefEntry created. Note we don't parse "synonyms" as they
-   * appear to be either redirected or obsolete in Uniprot.
+   * constructs a DBRefEntry. Returns a list of the DBRefEntry created. Note we
+   * don't parse "synonyms" as they appear to be either redirected or obsolete
+   * in Uniprot.
    * 
    * @param br
-   * @param databases
    * @return
    * @throws IOException
    */
-  protected List<DBRefEntry> parseResponse(BufferedReader br,
-          List<String> databases)
+  protected List<DBRefEntry> parseResponse(BufferedReader br)
           throws IOException
   {
     JSONParser jp = new JSONParser();
@@ -146,17 +171,16 @@ class EnsemblXref extends EnsemblRestClient
       while (rvals.hasNext())
       {
         JSONObject val = (JSONObject) rvals.next();
-        String dbName = val.get("dbname").toString();
-        if (databases != null && !databases.isEmpty()
-                && !databases.contains(dbName))
+        String dbname = val.get("dbname").toString();
+        if (GO_GENE_ONTOLOGY.equals(dbname))
         {
           continue;
         }
         String id = val.get("primary_id").toString();
-        if (dbName != null && id != null)
+        if (dbname != null && id != null)
         {
-          dbName = DBRefUtils.getCanonicalName(dbName);
-          DBRefEntry dbref = new DBRefEntry(dbName, "0", id);
+          dbname = DBRefUtils.getCanonicalName(dbname);
+          DBRefEntry dbref = new DBRefEntry(dbname, getXRefVersion(), id);
           result.add(dbref);
         }
       }
@@ -167,6 +191,18 @@ class EnsemblXref extends EnsemblRestClient
     return result;
   }
 
+  private String xrefVersion = "ENSEMBL:0";
+
+  /**
+   * version string for Xrefs - for 2.10, hardwired for ENSEMBL:0
+   * 
+   * @return
+   */
+  public String getXRefVersion()
+  {
+    return xrefVersion;
+  }
+
   /**
    * Returns the URL for the REST endpoint to fetch all cross-references for an
    * identifier. Note this may return protein cross-references for nucleotide.