JAL-1803 chainCode moved onto property hashtable as chain_code
[jalview.git] / src / jalview / datamodel / PDBEntry.java
index 2c44a57..673c12a 100755 (executable)
@@ -1,31 +1,97 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * 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.
- * 
+ * 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/>.
+ * 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 java.util.*;
+import java.util.Hashtable;
 
 public class PDBEntry
 {
-  String file;
+  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));
+    }
+  }
+
+  public final class ChainId
+  {
+    String chainId;
 
-  String type;
+    public ChainId(String chainId)
+    {
+      this.chainId = chainId;
+    }
 
-  String id;
+    @Override
+    public String toString()
+    {
+      return chainId;
+    }
+
+    @Override
+    public boolean equals(Object o){
+      if (o==null)
+      {
+        return false;
+      }
+      return chainId.equalsIgnoreCase(o.toString());
+    }
+  }
+
+  /**
+   * constant for storing chain code in properties table
+   */
+  private static final String CHAIN_ID = "chain_code";
 
   Hashtable properties;
 
@@ -34,6 +100,7 @@ public class PDBEntry
    * 
    * @see java.lang.Object#equals(java.lang.Object)
    */
+  @Override
   public boolean equals(Object obj)
   {
     if (obj == null || !(obj instanceof PDBEntry))
@@ -41,23 +108,52 @@ public class PDBEntry
       return false;
     }
     if (obj == this)
+    {
       return true;
+    }
     PDBEntry o = (PDBEntry) obj;
-    return (file == o.file || (file != null && o.file != null && o.file
-            .equals(file)))
-            && (type == o.type || (type != null && o.type != null && o.type
-                    .equals(type)))
+    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)));
+                      .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;
@@ -79,9 +175,14 @@ public class PDBEntry
     return file;
   }
 
-  public void setType(String type)
+  public void setType(String t)
   {
-    this.type = type;
+    this.type = t;
+  }
+
+  public void setType(PDBEntry.Type type)
+  {
+    this.type = type == null ? null : type.toString();
   }
 
   public String getType()
@@ -109,4 +210,39 @@ public class PDBEntry
     return properties;
   }
 
+  /**
+   * 
+   * @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();
+  }
+
+  public void setChainCode(String chainCode)
+  {
+    if (properties == null)
+    {
+      if (chainCode == null)
+      {
+        // nothing to do.
+        return;
+      }
+      properties = new Hashtable();
+    }
+    if (chainCode == null)
+    {
+      properties.remove(CHAIN_ID);
+      return;
+    }
+    // update property for non-null chainCode
+    properties.put(CHAIN_ID, new ChainId(chainCode));
+  }
+
+  @Override
+  public String toString()
+  {
+    return id;
+  }
 }