/* * Copyright (c) 2012 The Broad Institute * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package htsjdk.variant.vcf; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @author ebanks * A class representing a key=value entry for simple VCF header types */ public class VCFSimpleHeaderLine extends VCFHeaderLine implements VCFIDHeaderLine { private String name; private Map<String, String> genericFields = new LinkedHashMap<String, String>(); /** * create a VCF filter header line * * @param key the key for this header line * @param name the name for this header line * @param description description for this header line */ public VCFSimpleHeaderLine(String key, String name, String description) { super(key, ""); Map<String, String> map = new LinkedHashMap<String, String>(1); map.put("Description", description); initialize(name, map); } /** * create a VCF info header line * * @param line the header line * @param version the vcf header version * @param key the key for this header line * @param expectedTagOrdering the tag ordering expected for this header line */ public VCFSimpleHeaderLine(final String line, final VCFHeaderVersion version, final String key, final List<String> expectedTagOrdering) { this(key, VCFHeaderLineTranslator.parseLine(version, line, expectedTagOrdering)); } public VCFSimpleHeaderLine(final String key, final Map<String, String> mapping) { super(key, ""); name = mapping.get("ID"); initialize(name, mapping); } /** * Returns the String value associated with the given key. Returns null if there is no value. Key * must not be null. */ String getGenericFieldValue(final String key) { return this.genericFields.get(key); } protected void initialize(String name, Map<String, String> genericFields) { if ( name == null || genericFields == null || genericFields.isEmpty() ) throw new IllegalArgumentException(String.format("Invalid VCFSimpleHeaderLine: key=%s name=%s", super.getKey(), name)); if ( name.contains("<") || name.contains(">") ) throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets"); if ( name.contains("=") ) throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain an equals sign"); this.name = name; this.genericFields.putAll(genericFields); } protected String toStringEncoding() { Map<String, Object> map = new LinkedHashMap<String, Object>(); map.put("ID", name); map.putAll(genericFields); return getKey() + "=" + VCFHeaderLine.toStringEncoding(map); } public boolean equals(Object o) { if ( !(o instanceof VCFSimpleHeaderLine) ) return false; VCFSimpleHeaderLine other = (VCFSimpleHeaderLine)o; if ( !name.equals(other.name) || genericFields.size() != other.genericFields.size() ) return false; for ( Map.Entry<String, String> entry : genericFields.entrySet() ) { if ( !entry.getValue().equals(other.genericFields.get(entry.getKey())) ) return false; } return true; } public String getID() { return name; } }