JAL-3863 promote non-canonical version of dbref to a canonical one
authorJim Procter <j.procter@dundee.ac.uk>
Fri, 3 Sep 2021 17:39:14 +0000 (18:39 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Fri, 3 Sep 2021 17:39:14 +0000 (18:39 +0100)
src/jalview/datamodel/DBRefEntry.java
test/jalview/datamodel/DBRefEntryTest.java
test/jalview/datamodel/SequenceTest.java

index b6cae62..511287b 100755 (executable)
@@ -172,6 +172,7 @@ public class DBRefEntry implements DBRefEntryI
       return true;
     }
 
+    boolean improved=false;
     /*
      * source must either match or be both null
      */
@@ -195,6 +196,19 @@ public class DBRefEntry implements DBRefEntryI
       return false;
     }
 
+    if (!isCanonicalAccession && other.isCanonical())
+    {
+      isCanonicalAccession = true;
+      improved = true;
+    }
+    else
+    {
+      if (isCanonicalAccession && !other.isCanonical())
+      {
+        // other is not an authoritative source of canonical accessions
+        return false;
+      }
+    }
     /*
      * if my version is null, "0" or "source:0" then replace with other version,
      * otherwise the versions have to match
@@ -211,12 +225,15 @@ public class DBRefEntry implements DBRefEntryI
       if (version != null && (otherVersion == null
               || !version.equalsIgnoreCase(otherVersion)))
       {
-        return false;
+        // FIXME: there may be a problem with old version strings not allowing
+        // updating of dbrefentries
+        return improved;
       }
     }
 
     /*
-     * if I have no mapping, take that of the other dbref
+     * if I have no mapping, take that of the other dbref 
+     * - providing it had a version and so do I
      */
     if (map == null)
     {
index c8f998b..e95a8b5 100644 (file)
@@ -134,6 +134,21 @@ public class DBRefEntryTest
     assertEquals("3", ref1.getVersion());
 
     /*
+     * canonical == false superseded by canonical == true
+     */
+    ref1.setCanonical(false);
+    ref2.setCanonical(true);
+    assertTrue(ref1.updateFrom(ref2));
+    assertTrue(ref1.isCanonical());
+
+    /*
+     * canonical == true NOT superseded by canonical == false
+     */
+    ref1.setCanonical(true);
+    ref2.setCanonical(false);
+    assertFalse(ref1.updateFrom(ref2));
+
+    /*
      * version "source:n" with n>0 is not superseded
      */
     ref1.setVersion("UNIPROT:1");
index 5ae7dd9..e549978 100644 (file)
@@ -2181,9 +2181,19 @@ public class SequenceTest
     Sequence toSeq = new Sequence("MYSEQ","THISISASEQ");
     origSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q12345", null, true));
     toSeq.transferAnnotation(origSeq, null);
-    assertTrue(toSeq.getDBRefs().size()>0);
+    assertTrue(toSeq.getDBRefs().size()==1);
     
     assertTrue(toSeq.getDBRefs().get(0).isCanonical());
     
+    // check for promotion of non-canonical 
+    // to canonical (e.g. fetch-db-refs on a jalview project pre 2.11.2)
+    toSeq.setDBRefs(null);
+    toSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q12345", null, false));
+    toSeq.transferAnnotation(origSeq, null);
+    assertTrue(toSeq.getDBRefs().size()==1);
+    
+    assertTrue("Promotion of non-canonical DBRefEntry failed",toSeq.getDBRefs().get(0).isCanonical());
+    
+    
   }
 }