JAL-1693 make exon alignment for get-xref splitframe (with CDS xref)
[jalview.git] / src / jalview / util / DBRefUtils.java
index 8163f05..9765a1a 100755 (executable)
  */
 package jalview.util;
 
-import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SequenceI;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
-import java.util.Vector;
+
+import com.stevesoft.pat.Regex;
+
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
 
 public class DBRefUtils
 {
+  private static Map<String, String> canonicalSourceNameLookup = new HashMap<String, String>();
+
+  private static Map<String, String> dasCoordinateSystemsLookup = new HashMap<String, String>();
+
+  static
+  {
+    // TODO load these from a resource file?
+    canonicalSourceNameLookup.put("uniprotkb/swiss-prot",
+            DBRefSource.UNIPROT);
+    canonicalSourceNameLookup.put("uniprotkb/trembl", DBRefSource.UNIPROT);
+    canonicalSourceNameLookup.put("pdb", DBRefSource.PDB);
+
+    dasCoordinateSystemsLookup.put("pdbresnum", DBRefSource.PDB);
+    dasCoordinateSystemsLookup.put("uniprot", DBRefSource.UNIPROT);
+    dasCoordinateSystemsLookup.put("embl", DBRefSource.EMBL);
+    // dasCoordinateSystemsLookup.put("embl", DBRefSource.EMBLCDS);
+  }
+
   /**
    * Utilities for handling DBRef objects and their collections.
    */
@@ -89,37 +110,20 @@ public class DBRefUtils
    * @return boolean true if Source DBRefEntry is compatible with DAS
    *         CoordinateSystem name
    */
-  public static Hashtable DasCoordinateSystemsLookup = null;
 
   public static boolean isDasCoordinateSystem(String string,
           DBRefEntry dBRefEntry)
   {
-    if (DasCoordinateSystemsLookup == null)
+    if (string == null || dBRefEntry == null)
     {
-      // TODO: Make a DasCoordinateSystemsLookup properties resource
-      // Initialise
-      DasCoordinateSystemsLookup = new Hashtable();
-      DasCoordinateSystemsLookup.put("pdbresnum",
-              jalview.datamodel.DBRefSource.PDB);
-      DasCoordinateSystemsLookup.put("uniprot",
-              jalview.datamodel.DBRefSource.UNIPROT);
-      DasCoordinateSystemsLookup.put("EMBL",
-              jalview.datamodel.DBRefSource.EMBL);
-      // DasCoordinateSystemsLookup.put("EMBL",
-      // jalview.datamodel.DBRefSource.EMBLCDS);
+      return false;
     }
-
-    String coordsys = (String) DasCoordinateSystemsLookup.get(string
+    String coordsys = dasCoordinateSystemsLookup.get(string
             .toLowerCase());
-    if (coordsys != null)
-    {
-      return coordsys.equals(dBRefEntry.getSource());
-    }
-    return false;
+    return coordsys == null ? false : coordsys.equals(dBRefEntry
+            .getSource());
   }
 
-  public static Hashtable CanonicalSourceNameLookup = null;
-
   /**
    * look up source in an internal list of database reference sources and return
    * the canonical jalview name for the source, or the original string if it has
@@ -131,34 +135,28 @@ public class DBRefUtils
    */
   public static String getCanonicalName(String source)
   {
-    if (CanonicalSourceNameLookup == null)
+    if (source == null)
     {
-      CanonicalSourceNameLookup = new Hashtable();
-      CanonicalSourceNameLookup.put("uniprotkb/swiss-prot",
-              jalview.datamodel.DBRefSource.UNIPROT);
-      CanonicalSourceNameLookup.put("uniprotkb/trembl",
-              jalview.datamodel.DBRefSource.UNIPROT);
-      CanonicalSourceNameLookup.put("pdb",
-              jalview.datamodel.DBRefSource.PDB);
+      return null;
     }
-    String canonical = (String) CanonicalSourceNameLookup.get(source
+    String canonical = canonicalSourceNameLookup.get(source
             .toLowerCase());
-    if (canonical == null)
-    {
-      return source;
-    }
-    return canonical;
+    return canonical == null ? source : canonical;
   }
 
   /**
-   * find RefEntry corresponding to a particular pattern the equals method of
-   * each entry is used, from String attributes right down to Mapping
-   * attributes.
+   * Returns an array of those references that match the given entry, or null if
+   * no matches. Currently uses a comparator which matches if
+   * <ul>
+   * <li>database sources are the same</li>
+   * <li>accession ids are the same</li>
+   * <li>both have no mapping, or the mappings are the same</li>
+   * </ul>
    * 
    * @param ref
    *          Set of references to search
    * @param entry
-   *          pattern to collect - null any entry for wildcard match
+   *          pattern to match
    * @return
    */
   public static DBRefEntry[] searchRefs(DBRefEntry[] ref, DBRefEntry entry)
@@ -167,32 +165,36 @@ public class DBRefUtils
             matchDbAndIdAndEitherMapOrEquivalentMapList);
   }
 
-  public static DBRefEntry[] searchRefs(DBRefEntry[] ref, DBRefEntry entry,
+  /**
+   * Returns an array of those references that match the given entry, according
+   * to the given comparator. Returns null if no matches.
+   * 
+   * @param refs
+   *          an array of database references to search
+   * @param entry
+   *          an entry to compare against
+   * @param comparator
+   * @return
+   */
+  static DBRefEntry[] searchRefs(DBRefEntry[] refs, DBRefEntry entry,
           DbRefComp comparator)
   {
-    if (ref == null || entry == null)
+    if (refs == null || entry == null)
     {
       return null;
     }
-    Vector rfs = new Vector();
-    for (int i = 0; i < ref.length; i++)
+    List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+    for (int i = 0; i < refs.length; i++)
     {
-      if (comparator.matches(entry, ref[i]))
+      if (comparator.matches(entry, refs[i]))
       {
-        rfs.addElement(ref[i]);
+        rfs.add(refs[i]);
       }
     }
-    // TODO Auto-generated method stub
-    if (rfs.size() > 0)
-    {
-      DBRefEntry[] rf = new DBRefEntry[rfs.size()];
-      rfs.copyInto(rf);
-      return rf;
-    }
-    return null;
+    return rfs.size() == 0 ? null : rfs.toArray(new DBRefEntry[rfs.size()]);
   }
 
-  public interface DbRefComp
+  interface DbRefComp
   {
     public boolean matches(DBRefEntry refa, DBRefEntry refb);
   }
@@ -402,14 +404,17 @@ public class DBRefUtils
   };
 
   /**
-   * used by file parsers to generate DBRefs from annotation within file (eg
-   * stockholm)
+   * Parses a DBRefEntry and adds it to the sequence, also a PDBEntry if the
+   * database is PDB.
+   * <p>
+   * Used by file parsers to generate DBRefs from annotation within file (eg
+   * Stockholm)
    * 
    * @param dbname
    * @param version
    * @param acn
    * @param seq
-   *          where to anotate with reference
+   *          where to annotate with reference
    * @return parsed version of entry that was added to seq (if any)
    */
   public static DBRefEntry parseToDbRef(SequenceI seq, String dbname,
@@ -418,12 +423,14 @@ public class DBRefUtils
     DBRefEntry ref = null;
     if (dbname != null)
     {
-      String locsrc = jalview.util.DBRefUtils.getCanonicalName(dbname);
-      if (locsrc.equals(jalview.datamodel.DBRefSource.PDB))
+      String locsrc = DBRefUtils.getCanonicalName(dbname);
+      if (locsrc.equals(DBRefSource.PDB))
       {
-        // check for chaincode and mapping
-        // PFAM style stockhom PDB citation
-        com.stevesoft.pat.Regex r = new com.stevesoft.pat.Regex(
+        /*
+         * Check for PFAM style stockhom PDB accession id citation e.g.
+         * "1WRI A; 7-80;"
+         */
+        Regex r = new com.stevesoft.pat.Regex(
                 "([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)");
         if (r.search(acn.trim()))
         {
@@ -433,8 +440,8 @@ public class DBRefUtils
           {
             chaincode = " ";
           }
-          String mapstart = r.stringMatched(3);
-          String mapend = r.stringMatched(4);
+          // String mapstart = r.stringMatched(3);
+          // String mapend = r.stringMatched(4);
           if (chaincode.equals(" "))
           {
             chaincode = "_";