added a more general DBRef search interface
[jalview.git] / src / jalview / util / DBRefUtils.java
index 3e0004e..8eb5d7b 100755 (executable)
@@ -137,23 +137,18 @@ public class DBRefUtils
    */
   public static DBRefEntry[] searchRefs(DBRefEntry[] ref, DBRefEntry entry)
   {
+    return searchRefs(ref, entry, matchDbAndIdAndEitherMapOrEquivalentMapList);
+  }
+  public static DBRefEntry[] searchRefs(DBRefEntry[] ref, DBRefEntry entry, DbRefComp comparator)
+  {
     if (ref==null || entry==null)
       return null;
     Vector rfs = new Vector();
     for (int i=0; i<ref.length;i++)
     {
-      if (entry.getSource()==null || ref[i].getSource().equals(entry.getSource()))
+      if (comparator.matches(entry, ref[i]))
       {
-        if (entry.getVersion()==null || ref[i].getVersion().equals(entry.getVersion()))
-        {
-          if (entry.getAccessionId()==null || ref[i].getAccessionId().equals(entry.getAccessionId()))
-          {
-            if (entry.getMap()==null || (ref[i].getMap()!=null && ref[i].getMap().equals(entry.getMap())))
-            {
               rfs.addElement(ref[i]);
-            }
-          }
-        }
       }
     }
     // TODO Auto-generated method stub
@@ -165,4 +160,182 @@ public class DBRefUtils
     }
     return null;
   }
+  public interface DbRefComp {
+    public boolean matches(DBRefEntry refa, DBRefEntry refb);
+  }
+  public static DbRefComp matchNonNullonA = new DbRefComp()
+    {
+          public boolean matches(DBRefEntry refa, DBRefEntry refb)
+          {
+            if (refa.getSource()==null || refb.getSource().equals(refa.getSource()))
+            {
+              if (refa.getVersion()==null || refb.getVersion().equals(refa.getVersion()))
+              {
+                if (refa.getAccessionId()==null || refb.getAccessionId().equals(refa.getAccessionId()))
+                {
+                  if (refa.getMap()==null || (refb.getMap()!=null && refb.getMap().equals(refa.getMap())))
+                  {
+                    return true; 
+                  }
+                }
+              }
+            }
+            return false;
+          }
+    };
+    /**
+     * either field is null or field matches for all of source, version, accession id and map.
+     */
+    public static DbRefComp matchEitherNonNull = new DbRefComp()
+    {
+          public boolean matches(DBRefEntry refa, DBRefEntry refb)
+          {
+            if ((refa.getSource()==null || refb.getSource()==null) 
+                    || refb.getSource().equals(refa.getSource()))
+            {
+              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 false;
+          }
+    };
+    /**
+     * accession ID and DB must be identical. Version is ignored. Map is either not defined or is a match (or is compatible?)
+     */
+    public static DbRefComp matchDbAndIdAndEitherMap = new DbRefComp()
+    {
+          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()))
+                {
+                  if ((refa.getMap()==null || refb.getMap()==null) 
+                          || (refa.getMap()!=null && refb.getMap()!=null && refb.getMap().equals(refa.getMap())))
+                  {
+                    return true; 
+                  }
+                }
+              }
+            return false;
+          }
+    };
+    /**
+     * accession ID and DB must be identical. Version is ignored. 
+     * No map on either or map but no maplist on either or maplist of map on a is the complement of maplist of map on b.
+     */
+    public static DbRefComp matchDbAndIdAndComplementaryMapList = new DbRefComp()
+    {
+          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()))
+                {
+                  if ((refa.getMap()==null && refb.getMap()==null) 
+                          || (refa.getMap()!=null && refb.getMap()!=null))
+                    if ((refb.getMap().getMap()==null && refa.getMap().getMap()==null)
+                            || (refb.getMap().getMap()!=null && refa.getMap().getMap()!=null
+                            && refb.getMap().getMap().getInverse().equals(refa.getMap().getMap())))
+                  {
+                    return true; 
+                  }
+                }
+              }
+            return false;
+          }
+    };
+    /**
+     * accession ID and DB must be identical. Version is ignored. 
+     * No map on both or or map but no maplist on either or maplist of map on a is equivalent to the maplist of map on b.
+     */
+    public static DbRefComp matchDbAndIdAndEquivalentMapList = new DbRefComp()
+    {
+          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()))
+                {
+                  if (refa.getMap()==null && refb.getMap()==null)
+                  {
+                    return true;
+                  }
+                  if (refa.getMap()!=null && refb.getMap()!=null
+                          && ((refb.getMap().getMap()==null && refa.getMap().getMap()==null)
+                            || (refb.getMap().getMap()!=null && refa.getMap().getMap()!=null
+                            && refb.getMap().getMap().equals(refa.getMap().getMap()))))
+                  {
+                    return true; 
+                  }
+                }
+              }
+            return false;
+          }
+    };
+    /**
+     * accession ID and DB must be identical. Version is ignored. 
+     * No map on either or map but no maplist on either or maplist of map on a is equivalent to the maplist of map on b.
+     */
+    public static DbRefComp matchDbAndIdAndEitherMapOrEquivalentMapList = new DbRefComp()
+    {
+          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()))
+                {
+                  if (refa.getMap()==null || refb.getMap()==null)
+                  {
+                    return true;
+                  }
+                  if ((refa.getMap()!=null && refb.getMap()!=null)
+                          && (refb.getMap().getMap()==null && refa.getMap().getMap()==null)
+                            || (refb.getMap().getMap()!=null && refa.getMap().getMap()!=null
+                            && refb.getMap().getMap().equals(refa.getMap().getMap())))
+                  {
+                    return true; 
+                  }
+                }
+              }
+            return false;
+          }
+    };
+        
+          
 }