JAL-1705 refactored cross-reference fetching (CCDS, Uniprot, PDB)
[jalview.git] / src / jalview / ext / ensembl / EnsemblXref.java
index 6a4f369..36bd7c5 100644 (file)
@@ -60,15 +60,16 @@ public 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
-   * name. The "dbname" returned by Ensembl is canonicalised to Jalview's
-   * standard version, and a DBRefEntry constructed.
+   * 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.
    * 
    * @param identifier
-   * @param database
+   * @param databases
    * @return
    */
   public List<DBRefEntry> getCrossReferences(String identifier,
-          String... database)
+          List<String> databases)
   {
     List<DBRefEntry> result = new ArrayList<DBRefEntry>();
     List<String> ids = new ArrayList<String>();
@@ -77,22 +78,12 @@ public class EnsemblXref extends EnsemblRestClient
     BufferedReader br = null;
     try
     {
-      for (String db : database)
-      {
-        URL url = getUrl(identifier, db);
+      URL url = getUrl(identifier);
         if (url != null)
         {
           br = getHttpResponse(url, ids);
         }
-        for (DBRefEntry xref : parseResponse(br))
-        {
-          if (!result.contains(xref))
-          {
-            result.add(xref);
-          }
-        }
-        br.close();
-      }
+      return (parseResponse(br, databases));
     } catch (IOException e)
     {
       // ignore
@@ -114,14 +105,17 @@ public class EnsemblXref extends EnsemblRestClient
   }
 
   /**
-   * Parses "primary_id" and "dbname" values from the JSON response and returns
-   * a list of DBRefEntry constructed.
+   * 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 DBRefEntry created.
    * 
    * @param br
+   * @param databases
    * @return
    * @throws IOException
    */
-  protected List<DBRefEntry> parseResponse(BufferedReader br)
+  protected List<DBRefEntry> parseResponse(BufferedReader br,
+          List<String> databases)
           throws IOException
   {
     JSONParser jp = new JSONParser();
@@ -134,6 +128,11 @@ public class EnsemblXref extends EnsemblRestClient
       {
         JSONObject val = (JSONObject) rvals.next();
         String dbName = val.get("dbname").toString();
+        if (databases != null && !databases.isEmpty()
+                && !databases.contains(dbName))
+        {
+          continue;
+        }
         String id = val.get("primary_id").toString();
         if (dbName != null && id != null)
         {
@@ -149,10 +148,18 @@ public class EnsemblXref extends EnsemblRestClient
     return result;
   }
 
-  protected URL getUrl(String identifier, String db)
+  /**
+   * Returns the URL for the REST endpoint to fetch all cross-references for an
+   * identifier. Note this may return protein cross-references for nucleotide.
+   * Filter the returned list as required.
+   * 
+   * @param identifier
+   * @return
+   */
+  protected URL getUrl(String identifier)
   {
     String url = ENSEMBL_REST + "/xrefs/id/" + identifier
-            + "?content-type=application/json&external_db=" + db;
+            + "?content-type=application/json&all_levels=1";
     try
     {
       return new URL(url);