JAL-3438 spotless for 2.11.2.0
[jalview.git] / src / jalview / ext / ensembl / EnsemblSymbol.java
index 5b3baa1..ef79d72 100644 (file)
@@ -1,61 +1,98 @@
+/*
+ * 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 java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
+/**
+ * A client for the Ensembl xrefs/symbol REST service;
+ * 
+ * @see http://rest.ensembl.org/documentation/info/xref_external
+ * @author gmcarstairs
+ *
+ */
 public class EnsemblSymbol extends EnsemblXref
 {
+  private static final String GENE = "gene";
+
+  private static final String TYPE = "type";
+
   /**
-   * Returns the first "id" value in gene identifier format from the JSON
-   * response, or null if none found
+   * Constructor given the target domain to fetch data from
    * 
-   * @param br
-   * @return
-   * @throws IOException
+   * @param domain
+   * @param dbName
+   * @param dbVersion
    */
-  protected String parseResponse(BufferedReader br)
-          throws IOException
+  public EnsemblSymbol(String domain, String dbName, String dbVersion)
   {
-    JSONParser jp = new JSONParser();
-    String result = null;
-    try
-    {
-      JSONArray responses = (JSONArray) jp.parse(br);
-      Iterator rvals = responses.iterator();
-      while (rvals.hasNext())
-      {
-        JSONObject val = (JSONObject) rvals.next();
-        String id = val.get("id").toString();
-        if (id != null && isGeneIdentifier(id))
-        {
-          result = id;
-          break;
-        }
-      }
-    } catch (ParseException e)
-    {
-      // ignore
-    }
-    return result;
+    super(domain, dbName, dbVersion);
   }
 
-  protected URL getUrl(String id, Species species)
+  // /**
+  // * Returns the first "id" value in gene identifier format from the JSON
+  // * response, or null if none found
+  // *
+  // * @param br
+  // * @return
+  // * @throws IOException
+  // */
+  // @SuppressWarnings("unchecked")
+  // protected String parseSymbolResponse(BufferedReader br) throws IOException
+  // {
+  // }
+
+  /**
+   * Constructs the URL for the REST symbol endpoint
+   * 
+   * @param id
+   *          the accession id (Ensembl or external)
+   * @param species
+   *          a species name recognisable by Ensembl
+   * @param type
+   *          an optional type to filter the response (gene, transcript,
+   *          translation)
+   * @return
+   */
+  protected URL getUrl(String id, Species species, String... type)
   {
-    String url = ENSEMBL_REST + "/xrefs/symbol/" + species.toString() + "/"
-            + id
-            + "?content-type=application/json";
+    StringBuilder sb = new StringBuilder();
+    sb.append(getDomain()).append("/xrefs/symbol/")
+            .append(species.toString()).append("/").append(id)
+            .append(CONTENT_TYPE_JSON);
+    for (String t : type)
+    {
+      sb.append("&object_type=").append(t);
+    }
     try
     {
+      String url = sb.toString();
       return new URL(url);
     } catch (MalformedURLException e)
     {
@@ -70,50 +107,53 @@ public class EnsemblSymbol extends EnsemblXref
    * @param identifier
    * @return
    */
-  public List<String> getIds(String identifier)
+  @SuppressWarnings("unchecked")
+  public List<String> getGeneIds(String identifier)
   {
     List<String> result = new ArrayList<String>();
     List<String> ids = new ArrayList<String>();
     ids.add(identifier);
-  
+
     String[] queries = identifier.split(getAccessionSeparator());
-    BufferedReader br = null;
     try
     {
       for (String query : queries)
       {
-        for (Species taxon : Species.values())
+        for (Species taxon : Species.getModelOrganisms())
         {
-          if (taxon.isModelOrganism())
+          String geneId = null;/// parseSymbolResponse(br);
+          try
           {
-            URL url = getUrl(query, taxon);
-            if (url != null)
+            Iterator<Object> rvals = (Iterator<Object>) getJSON(
+                    getUrl(query, taxon, GENE), ids, -1, MODE_ITERATOR,
+                    null);
+            if (rvals == null)
+              continue;
+            while (rvals.hasNext())
             {
-              br = getHttpResponse(url, ids);
-            }
-            String geneId = parseResponse(br);
-            if (geneId != null)
-            {
-              result.add(geneId);
+              Map<String, Object> val = (Map<String, Object>) rvals.next();
+              String id = val.get(JSON_ID).toString();
+              String type = val.get(TYPE).toString();
+              if (id != null && GENE.equals(type))
+              {
+                geneId = id;
+                break;
+              }
             }
+          } catch (ParseException e)
+          {
+            // ignore
+          }
+
+          if (geneId != null && !result.contains(geneId))
+          {
+            result.add(geneId);
           }
         }
       }
     } catch (IOException e)
     {
       // ignore
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
     return result;
   }