/* * 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 java.util.Hashtable; public class PDBEntry { 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) * * @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 file) { this.file = file; } 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(Hashtable property) { this.properties = property; } public Hashtable getProperty() { 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; } /** * 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.getProperty() != null) { if (properties == null) { properties = new Hashtable(); } // TODO: getProperty -> Map for (Object p : newEntry.getProperty().keySet()) { if (properties.get(p) == null || !properties.get(p).equals(newEntry.getProperty().get(p))) { modified = true; } properties.put(p, newEntry.getProperty().get(p)); } } return modified; } }