JAL-3956 - PDBEntry objects constructed from 3D-Beacons have authoritative IDs overri...
[jalview.git] / src / jalview / datamodel / PDBEntry.java
index 793fbd7..741ef07 100755 (executable)
@@ -38,6 +38,15 @@ public class PDBEntry
 
   private static final int PDB_ID_LENGTH = 4;
 
+  /**
+   * property set when id is a 'manufactured' identifier from the structure data's filename
+   */
+  private static final String FAKED_ID = "faked_pdbid";
+  /**
+   * property set when the id is authoritative, and should be used in preference to any identifiers in the structure data
+   */
+  private static final String AUTHORITATIVE_ID = "authoritative_pdbid";
+
   private String file;
 
   private String type;
@@ -48,7 +57,7 @@ public class PDBEntry
   {
     // TODO is FILE needed; if not is this enum needed, or can we
     // use FileFormatI for PDB, MMCIF?
-    PDB("pdb", "pdb"), MMCIF("mmcif", "cif"), FILE("?", "?");
+    PDB("pdb", "pdb"), MMCIF("mmcif", "cif"), BCIF("bcif","bcif"),FILE("?", "?");
 
     /*
      * file extension for cached structure file; must be one that
@@ -404,7 +413,10 @@ public class PDBEntry
           // this shouldn't happen, but could do if the id from the
           // file is not the same as the id from the authority that provided
           // the file
-          return false;
+          if (!newEntry.fakedPDBId() && !isAuthoritative())
+          {
+            return false;
+          } // otherwise we can update
         }
       }
     }
@@ -469,6 +481,11 @@ public class PDBEntry
        */
       String key = newProps.nextElement();
       Object value = newEntry.getProperty(key);
+      if (FAKED_ID.equals(key) || AUTHORITATIVE_ID.equals(key))
+      {
+        // we never update the fake ID property
+        continue;
+      }
       if (!value.equals(getProperty(key)))
       {
         setProperty(key, value);
@@ -477,16 +494,77 @@ public class PDBEntry
     return true;
   }
   
+  public void setAuthoritative(boolean isAuthoritative)
+  {
+    setProperty(AUTHORITATIVE_ID, Boolean.valueOf(isAuthoritative));
+  }
+  
+  /**
+   * 
+   * @return true if the identifier should be preferred over any identifiers
+   *         embedded in the structure data
+   */
+  public boolean isAuthoritative()
+  {
+    if (_hasProperty(AUTHORITATIVE_ID))
+    {
+      return ((Boolean)getProperty(AUTHORITATIVE_ID));
+    }
+    return false;
+  }
+
+  /**
+   * set when Jalview has manufactured the ID using a local filename
+   * @return
+   */
+  public boolean fakedPDBId()
+  {
+    if (_hasProperty(FAKED_ID))
+    {
+      return true;
+    }
+    return false;
+  }
+  public void setFakedPDBId(boolean faked)
+  {
+    if (faked)
+    {
+      setProperty(FAKED_ID, Boolean.TRUE);
+    }
+    else 
+    {
+      if (properties!=null) {
+        properties.remove(FAKED_ID);
+      }
+    }
+  }
+
+  private boolean _hasProperty(final String key)
+  {
+    return (properties != null && properties.containsKey(key));
+  }
+
+  private static final String RETRIEVE_FROM = "RETRIEVE_FROM";
+
+  private static final String PROVIDER = "PROVIDER";
+
+  private static final String MODELPAGE = "PROVIDERPAGE";
 
-  private static final String RETRIEVE_FROM="RETRIEVE_FROM";
   /**
    * Permanent URI for retrieving the original structure data
+   * 
    * @param urlStr
    */
   public void setRetrievalUrl(String urlStr)
   {
     setProperty(RETRIEVE_FROM, urlStr);
   }
+
+  public boolean hasRetrievalUrl()
+  {
+    return _hasProperty(RETRIEVE_FROM);
+  }
+
   /**
    * get the Permanent URI for retrieving the original structure data
    */
@@ -495,8 +573,50 @@ public class PDBEntry
     return (String) getProperty(RETRIEVE_FROM);
   }
 
-  public boolean hasRetrievalUrl()
+  /**
+   * Data provider name - from 3D Beacons
+   * 
+   * @param provider
+   */
+  public void setProvider(String provider)
+  {
+    setProperty(PROVIDER, provider);
+  }
+
+  /**
+   * Get Data provider name - from 3D Beacons
+   * 
+   */
+  public String getProvider()
+  {
+    return (String) getProperty(PROVIDER);
+  }
+
+  /**
+   * Permanent URI for retrieving the original structure data
+   * 
+   * @param urlStr
+   */
+  public void setProviderPage(String urlStr)
+  {
+    setProperty(MODELPAGE, urlStr);
+  }
+
+  /**
+   * get the Permanent URI for retrieving the original structure data
+   */
+  public String getProviderPage()
+  {
+    return (String) getProperty(MODELPAGE);
+  }
+
+  public boolean hasProviderPage()
+  {
+    return _hasProperty(MODELPAGE);
+  }
+
+  public boolean hasProvider()
   {
-    return (properties!=null && properties.containsKey(RETRIEVE_FROM));
+    return _hasProperty(PROVIDER);
   }
 }