/* * 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 . * 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 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) 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(); } 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 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 getProps() { return properties; } /** * Setter provided for Castor binding only. Application code should call * setProperty() instead. * * @deprecated * @return */ @Deprecated public void setProps(Hashtable 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 entry : newEntry.properties.entrySet()) { if (!entry.getValue().equals(getProperty(entry.getKey()))) { modified = true; } setProperty(entry.getKey(), entry.getValue()); } } return modified; } }