/*
* 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 htsjdk.tribble.TribbleException;
/**
* information that identifies each header version
*/
public enum VCFHeaderVersion {
VCF3_2("VCRv3.2","format"),
VCF3_3("VCFv3.3","fileformat"),
VCF4_0("VCFv4.0","fileformat"),
VCF4_1("VCFv4.1","fileformat"),
VCF4_2("VCFv4.2","fileformat");
private final String versionString;
private final String formatString;
/**
* create the enum, privately, using:
* @param vString the version string
* @param fString the format string
*/
VCFHeaderVersion(String vString, String fString) {
this.versionString = vString;
this.formatString = fString;
}
/**
* get the header version
* @param version the version string
* @return a VCFHeaderVersion object
*/
public static VCFHeaderVersion toHeaderVersion(String version) {
version = clean(version);
for (VCFHeaderVersion hv : VCFHeaderVersion.values())
if (hv.versionString.equals(version))
return hv;
return null;
}
/**
* are we a valid version string of some type
* @param version the version string
* @return true if we're valid of some type, false otherwise
*/
public static boolean isVersionString(String version){
return toHeaderVersion(version) != null;
}
/**
* are we a valid format string for some type
* @param format the format string
* @return true if we're valid of some type, false otherwise
*/
public static boolean isFormatString(String format){
format = clean(format);
for (VCFHeaderVersion hv : VCFHeaderVersion.values())
if (hv.formatString.equals(format))
return true;
return false;
}
public static VCFHeaderVersion getHeaderVersion(String versionLine) {
String[] lineFields = versionLine.split("=");
if ( lineFields.length != 2 || !isFormatString(lineFields[0].substring(2)) )
throw new TribbleException.InvalidHeader(versionLine + " is not a valid VCF version line");
if ( !isVersionString(lineFields[1]) )
throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
return toHeaderVersion(lineFields[1]);
}
/**
* Utility function to clean up a VCF header string
*
* @param s string
* @return trimmed version of s
*/
private static String clean(String s) {
return s.trim();
}
/**
* Determines whether this version is at least as recent as a given version
*
* @param target the target version to compare against
* @return true if this version is at least as recent as the target version, false otherwise
*/
public boolean isAtLeastAsRecentAs(final VCFHeaderVersion target) {
switch (target) {
case VCF4_2:
return this == VCF4_2;
case VCF4_1:
return this == VCF4_1 || this == VCF4_2;
case VCF4_0:
return this != VCF3_2 && this != VCF3_3;
case VCF3_3:
return this != VCF3_2;
case VCF3_2:
default:
return true;
}
}
public String getVersionString() {
return versionString;
}
public String getFormatString() {
return formatString;
}
}