JAL-1705 canonicalise ENSEMBL name; code tidy
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 21 Jan 2016 14:38:21 +0000 (14:38 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 21 Jan 2016 14:38:21 +0000 (14:38 +0000)
src/jalview/util/DBRefUtils.java
test/jalview/util/DBRefUtilsTest.java

index cdf2325..c85a489 100755 (executable)
@@ -24,18 +24,24 @@ import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
 import com.stevesoft.pat.Regex;
 
+/**
+ * Utilities for handling DBRef objects and their collections.
+ */
 public class DBRefUtils
 {
+  /*
+   * lookup from lower-case form of a name to its canonical (standardised) form
+   */
   private static Map<String, String> canonicalSourceNameLookup = new HashMap<String, String>();
 
   private static Map<String, String> dasCoordinateSystemsLookup = new HashMap<String, String>();
@@ -47,6 +53,7 @@ public class DBRefUtils
             DBRefSource.UNIPROT);
     canonicalSourceNameLookup.put("uniprotkb/trembl", DBRefSource.UNIPROT);
     canonicalSourceNameLookup.put("pdb", DBRefSource.PDB);
+    canonicalSourceNameLookup.put("ensembl", DBRefSource.ENSEMBL);
 
     dasCoordinateSystemsLookup.put("pdbresnum", DBRefSource.PDB);
     dasCoordinateSystemsLookup.put("uniprot", DBRefSource.UNIPROT);
@@ -55,39 +62,33 @@ public class DBRefUtils
   }
 
   /**
-   * Utilities for handling DBRef objects and their collections.
-   */
-  /**
    * 
    * @param dbrefs
-   *          Vector of DBRef objects to search
+   *          array of DBRef objects to search
    * @param sources
    *          String[] array of source DBRef IDs to retrieve
-   * @return Vector
+   * @return
    */
   public static DBRefEntry[] selectRefs(DBRefEntry[] dbrefs,
           String[] sources)
   {
-    if (dbrefs == null)
-    {
-      return null;
-    }
-    if (sources == null)
+    if (dbrefs == null || sources == null)
     {
       return dbrefs;
     }
-    Map<String, Integer> srcs = new HashMap<String, Integer>();
-    ArrayList<DBRefEntry> res = new ArrayList<DBRefEntry>();
-
-    for (int i = 0; i < sources.length; i++)
+    HashSet<String> srcs = new HashSet<String>();
+    for (String src : sources)
     {
-      srcs.put(new String(sources[i]), new Integer(i));
+      srcs.add(src);
     }
-    for (int i = 0, j = dbrefs.length; i < j; i++)
+
+    List<DBRefEntry> res = new ArrayList<DBRefEntry>();
+    for (DBRefEntry dbr : dbrefs)
     {
-      if (srcs.containsKey(dbrefs[i].getSource()))
+      String source = getCanonicalName(dbr.getSource());
+      if (srcs.contains(source))
       {
-        res.add(dbrefs[i]);
+        res.add(dbr);
       }
     }
 
@@ -96,8 +97,6 @@ public class DBRefUtils
       DBRefEntry[] reply = new DBRefEntry[res.size()];
       return res.toArray(reply);
     }
-    res = null;
-    // there are probable memory leaks in the hashtable!
     return null;
   }
 
@@ -201,8 +200,10 @@ public class DBRefUtils
   /**
    * match on all non-null fields in refa
    */
+  // TODO unused - remove?
   public static DbRefComp matchNonNullonA = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() == null
@@ -231,27 +232,18 @@ public class DBRefUtils
    * either field is null or field matches for all of source, version, accession
    * id and map.
    */
+  // TODO unused - remove?
   public static DbRefComp matchEitherNonNull = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
-      if ((refa.getSource() == null || refb.getSource() == null)
-              || refb.getSource().equals(refa.getSource()))
+      if (nullOrEqual(refa.getSource(), refb.getSource())
+              && nullOrEqual(refa.getVersion(), refb.getVersion())
+              && nullOrEqual(refa.getAccessionId(), refb.getAccessionId())
+              && nullOrEqual(refa.getMap(), refb.getMap()))
       {
-        if ((refa.getVersion() == null || refb.getVersion() == null)
-                || refb.getVersion().equals(refa.getVersion()))
-        {
-          if ((refa.getAccessionId() == null || refb.getAccessionId() == null)
-                  || refb.getAccessionId().equals(refa.getAccessionId()))
-          {
-            if ((refa.getMap() == null || refb.getMap() == null)
-                    || (refb.getMap() != null && refb.getMap().equals(
-                            refa.getMap())))
-            {
-              return true;
-            }
-          }
-        }
+        return true;
       }
       return false;
     }
@@ -261,18 +253,18 @@ public class DBRefUtils
    * accession ID and DB must be identical. Version is ignored. Map is either
    * not defined or is a match (or is compatible?)
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndEitherMap = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
+        // FIXME should be && not || here?
                 || refb.getAccessionId().equals(refa.getAccessionId()))
         {
           if ((refa.getMap() == null || refb.getMap() == null)
@@ -292,17 +284,16 @@ public class DBRefUtils
    * or map but no maplist on either or maplist of map on a is the complement of
    * maplist of map on b.
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndComplementaryMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
                 || refb.getAccessionId().equals(refa.getAccessionId()))
         {
@@ -329,8 +320,10 @@ public class DBRefUtils
    * or or map but no maplist on either or maplist of map on a is equivalent to
    * the maplist of map on b.
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndEquivalentMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
@@ -369,17 +362,13 @@ public class DBRefUtils
    */
   public static DbRefComp matchDbAndIdAndEitherMapOrEquivalentMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
-      // System.err.println("Comparing A: "+refa.getSrcAccString()+(refa.hasMap()?" has map.":"."));
-      // System.err.println("Comparing B: "+refb.getSrcAccString()+(refb.hasMap()?" has map.":"."));
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
                 && refb.getAccessionId().equals(refa.getAccessionId()))
         {
@@ -473,4 +462,20 @@ public class DBRefUtils
     return ref;
   }
 
+  /**
+   * Returns true if either object is null, or they are equal
+   * 
+   * @param o1
+   * @param o2
+   * @return
+   */
+  public static boolean nullOrEqual(Object o1, Object o2)
+  {
+    if (o1 == null || o2 == null)
+    {
+      return true;
+    }
+    return (o1 == null ? o2.equals(o1) : o1.equals(o2));
+  }
+
 }
index 4a55a0d..b560eb8 100644 (file)
@@ -96,6 +96,7 @@ public class DBRefUtilsTest
     assertEquals("UNIPROT", DBRefUtils.getCanonicalName("UNIPROTKB/TREMBL"));
     assertEquals("UNIPROTKB/SWISS-CHEESE",
             DBRefUtils.getCanonicalName("UNIPROTKB/SWISS-CHEESE"));
+    assertEquals("ENSEMBL", DBRefUtils.getCanonicalName("Ensembl"));
   }
 
   @Test(groups = { "Functional" })