diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java index 52522654e..0a7fd8ddc 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilder.java @@ -138,6 +138,11 @@ public class TribbleRMDTrackBuilder extends PluginManager implemen try { // if the file exists, and we can read it, load the index from disk if (indexFile.exists() && indexFile.canRead() && obtainedLock) { + + // check to see if the index file is out of date + if (indexFile.lastModified() < inputFile.lastModified()) + logger.warn("Tribble index file " + indexFile + " is older than the track file " + inputFile + ", this can lead to unexpected behavior"); + logger.info("Loading Tribble index from disk for file " + inputFile); return LinearIndex.createIndex(indexFile); } diff --git a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java index f0a272d10..b7ae2004c 100644 --- a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java @@ -24,6 +24,9 @@ package org.broadinstitute.sting.gatk.refdata.tracks.builders; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggingEvent; import org.broad.tribble.vcf.VCFCodec; import org.broadinstitute.sting.BaseTest; import org.junit.Assert; @@ -71,4 +74,55 @@ public class TribbleRMDTrackBuilderUnitTest extends BaseTest { Assert.assertTrue(Math.abs(1274210993000l - new File(vcfFile + TribbleRMDTrackBuilder.linearIndexExtension).lastModified()) < 100); } + + @Test + public void testBuilderIndexOutOfDate() { + Logger logger = Logger.getLogger(TribbleRMDTrackBuilder.class); + ValidationAppender appender = new ValidationAppender("Tribble index file /humgen/gsa-hpprojects/GATK/data/Validation_Data/ROD_validation/newerTribbleTrack.vcf.idx is older than the track file /humgen/gsa-hpprojects/GATK/data/Validation_Data/ROD_validation/newerTribbleTrack.vcf, this can lead to unexpected behavior"); + logger.addAppender(appender); + File vcfFile = new File(validationDataLocation + "/ROD_validation/newerTribbleTrack.vcf"); + try { + builder.loadIndex(vcfFile,new VCFCodec(), true); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail("IO exception unexpected" + e.getMessage()); + } + // check to make sure the appender saw the target string + Assert.assertTrue(appender.foundString()); + + } +} + +/** + * this appender looks for a specific message in the log4j stream. + * It can be used to verify that a specific message was generated to the logging system. + */ +class ValidationAppender extends AppenderSkeleton { + + private boolean foundString = false; + private String targetString = ""; + + public ValidationAppender(String target) { + targetString = target; + } + + @Override + protected void append(LoggingEvent loggingEvent) { + if (loggingEvent.getMessage().equals(targetString)) + foundString = true; + } + + @Override + public void close() { + // do nothing + } + + @Override + public boolean requiresLayout() { + return false; + } + + public boolean foundString() { + return foundString; + } }