JAL-3691 automatic insertion of Locale.ROOT to toUpperCase() and toLowerCase() and...
[jalview.git] / src / jalview / datamodel / DBRefEntry.java
index 54e8379..4a5c888 100755 (executable)
@@ -20,8 +20,9 @@
  */
 package jalview.datamodel;
 
+import java.util.Locale;
+
 import jalview.api.DBRefEntryI;
-import jalview.io.vamsas.Dbref;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 
@@ -29,16 +30,7 @@ import java.util.List;
 
 public class DBRefEntry implements DBRefEntryI
 {
-  /*
-   * the mapping to chromosome (genome) is held as an instance with
-   * source = speciesId
-   * version = assemblyId
-   * accessionId = "chromosome:" + chromosomeId
-   * map = mapping from sequence to reference assembly
-   */
-  public static final String CHROMOSOME = "chromosome";
-
-  private String source = "";
+  String source = "";
 
   private String version = "";
   
@@ -49,9 +41,10 @@ public class DBRefEntry implements DBRefEntryI
   int sourceKey = Integer.MIN_VALUE;
 
   String canonicalSourceName;
+  
+  boolean isCanonicalAccession;
 
-
-  /**
+  /*
    * maps from associated sequence to the database sequence's coordinate system
    */
   Mapping map = null;
@@ -60,20 +53,37 @@ public class DBRefEntry implements DBRefEntryI
   {
 
   }
-/**
- * 
- * @param source may not be null
- * @param version may be null
- * @param accessionId may be null
- */
+
+  /**
+   * 
+   * @param source
+   *                      may not be null
+   * @param version
+   *                      may be null
+   * @param accessionId
+   *                      may be null
+   */
   public DBRefEntry(String source, String version, String accessionId)
   {
-    this(source, version, accessionId, null);
+    this(source, version, accessionId, null,false);
   }
 
   /**
    * 
    * @param source
+   *                      may not be null
+   * @param version
+   *                      may be null
+   * @param accessionId
+   *                      may be null
+   */
+  public DBRefEntry(String source, String version, String accessionId, Mapping map)
+  {
+    this(source, version, accessionId, map,false);
+  }
+  /**
+   * 
+   * @param source
    *          canonical source (turned to uppercase; cannot be null)
    * @param version
    *          (source dependent version string or null)
@@ -84,13 +94,14 @@ public class DBRefEntry implements DBRefEntryI
    *          numbering or null)
    */
   public DBRefEntry(String source, String version, String accessionId,
-          Mapping map)
+          Mapping map,boolean isCanonical)
   {
        
-    this.source = source.toUpperCase();
+    this.source = source.toUpperCase(Locale.ROOT);
     setVersion(version);
     this.accessionId = accessionId;
     this.map = map;
+    this.isCanonicalAccession=isCanonical;
   }
 
   /**
@@ -104,7 +115,7 @@ public class DBRefEntry implements DBRefEntryI
                     : new String(entry.getVersion())),
             (entry.getAccessionId() == null ? ""
                     : new String(entry.getAccessionId())),
-            (entry.getMap() == null ? null : new Mapping(entry.getMap())));
+            (entry.getMap() == null ? null : new Mapping(entry.getMap())),entry.isCanonical());
   }
 
   @Override
@@ -163,6 +174,7 @@ public class DBRefEntry implements DBRefEntryI
       return true;
     }
 
+    boolean improved=false;
     /*
      * source must either match or be both null
      */
@@ -186,6 +198,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
@@ -202,12 +227,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)
     {
@@ -280,7 +308,7 @@ public class DBRefEntry implements DBRefEntryI
   public void setAccessionId(String accessionId)
   {
          this.accessionId = accessionId;
-//    this.accessionId = (accessionId == null ? "" : accessionId).toUpperCase();
+//    this.accessionId = (accessionId == null ? "" : accessionId).toUpperCase(Locale.ROOT);
   }
 
   /**
@@ -291,7 +319,7 @@ public class DBRefEntry implements DBRefEntryI
   {
          this.source = source;
          
-//    this.source = (source == null ? "" : source).toUpperCase();
+//    this.source = (source == null ? "" : source).toUpperCase(Locale.ROOT);
 //    this.canonicalSourceName =       DBRefUtils.getCanonicalName(this.source);
 //    this.sourceKey = DBRefSource.getSourceKey(this.canonicalSourceName);
   }
@@ -300,7 +328,7 @@ public class DBRefEntry implements DBRefEntryI
   public void setVersion(String version)
   {
     this.version = version;
-    this.ucversion = (version == null ? null : version.toUpperCase());
+    this.ucversion = (version == null ? null : version.toUpperCase(Locale.ROOT));
   }
 
   @Override
@@ -380,16 +408,6 @@ public class DBRefEntry implements DBRefEntryI
   }
 
   /**
-   * Mappings to chromosome are held with accessionId as "chromosome:id"
-   * 
-   * @return
-   */
-  public boolean isChromosome()
-  {
-    return accessionId != null && accessionId.startsWith(CHROMOSOME + ":");
-  }
-
-  /**
    * stores the upper-case canonical name of the source for use in
    * Sequence.getPrimaryDBRefs().
    * 
@@ -401,5 +419,21 @@ public class DBRefEntry implements DBRefEntryI
        return (canonicalSourceName == null ? (canonicalSourceName = DBRefUtils.getCanonicalName(this.source)) : canonicalSourceName);
   }
 
-
+  /**
+   * 
+   * @param canonical
+   */
+  public void setCanonical(boolean canonical)
+  {
+    isCanonicalAccession = canonical;
+  }
+  /**
+   * 
+   * @return true if this is the primary canonical accession for the database source
+   */
+  public boolean isCanonical()
+  {
+    // TODO Auto-generated method stub
+    return isCanonicalAccession;
+  }
 }