JAL-2743 recoded EnsemblLookup without lambda expressions for parsing response
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jan 2018 09:24:38 +0000 (09:24 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 29 Jan 2018 09:24:38 +0000 (09:24 +0000)
src/jalview/ext/ensembl/EnsemblLookup.java

index 4c43281..f6b3a47 100644 (file)
@@ -32,7 +32,6 @@ import java.net.URL;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Function;
 
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -139,7 +138,7 @@ public class EnsemblLookup extends EnsemblRestClient
    */
   public String getGeneId(String identifier)
   {
-    return (String) getResult(identifier, null, br -> parseGeneId(br));
+    return parseGeneId(getResult(identifier, null));
   }
 
   /**
@@ -151,22 +150,29 @@ public class EnsemblLookup extends EnsemblRestClient
    */
   public String getSpecies(String identifier)
   {
-    return (String) getResult(identifier, null,
-            br -> getAttribute(br, SPECIES));
+    String species = null;
+    JSONObject json = getResult(identifier, null);
+    if (json != null)
+    {
+      Object o = json.get(SPECIES);
+      if (o != null)
+      {
+        species = o.toString();
+      }
+    }
+    return species;
   }
 
   /**
-   * Calls the /lookup/id rest service and delegates parsing of the JSON
-   * response to the supplied parser
+   * Calls the /lookup/id rest service and returns the response as a JSONObject,
+   * or null if any error
    * 
    * @param identifier
    * @param objectType
    *          (optional)
-   * @param parser
    * @return
    */
-  protected Object getResult(String identifier, String objectType,
-          Function<BufferedReader, Object> parser)
+  protected JSONObject getResult(String identifier, String objectType)
   {
     List<String> ids = Arrays.asList(new String[] { identifier });
 
@@ -178,10 +184,11 @@ public class EnsemblLookup extends EnsemblRestClient
       {
         br = getHttpResponse(url, ids);
       }
-      return br == null ? null : parser.apply(br);
-    } catch (IOException e)
+      return br == null ? null : (JSONObject) (new JSONParser().parse(br));
+    } catch (IOException | ParseException e)
     {
-      // ignore
+      System.err.println("Error parsing " + identifier + " lookup response "
+              + e.getMessage());
       return null;
     } finally
     {
@@ -199,67 +206,42 @@ public class EnsemblLookup extends EnsemblRestClient
   }
 
   /**
-   * Answers the value of 'attribute' from the JSON response, or null if not
-   * found
-   * 
-   * @param br
-   * @param attribute
-   * @return
-   */
-  protected String getAttribute(BufferedReader br, String attribute)
-  {
-    String value = null;
-    JSONParser jp = new JSONParser();
-    try
-    {
-      JSONObject val = (JSONObject) jp.parse(br);
-      value = val.get(attribute).toString();
-    } catch (ParseException | NullPointerException | IOException e)
-    {
-      // ignore
-    }
-    return value;
-  }
-
-  /**
    * 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 br
+   * @param jsonObject
    * @return
    */
-  protected String parseGeneId(BufferedReader br)
+  protected String parseGeneId(JSONObject json)
   {
+    if (json == null)
+    {
+      // e.g. lookup failed with 404 not found
+      return null;
+    }
+
     String geneId = null;
-    JSONParser jp = new JSONParser();
-    try
+    String type = json.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 = (String) getResult(transcriptId, OBJECT_TYPE_TRANSCRIPT,
-                reader -> parseGeneId(reader));
-      }
-    } catch (ParseException | IOException e)
+      // 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))
     {
-      // ignore
+      // 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;
   }
 
@@ -272,8 +254,7 @@ public class EnsemblLookup extends EnsemblRestClient
    */
   public GeneLociI getGeneLoci(String geneId)
   {
-    return (GeneLociI) getResult(geneId, OBJECT_TYPE_GENE,
-            br -> parseGeneLoci(br));
+    return parseGeneLoci(getResult(geneId, OBJECT_TYPE_GENE));
   }
 
   /**
@@ -281,21 +262,24 @@ public class EnsemblLookup extends EnsemblRestClient
    * seq_region_name, start, end and returns an object that wraps them, or null
    * if unsuccessful
    * 
-   * @param br
+   * @param json
    * @return
    */
-  GeneLociI parseGeneLoci(BufferedReader br)
+  GeneLociI parseGeneLoci(JSONObject json)
   {
-    JSONParser jp = new JSONParser();
+    if (json == null)
+    {
+      return null;
+    }
+
     try
     {
-      JSONObject val = (JSONObject) jp.parse(br);
-      final String species = val.get("species").toString();
-      final String assembly = val.get("assembly_name").toString();
-      final String chromosome = val.get("seq_region_name").toString();
-      String strand = val.get("strand").toString();
-      int start = Integer.parseInt(val.get("start").toString());
-      int end = Integer.parseInt(val.get("end").toString());
+      final String species = json.get("species").toString();
+      final String assembly = json.get("assembly_name").toString();
+      final String chromosome = json.get("seq_region_name").toString();
+      String strand = json.get("strand").toString();
+      int start = Integer.parseInt(json.get("start").toString());
+      int end = Integer.parseInt(json.get("end").toString());
       int fromEnd = end - start + 1;
       boolean reverseStrand = "-1".equals(strand);
       int toStart = reverseStrand ? end : start;
@@ -332,8 +316,7 @@ public class EnsemblLookup extends EnsemblRestClient
           return map;
         }
       };
-    } catch (ParseException | NullPointerException | IOException
-            | NumberFormatException | ClassCastException e)
+    } catch (NullPointerException | NumberFormatException e)
     {
       Cache.log.error("Error looking up gene loci: " + e.getMessage());
       e.printStackTrace();