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