JAL-2196 refactor PDBEntry.getProperty,setProperty,getProperties
[jalview.git] / src / jalview / datamodel / PDBEntry.java
index 398eae3..7c2d290 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.datamodel;\r
-\r
-import java.util.*;\r
-public class PDBEntry\r
-{\r
-  String file;\r
-  String type;\r
-  String id;\r
-  Hashtable properties;\r
-\r
-  public PDBEntry()\r
-  {  }\r
-\r
-  public void setFile(String file)\r
-  { this.file = file; }\r
-\r
-  public String getFile()\r
-  {  return file; }\r
-\r
-  public void setType(String type)\r
-  { this.type = type; }\r
-\r
-  public String getType()\r
-  { return type; }\r
-\r
-  public void setId(String id)\r
-  { this.id = id; }\r
-\r
-  public String getId()\r
-  { return id; }\r
-\r
-  public void setProperty(Hashtable property)\r
-  {\r
-    this.properties = property;\r
-  }\r
-\r
-  public Hashtable getProperty()\r
-  {\r
-    return properties;\r
-  }\r
-\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.datamodel;
+
+import jalview.util.CaseInsensitiveString;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map.Entry;
+
+public class PDBEntry
+{
+
+  /**
+   * constant for storing chain code in properties table
+   */
+  private static final String CHAIN_ID = "chain_code";
+
+  Hashtable<String, Object> properties;
+
+  private String file;
+
+  private String type;
+
+  private String id;
+
+  public enum Type
+  {
+    PDB, MMCIF, FILE;
+    /**
+     * case insensitive matching for Type enum
+     * 
+     * @param value
+     * @return
+     */
+    public static Type getType(String value)
+    {
+      for (Type t : Type.values())
+      {
+        if (t.toString().equalsIgnoreCase(value))
+        {
+          return t;
+        }
+      }
+      return null;
+    }
+
+    /**
+     * case insensitive equivalence for strings resolving to PDBEntry type
+     * 
+     * @param t
+     * @return
+     */
+    public boolean matches(String t)
+    {
+      return (this.toString().equalsIgnoreCase(t));
+    }
+  }
+
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.lang.Object#equals(java.lang.Object)
+   */
+  @Override
+  public boolean equals(Object obj)
+  {
+    if (obj == null || !(obj instanceof PDBEntry))
+    {
+      return false;
+    }
+    if (obj == this)
+    {
+      return true;
+    }
+    PDBEntry o = (PDBEntry) obj;
+    return (type == o.type || (type != null && o.type != null && o.type
+            .equals(type)))
+            && (id == o.id || (id != null && o.id != null && o.id
+                    .equalsIgnoreCase(id)))
+            && (properties == o.properties || (properties != null
+                    && o.properties != null && properties
+                      .equals(o.properties)));
+
+  }
+
+  /**
+   * Default constructor
+   */
+  public PDBEntry()
+  {
+  }
+
+  /**
+   * Constructor given file path and PDB id.
+   * 
+   * @param filePath
+   */
+  // public PDBEntry(String filePath, String pdbId)
+  // {
+  // this.file = filePath;
+  // this.id = pdbId;
+  // }
+
+  public PDBEntry(String pdbId, String chain, PDBEntry.Type type,
+          String filePath)
+  {
+    this.id = pdbId;
+    this.type = type == null ? null : type.toString();
+    this.file = filePath;
+    setChainCode(chain);
+  }
+
+  /**
+   * Copy constructor.
+   * 
+   * @param entry
+   */
+  public PDBEntry(PDBEntry entry)
+  {
+    file = entry.file;
+    type = entry.type;
+    id = entry.id;
+    if (entry.properties != null)
+    {
+      properties = (Hashtable<String, Object>) entry.properties.clone();
+    }
+  }
+
+  public void setFile(String f)
+  {
+    this.file = f;
+  }
+
+  public String getFile()
+  {
+    return file;
+  }
+
+  public void setType(String t)
+  {
+    this.type = t;
+  }
+
+  public void setType(PDBEntry.Type type)
+  {
+    this.type = type == null ? null : type.toString();
+  }
+
+  public String getType()
+  {
+    return type;
+  }
+
+  public void setId(String id)
+  {
+    this.id = id;
+  }
+
+  public String getId()
+  {
+    return id;
+  }
+
+  public void setProperty(String key, Object value)
+  {
+    if (this.properties == null)
+    {
+      this.properties = new Hashtable<String, Object>();
+    }
+    properties.put(key, value);
+  }
+
+  public Object getProperty(String key)
+  {
+    return properties == null ? null : properties.get(key);
+  }
+
+  /**
+   * Returns an enumeration of the keys of this object's properties (or an empty
+   * enumeration if it has no properties)
+   * 
+   * @return
+   */
+  public Enumeration<String> getProperties()
+  {
+    if (properties == null)
+    {
+      return Collections.emptyEnumeration();
+    }
+    return properties.keys();
+  }
+
+  /**
+   * 
+   * @return null or a string for associated chain IDs
+   */
+  public String getChainCode()
+  {
+    return (properties == null || properties.get(CHAIN_ID) == null) ? null
+            : properties.get(CHAIN_ID).toString();
+  }
+
+  /**
+   * Sets a non-case-sensitive property for the given chain code. Two PDBEntry
+   * objects which differ only in the case of their chain code are considered
+   * equal. This avoids duplication of objects in lists of PDB ids.
+   * 
+   * @param chainCode
+   */
+  public void setChainCode(String chainCode)
+  {
+    if (chainCode == null)
+    {
+      deleteProperty(CHAIN_ID);
+    }
+    else
+    {
+      setProperty(CHAIN_ID, new CaseInsensitiveString(chainCode));
+    }
+  }
+
+  /**
+   * Deletes the property with the given key, and returns the deleted value (or
+   * null)
+   */
+  Object deleteProperty(String key)
+  {
+    Object result = null;
+    if (properties != null)
+    {
+      result = properties.remove(key);
+    }
+    return result;
+  }
+
+  @Override
+  public String toString()
+  {
+    return id;
+  }
+
+  /**
+   * Getter provided for Castor binding only. Application code should call
+   * getProperty() or getProperties() instead.
+   * 
+   * @deprecated
+   * @see #getProperty(String)
+   * @see #getProperties()
+   * @see jalview.ws.dbsources.Uniprot#getUniprotEntries
+   * @return
+   */
+  @Deprecated
+  public Hashtable<String, Object> getProps()
+  {
+    return properties;
+  }
+
+  /**
+   * Setter provided for Castor binding only. Application code should call
+   * setProperty() instead.
+   * 
+   * @deprecated
+   * @return
+   */
+  @Deprecated
+  public void setProps(Hashtable<String, Object> props)
+  {
+    properties = props;
+  }
+
+  /**
+   * update entry with details from another entry concerning the same PDB
+   * ID/file spec.
+   * 
+   * @param newEntry
+   * @return true if modifications were made
+   */
+  public boolean updateFrom(PDBEntry newEntry)
+  {
+    boolean modified = false;
+
+    if (getFile() == null)
+    {
+      // update file and type of file
+      modified = newEntry.getFile() != null;
+      setFile(newEntry.getFile());
+    }
+    if (newEntry.getType() != null && newEntry.getFile() != null
+            && newEntry.getFile().equals(getFile()))
+    {
+      setType(newEntry.getType());
+    }
+    if (getChainCode() == null
+            || (getChainCode() != null && getChainCode().length() == 0 && newEntry
+                    .getChainCode() != null))
+    {
+      modified |= (getChainCode() == null || !newEntry.getChainCode()
+              .equals(getChainCode()));
+      setChainCode(newEntry.getChainCode());
+    }
+    if (newEntry.properties != null)
+    {
+      for (Entry<String, Object> entry : newEntry.properties.entrySet())
+      {
+        if (!entry.getValue().equals(getProperty(entry.getKey())))
+        {
+          modified = true;
+        }
+        setProperty(entry.getKey(), entry.getValue());
+      }
+    }
+    return modified;
+  }
+}