JAL-1803 chainCode moved onto property hashtable as chain_code
[jalview.git] / src / jalview / datamodel / PDBEntry.java
index 69f0d68..673c12a 100755 (executable)
 /*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
- * This program 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 2
+ * 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.
- *
- * This program 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.
- *
+ *  
+ * 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 this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ * 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;
-  String type;
-  String id;
+  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;
+
+    public ChainId(String chainId)
+    {
+      this.chainId = chainId;
+    }
+
+    @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;
 
-  /* (non-Javadoc)
+  /*
+   * (non-Javadoc)
+   * 
    * @see java.lang.Object#equals(java.lang.Object)
    */
+  @Override
   public boolean equals(Object obj)
   {
-    if (obj==null || !(obj instanceof PDBEntry))
+    if (obj == null || !(obj instanceof PDBEntry))
     {
-        return false;
+      return false;
     }
-    if (obj==this)
+    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)))
-    && (id==o.id || (id!=null && o.id!=null && o.id.equalsIgnoreCase(id)))
-    && (properties==o.properties || (properties!=null && o.properties!=null && properties.equals(o.properties)));
+    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()
-  {}
-  public PDBEntry(PDBEntry entry) {
+  {
+  }
+
+  /**
+   * 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)
+    if (entry.properties != null)
     {
       properties = (Hashtable) entry.properties.clone();
     }
   }
+
   public void setFile(String file)
   {
     this.file = file;
@@ -65,9 +175,14 @@ public class PDBEntry
     return file;
   }
 
-  public void setType(String type)
+  public void setType(String t)
+  {
+    this.type = t;
+  }
+
+  public void setType(PDBEntry.Type type)
   {
-    this.type = type;
+    this.type = type == null ? null : type.toString();
   }
 
   public String getType()
@@ -95,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;
+  }
 }