JAL-3949 Complete new abstracted logging framework in jalview.log. Updated log calls...
[jalview.git] / src / jalview / ext / ensembl / EnsemblLookup.java
index ed1b4fa..2507e87 100644 (file)
@@ -23,18 +23,18 @@ package jalview.ext.ensembl;
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.GeneLociI;
+import jalview.datamodel.GeneLocus;
+import jalview.datamodel.Mapping;
 import jalview.util.MapList;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -49,11 +49,6 @@ public class EnsemblLookup extends EnsemblRestClient
   private static final String SPECIES = "species";
 
   /**
-   * keep track of last identifier retrieved to break loops
-   */
-  private String lastId;
-
-  /**
    * Default constructor (to use rest.ensembl.org)
    */
   public EnsemblLookup()
@@ -122,21 +117,9 @@ public class EnsemblLookup extends EnsemblRestClient
     return true;
   }
 
-  @Override
-  protected String getRequestMimeType(boolean multipleIds)
-  {
-    return "application/json";
-  }
-
-  @Override
-  protected String getResponseMimeType()
-  {
-    return "application/json";
-  }
-
   /**
    * Returns the gene id related to the given identifier (which may be for a
-   * gene, transcript or protein)
+   * gene, transcript or protein), or null if none is found
    * 
    * @param identifier
    * @return
@@ -148,7 +131,7 @@ public class EnsemblLookup extends EnsemblRestClient
 
   /**
    * Returns the gene id related to the given identifier (which may be for a
-   * gene, transcript or protein)
+   * gene, transcript or protein), or null if none is found
    * 
    * @param identifier
    * @param objectType
@@ -156,34 +139,7 @@ public class EnsemblLookup extends EnsemblRestClient
    */
   public String getGeneId(String identifier, String objectType)
   {
-    List<String> ids = Arrays.asList(new String[] { identifier });
-
-    BufferedReader br = null;
-    try
-    {
-      URL url = getUrl(identifier, objectType);
-      if (url != null)
-      {
-        br = getHttpResponse(url, ids);
-      }
-      return br == null ? null : parseResponse(br);
-    } catch (IOException e)
-    {
-      // ignore
-      return null;
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
-    }
+    return parseGeneId(getResult(identifier, objectType));
   }
 
   /**
@@ -194,36 +150,32 @@ public class EnsemblLookup extends EnsemblRestClient
    * 
    * @param br
    * @return
-   * @throws IOException
    */
-  protected String parseResponse(BufferedReader br) throws IOException
+  protected String parseGeneId(Map<String, Object> val)
   {
+    if (val == null)
+    {
+      return null;
+    }
     String geneId = null;
-    JSONParser jp = new JSONParser();
-    try
+    String type = val.get(OBJECT_TYPE).toString();
+    if (OBJECT_TYPE_GENE.equalsIgnoreCase(type))
     {
-      JSONObject val = (JSONObject) jp.parse(br);
-      String type = val.get(OBJECT_TYPE).toString();
-      if (OBJECT_TYPE_GENE.equalsIgnoreCase(type))
-      {
-        // got the gene - just returns its id
-        geneId = val.get(JSON_ID).toString();
-      }
-      else if (OBJECT_TYPE_TRANSCRIPT.equalsIgnoreCase(type))
-      {
-        // got the transcript - return its (Gene) Parent
-        geneId = val.get(PARENT).toString();
-      }
-      else if (OBJECT_TYPE_TRANSLATION.equalsIgnoreCase(type))
-      {
-        // got the protein - get its Parent, restricted to type Transcript
-        String transcriptId = val.get(PARENT).toString();
-        geneId = getGeneId(transcriptId, OBJECT_TYPE_TRANSCRIPT);
-      }
-    } catch (ParseException e)
+      // got the gene - just returns its id
+      geneId = val.get(JSON_ID).toString();
+    }
+    else if (OBJECT_TYPE_TRANSCRIPT.equalsIgnoreCase(type))
     {
-      // ignore
+      // got the transcript - return its (Gene) Parent
+      geneId = val.get(PARENT).toString();
     }
+    else if (OBJECT_TYPE_TRANSLATION.equalsIgnoreCase(type))
+    {
+      // got the protein - get its Parent, restricted to type Transcript
+      String transcriptId = val.get(PARENT).toString();
+      geneId = getGeneId(transcriptId, OBJECT_TYPE_TRANSCRIPT);
+    }
+
     return geneId;
   }
 
@@ -237,7 +189,7 @@ public class EnsemblLookup extends EnsemblRestClient
   public String getSpecies(String identifier)
   {
     String species = null;
-    JSONObject json = getResult(identifier, null);
+    Map<String, Object> json = getResult(identifier, null);
     if (json != null)
     {
       Object o = json.get(SPECIES);
@@ -250,7 +202,7 @@ public class EnsemblLookup extends EnsemblRestClient
   }
 
   /**
-   * Calls the /lookup/id rest service and returns the response as a JSONObject,
+   * Calls the /lookup/id rest service and returns the response as a Map<String, Object>,
    * or null if any error
    * 
    * @param identifier
@@ -258,91 +210,24 @@ public class EnsemblLookup extends EnsemblRestClient
    *          (optional)
    * @return
    */
-  protected JSONObject getResult(String identifier, String objectType)
+  @SuppressWarnings("unchecked")
+  protected Map<String, Object> getResult(String identifier, String objectType)
   {
     List<String> ids = Arrays.asList(new String[] { identifier });
 
-    BufferedReader br = null;
     try
     {
-
-      URL url = getUrl(identifier, objectType);
-
-      if (identifier.equals(lastId))
-      {
-        System.err.println("** Ensembl lookup " + url.toString()
-                + " looping on Parent!");
-        return null;
-      }
-
-      lastId = identifier;
-
-      if (url != null)
-      {
-        br = getHttpResponse(url, ids);
-      }
-      return br == null ? null : (JSONObject) (new JSONParser().parse(br));
-    } catch (IOException | ParseException e)
+      return (Map<String, Object>) getJSON(getUrl(identifier, objectType), ids, -1, MODE_MAP, null);
+    } 
+    catch (IOException | ParseException e)
     {
       System.err.println("Error parsing " + identifier + " lookup response "
               + e.getMessage());
       return null;
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
   }
 
   /**
-   * Parses the JSON response and returns the gene identifier, or null if not
-   * found. If the returned object_type is Gene, returns the id, if Transcript
-   * returns the Parent. If it is Translation (peptide identifier), then the
-   * Parent is the transcript identifier, so we redo the search with this value,
-   * specifying that object_type should be Transcript.
-   * 
-   * @param jsonObject
-   * @return
-   */
-  protected String parseGeneId(JSONObject json)
-  {
-    if (json == null)
-    {
-      // e.g. lookup failed with 404 not found
-      return null;
-    }
-
-    String geneId = null;
-    String type = json.get(OBJECT_TYPE).toString();
-    if (OBJECT_TYPE_GENE.equalsIgnoreCase(type))
-    {
-      // got the gene - just returns its id
-      geneId = json.get(JSON_ID).toString();
-    }
-    else if (OBJECT_TYPE_TRANSCRIPT.equalsIgnoreCase(type))
-    {
-      // got the transcript - return its (Gene) Parent
-      geneId = json.get(PARENT).toString();
-    }
-    else if (OBJECT_TYPE_TRANSLATION.equalsIgnoreCase(type))
-    {
-      // got the protein - look up its Parent, restricted to type Transcript
-      String transcriptId = json.get(PARENT).toString();
-      geneId = parseGeneId(getResult(transcriptId, OBJECT_TYPE_TRANSCRIPT));
-    }
-
-    return geneId;
-  }
-
-  /**
    * Calls the /lookup/id rest service for the given id, and if successful,
    * parses and returns the gene's chromosomal coordinates
    * 
@@ -362,7 +247,7 @@ public class EnsemblLookup extends EnsemblRestClient
    * @param json
    * @return
    */
-  GeneLociI parseGeneLoci(JSONObject json)
+  GeneLociI parseGeneLoci(Map<String, Object> json)
   {
     if (json == null)
     {
@@ -385,37 +270,13 @@ public class EnsemblLookup extends EnsemblRestClient
           fromEnd });
       List<int[]> toRange = Collections.singletonList(new int[] { toStart,
           toEnd });
-      final MapList map = new MapList(fromRange, toRange, 1, 1);
-      return new GeneLociI()
-      {
-
-        @Override
-        public String getSpeciesId()
-        {
-          return species == null ? "" : species;
-        }
-
-        @Override
-        public String getAssemblyId()
-        {
-          return assembly;
-        }
-
-        @Override
-        public String getChromosomeId()
-        {
-          return chromosome;
-        }
-
-        @Override
-        public MapList getMap()
-        {
-          return map;
-        }
-      };
+      final Mapping map = new Mapping(
+              new MapList(fromRange, toRange, 1, 1));
+      return new GeneLocus(species == null ? "" : species, assembly,
+              chromosome, map);
     } catch (NullPointerException | NumberFormatException e)
     {
-      Cache.log.error("Error looking up gene loci: " + e.getMessage());
+      Cache.error("Error looking up gene loci: " + e.getMessage());
       e.printStackTrace();
     }
     return null;