diff --git a/.travis.yml b/.travis.yml index 14dc650c21..8ca84626fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,9 +22,13 @@ matrix: env: TEST_TYPE=EXTERNAL_APIS - jdk: oraclejdk8 env: TEST_TYPE=FTP + - jdk: openjdk8 + env: SPOT_BUGS=true script: - - if [[ $TEST_TYPE == "FTP" ]]; then + - if [[ $SPOT_BUGS == "true" ]]; then + ./gradlew spotBugsMain spotBugsTest; + elif [[ $TEST_TYPE == "FTP" ]]; then ./gradlew testFTP jacocoTestReport; elif [[ $TEST_TYPE == "EXTERNAL_APIS" ]]; then ./gradlew testExternalApis jacocoTestReport; diff --git a/build.gradle b/build.gradle index 7edc16bd0b..7562a0aff5 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ plugins { id 'com.palantir.git-version' version '0.11.0' id 'com.github.johnrengelman.shadow' version '4.0.4' id 'com.github.maiflai.scalatest' version '0.23' + id 'com.github.spotbugs' version '1.6.9' } repositories { @@ -159,6 +160,18 @@ task sourcesJar(type: Jar) { archiveClassifier.set('sources') } +spotbugs { + reportLevel = 'high' + excludeFilter = file('gradle/spotbugs-exclude.xml') +} + +tasks.withType(com.github.spotbugs.SpotBugsTask) { + reports { + xml.enabled = false + html.enabled = true + } +} + publishing { publications { htsjdk(MavenPublication) { diff --git a/gradle/spotbugs-exclude.xml b/gradle/spotbugs-exclude.xml new file mode 100644 index 0000000000..8b46d5728c --- /dev/null +++ b/gradle/spotbugs-exclude.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java b/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java index 45d002e3e5..ece5735f78 100644 --- a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java +++ b/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java @@ -25,7 +25,6 @@ import htsjdk.samtools.util.CloseableIterator; -import java.io.Serializable; import java.util.Collection; import java.util.Map; import java.util.PriorityQueue; @@ -209,9 +208,7 @@ public SAMFileHeader getMergedHeader() { * sequence dictionary. I hate the fact that this extends SAMRecordCoordinateComparator, but it avoids * more copy & paste. */ - private class MergedSequenceDictionaryCoordinateOrderComparator extends SAMRecordCoordinateComparator implements Serializable { - private static final long serialVersionUID = 1L; - + private class MergedSequenceDictionaryCoordinateOrderComparator extends SAMRecordCoordinateComparator { @Override public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) { final int referenceIndex1 = getReferenceIndex(samRecord1); diff --git a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java b/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java index da418fd2d5..ffc424ec53 100644 --- a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java +++ b/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java @@ -71,14 +71,12 @@ private void writeHeader() { @Override public void writeReference(final BAMIndexContent content) { - final int reference = content.getReferenceSequence(); - if (content == null) { - writeNullContent(reference); - count++; - return; + throw new NullPointerException("BAMIndexContent cannot be null"); } + final int reference = content.getReferenceSequence(); + if (reference != count){ throw new SAMException("Reference on content is " + reference + " but expecting reference " + count); } @@ -162,6 +160,11 @@ private void writeChunkMetaData(final int reference, final BAMIndexMetaData meta } } + + private void writeNullContent() { + pw.println("Reference has n_bin=0"); + pw.println("Reference has n_intv=0"); + } private void writeNullContent(final int reference) { pw.println("Reference " + reference + " has n_bin=0"); diff --git a/src/main/java/htsjdk/samtools/cram/compression/rans/E14.java b/src/main/java/htsjdk/samtools/cram/compression/rans/E14.java index c483834579..bed11a83ad 100644 --- a/src/main/java/htsjdk/samtools/cram/compression/rans/E14.java +++ b/src/main/java/htsjdk/samtools/cram/compression/rans/E14.java @@ -43,7 +43,7 @@ static int compress(final ByteBuffer in, final RansEncSymbol[][] syms, // Deal with the remainder l3 = 0xFF & in.get(in_size - 1); for (i3 = in_size - 2; i3 > 4 * isz4 - 2 && i3 >= 0; i3--) { - final int c3 = 0xFF & in.get(i3 > -1 ? i3 : 0); + final int c3 = 0xFF & in.get(i3); rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3][l3]); l3 = c3; } diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java index b863000b32..a908ab2e29 100755 --- a/src/main/java/htsjdk/samtools/util/IOUtil.java +++ b/src/main/java/htsjdk/samtools/util/IOUtil.java @@ -70,7 +70,14 @@ public class IOUtil { public static final String COMPRESSED_VCF_INDEX_EXTENSION = ".tbi"; /** Possible extensions for VCF files and related formats. */ - public static final String[] VCF_EXTENSIONS = {VCF_FILE_EXTENSION, COMPRESSED_VCF_FILE_EXTENSION, BCF_FILE_EXTENSION}; + public static final List VCF_EXTENSIONS_LIST = Collections.unmodifiableList(Arrays.asList(VCF_FILE_EXTENSION, COMPRESSED_VCF_FILE_EXTENSION, BCF_FILE_EXTENSION)); + + /** + * Possible extensions for VCF files and related formats. + * @deprecated Use {@link #VCF_EXTENSIONS_LIST} instead. + */ + @Deprecated + public static final String[] VCF_EXTENSIONS = VCF_EXTENSIONS_LIST.toArray(new String[0]); public static final String INTERVAL_LIST_FILE_EXTENSION = IntervalList.INTERVAL_LIST_FILE_EXTENSION; diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index cec8a74c93..dd47602d29 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.Serializable; import java.lang.reflect.Array; import java.nio.file.Files; import java.nio.file.Path; @@ -645,9 +644,7 @@ class PeekFileRecordIterator extends PeekIterator { } } - class PeekFileRecordIteratorComparator implements Comparator, Serializable { - private static final long serialVersionUID = 1L; - + class PeekFileRecordIteratorComparator implements Comparator { @Override public int compare(final PeekFileRecordIterator lhs, final PeekFileRecordIterator rhs) { final int result = comparator.compare(lhs.peek(), rhs.peek()); diff --git a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java b/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java index 5db3b91a90..a36797e21f 100644 --- a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java +++ b/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java @@ -75,7 +75,7 @@ public String peek() { private class TupleIterator extends AbstractIterator> implements LocationAware { public TupleIterator() { - hasNext(); // Initialize the iterator, which appears to be a requirement of the parent class. TODO: Really? + super.hasNext(); // Initialize the iterator, which appears to be a requirement of the parent class. TODO: Really? } @Override