Skip to content
This repository was archived by the owner on May 17, 2024. It is now read-only.

Commit b8cb31a

Browse files
committed
Swap from jsr305 to checker
1 parent 1cfb888 commit b8cb31a

28 files changed

+177
-132
lines changed

gradle/libs.versions.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
slf4jApi = "org.slf4j:slf4j-api:1.7.32"
33
junit = "junit:junit:4.8.2"
44
guava = "com.google.guava:guava:20.0"
5-
jsr305 = "com.google.code.findbugs:jsr305:1.3.9"
65
servletApi = "org.apache.tomcat:tomcat-servlet-api:7.0.8"
76
freemarker = "org.freemarker:freemarker:2.3.16"
87
easymock = "org.easymock:easymock:4.1"
98
commonsLang = "commons-lang:commons-lang:2.6"
109
hamcrest = "org.hamcrest:hamcrest-core:2.2"
10+
checkerQual = "org.checkerframework:checker-qual:3.42.0"

io/build.gradle

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@ dependencies {
66
implementation project(':util-core')
77
implementation libs.guava
88
implementation libs.slf4jApi
9+
api libs.checkerQual
910

1011
// This is a fake copy of the log4j1 Logger, which allows us to continue
1112
// accepting it in our deprecated method signatures without accidentially using
1213
// any of its functionality.
1314
compileOnly project(':log4j1dummyshim')
1415

15-
compileOnly libs.jsr305
16-
1716
testImplementation libs.junit
1817
}

io/src/main/java/com/indeed/util/io/Directories.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
package com.indeed.util.io;
33

44
import com.google.common.collect.Iterables;
5+
import org.checkerframework.checker.nullness.qual.NonNull;
56

6-
import javax.annotation.Nonnegative;
7-
import javax.annotation.Nonnull;
87
import java.io.IOException;
98
import java.nio.file.DirectoryIteratorException;
109
import java.nio.file.DirectoryStream;
@@ -26,8 +25,7 @@ public final class Directories {
2625
* @return number of inodes under it.
2726
* @throws IOException
2827
*/
29-
@Nonnegative
30-
public static int count(@Nonnull final Path dir) throws IOException {
28+
public static int count(@NonNull final Path dir) throws IOException {
3129
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
3230
return Iterables.size(stream);
3331
} catch (DirectoryIteratorException ex) {
@@ -48,8 +46,8 @@ public static int count(@Nonnull final Path dir) throws IOException {
4846
* @return all files in that directory
4947
* @throws IOException
5048
*/
51-
@Nonnull
52-
public static List<Path> list(@Nonnull final Path dir) throws IOException {
49+
@NonNull
50+
public static List<Path> list(@NonNull final Path dir) throws IOException {
5351
final List<Path> contents = new ArrayList<>();
5452
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
5553
for (final Path entry : stream) {

io/src/main/java/com/indeed/util/io/Files.java

+31-31
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import com.google.common.base.Preconditions;
66
import com.google.common.base.Supplier;
77
import com.google.common.hash.Hashing;
8+
import org.checkerframework.checker.nullness.qual.NonNull;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
1011

11-
import javax.annotation.Nonnull;
1212
import java.io.BufferedInputStream;
1313
import java.io.BufferedOutputStream;
1414
import java.io.BufferedReader;
@@ -67,7 +67,7 @@ public static String buildPath(String... parts) {
6767
* be written, flushed, synced, or closed
6868
*/
6969
public static void writeObjectToFileOrDie2(
70-
@Nonnull final Object obj, @Nonnull final String file) throws IOException {
70+
@NonNull final Object obj, @NonNull final String file) throws IOException {
7171
Preconditions.checkNotNull(file, "file argument is required!");
7272
Preconditions.checkArgument(!file.isEmpty(), "file argument is required!");
7373

@@ -106,18 +106,18 @@ public static void writeObjectToFileOrDie2(
106106
/** @deprecated Use {@link #writeObjectToFileOrDie2(java.lang.Object, java.lang.String)} */
107107
@Deprecated
108108
public static void writeObjectToFileOrDie(
109-
@Nonnull final Object obj,
110-
@Nonnull final String file,
111-
@Nonnull final org.apache.log4j.Logger log)
109+
@NonNull final Object obj,
110+
@NonNull final String file,
111+
final org.apache.log4j.@NonNull Logger log)
112112
throws IOException {
113113
writeObjectToFileOrDie2(obj, file);
114114
}
115115

116116
private static class ObjectOutputStreamCallback implements OutputStreamCallback {
117117
private long checksumForWrittenData = 0L;
118-
@Nonnull private final Object obj;
118+
@NonNull private final Object obj;
119119

120-
private ObjectOutputStreamCallback(@Nonnull Object obj) {
120+
private ObjectOutputStreamCallback(@NonNull Object obj) {
121121
this.obj = obj;
122122
}
123123

@@ -126,7 +126,7 @@ public long getChecksumValue() {
126126
}
127127

128128
@Override
129-
public void writeAndFlushData(@Nonnull OutputStream outputStream) throws IOException {
129+
public void writeAndFlushData(@NonNull OutputStream outputStream) throws IOException {
130130
final ChecksummingOutputStream checksummingOutputStream =
131131
new ChecksummingOutputStream(new BufferedOutputStream(outputStream));
132132
final ObjectOutputStream out = new ObjectOutputStream(checksummingOutputStream);
@@ -141,7 +141,7 @@ public void writeAndFlushData(@Nonnull OutputStream outputStream) throws IOExcep
141141
}
142142

143143
private static class ChecksummingOutputStream extends FilterOutputStream {
144-
@Nonnull private final Checksum checksummer;
144+
@NonNull private final Checksum checksummer;
145145

146146
private ChecksummingOutputStream(OutputStream out) {
147147
super(out);
@@ -177,13 +177,13 @@ public long getChecksumValue() {
177177
}
178178

179179
private static interface OutputStreamCallback {
180-
void writeAndFlushData(@Nonnull final OutputStream outputStream) throws IOException;
180+
void writeAndFlushData(@NonNull final OutputStream outputStream) throws IOException;
181181
}
182182

183183
// return a reference to a temp file that contains the written + flushed + fsynced + closed data
184-
@Nonnull
184+
@NonNull
185185
private static File writeDataToTempFileOrDie2(
186-
@Nonnull final OutputStreamCallback callback, @Nonnull final File targetFile)
186+
@NonNull final OutputStreamCallback callback, @NonNull final File targetFile)
187187
throws IOException {
188188
Preconditions.checkNotNull(callback, "callback argument is required!");
189189
Preconditions.checkNotNull(targetFile, "targetFile argument is required!");
@@ -229,18 +229,18 @@ private static File writeDataToTempFileOrDie2(
229229
* java.io.File)}
230230
*/
231231
@Deprecated
232-
@Nonnull
232+
@NonNull
233233
private static File writeDataToTempFileOrDie(
234-
@Nonnull final OutputStreamCallback callback,
235-
@Nonnull final File targetFile,
236-
@Nonnull final org.apache.log4j.Logger log)
234+
@NonNull final OutputStreamCallback callback,
235+
@NonNull final File targetFile,
236+
final org.apache.log4j.@NonNull Logger log)
237237
throws IOException {
238238
return writeDataToTempFileOrDie2(callback, targetFile);
239239
}
240240

241-
@Nonnull
241+
@NonNull
242242
private static File writeTextToTempFileOrDie2(
243-
@Nonnull final String[] text, @Nonnull final File targetFile) throws IOException {
243+
@NonNull final String[] text, @NonNull final File targetFile) throws IOException {
244244
Preconditions.checkNotNull(text, "callback argument is required!");
245245
Preconditions.checkNotNull(targetFile, "targetFile argument is required!");
246246

@@ -275,11 +275,11 @@ private static File writeTextToTempFileOrDie2(
275275

276276
/** @deprecated Use {@link #writeTextToTempFileOrDie2(java.lang.String[], java.io.File)} */
277277
@Deprecated
278-
@Nonnull
278+
@NonNull
279279
private static File writeTextToTempFileOrDie(
280-
@Nonnull final String[] text,
281-
@Nonnull final File targetFile,
282-
@Nonnull final org.apache.log4j.Logger log)
280+
@NonNull final String[] text,
281+
@NonNull final File targetFile,
282+
final org.apache.log4j.@NonNull Logger log)
283283
throws IOException {
284284
return writeTextToTempFileOrDie2(text, targetFile);
285285
}
@@ -297,7 +297,7 @@ private static File writeTextToTempFileOrDie(
297297
* synced, or closed
298298
*/
299299
public static boolean writeObjectIfChangedOrDie2(
300-
@Nonnull final Object obj, @Nonnull final String file) throws IOException {
300+
@NonNull final Object obj, @NonNull final String file) throws IOException {
301301
Preconditions.checkNotNull(file, "file argument is required!");
302302
Preconditions.checkArgument(!file.isEmpty(), "file argument is required!");
303303

@@ -364,15 +364,15 @@ public static boolean writeObjectIfChangedOrDie2(
364364
/** @deprecated Use {@link #writeObjectIfChangedOrDie2(java.lang.Object, java.lang.String)} */
365365
@Deprecated
366366
public static boolean writeObjectIfChangedOrDie(
367-
@Nonnull final Object obj,
368-
@Nonnull final String file,
369-
@Nonnull final org.apache.log4j.Logger log)
367+
@NonNull final Object obj,
368+
@NonNull final String file,
369+
final org.apache.log4j.@NonNull Logger log)
370370
throws IOException {
371371
return writeObjectIfChangedOrDie2(obj, file);
372372
}
373373

374374
public static long computeFileChecksum(
375-
@Nonnull final File file, @Nonnull final Checksum checksum) throws IOException {
375+
@NonNull final File file, @NonNull final Checksum checksum) throws IOException {
376376
return com.google.common.io.Files.asByteSource(file).hash(Hashing.crc32()).padToLong();
377377
}
378378

@@ -694,7 +694,7 @@ public static void writeToTextFile(String[] lines, String file) {
694694
}
695695

696696
public static void writeToTextFileOrDie(
697-
@Nonnull final String[] lines, @Nonnull final String file) throws IOException {
697+
@NonNull final String[] lines, @NonNull final String file) throws IOException {
698698
// Write out a temp file (or die)
699699
final File f = new File(file);
700700
final File temp = writeTextToTempFileOrDie2(lines, f);
@@ -778,7 +778,7 @@ public static boolean delete(String file) {
778778
* @return true if all deletions were successful, false if file did not exist
779779
* @throws IOException if deletion fails and the file still exists at the end
780780
*/
781-
public static boolean deleteOrDie(@Nonnull final String file) throws IOException {
781+
public static boolean deleteOrDie(@NonNull final String file) throws IOException {
782782
// this returns true if the file was actually deleted
783783
// and false for 2 cases:
784784
// 1. file did not exist to start with
@@ -893,8 +893,8 @@ public static String getFileHash(final String file, final String algorithm)
893893
* Converts a byte array to a hex string. The String returned will be of length exactly {@code
894894
* bytes.length * 2}.
895895
*/
896-
@Nonnull
897-
public static String toHex(@Nonnull final byte[] bytes) {
896+
@NonNull
897+
public static String toHex(@NonNull final byte[] bytes) {
898898
StringBuilder buf = new StringBuilder(bytes.length * 2);
899899
for (byte b : bytes) {
900900
String hexDigits = Integer.toHexString((int) b & 0x00ff);

io/src/main/java/com/indeed/util/io/SafeFiles.java

+12-14
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
import com.google.common.base.Charsets;
55
import com.google.common.base.Throwables;
66
import com.indeed.util.core.io.Closeables2;
7+
import com.indeed.util.core.nullsafety.ParametersAreNonnullByDefault;
8+
import org.checkerframework.checker.nullness.qual.NonNull;
79
import org.slf4j.Logger;
810
import org.slf4j.LoggerFactory;
911

10-
import javax.annotation.Nonnegative;
11-
import javax.annotation.Nonnull;
12-
import javax.annotation.ParametersAreNonnullByDefault;
13-
import javax.annotation.concurrent.NotThreadSafe;
1412
import java.io.IOException;
1513
import java.io.OutputStream;
1614
import java.nio.ByteBuffer;
@@ -93,17 +91,15 @@ public static void ensureDirectoryExists(final Path path) throws IOException {
9391
* @return number of NormalFiles fsynced (not including directories).
9492
* @throws IOException in the event that we could not fsync the provided directory.
9593
*/
96-
@Nonnegative
9794
public static int fsyncRecursive(final Path root) throws IOException {
9895
final FsyncingSimpleFileVisitor visitor = new FsyncingSimpleFileVisitor();
9996
Files.walkFileTree(root, visitor);
10097
return visitor.getFileCount();
10198
}
10299

103100
private static class FsyncingSimpleFileVisitor extends SimpleFileVisitor<Path> {
104-
@Nonnegative private int fileCount = 0;
101+
private int fileCount = 0;
105102

106-
@Nonnegative
107103
public int getFileCount() {
108104
return fileCount;
109105
}
@@ -214,7 +210,7 @@ public static void write(final byte[] data, final Path path) throws IOException
214210
* @return handle to opened temp file
215211
* @throws IOException in the event that the file could not be created.
216212
*/
217-
@Nonnull
213+
@NonNull
218214
public static SafeOutputStream createAtomicFile(final Path path) throws IOException {
219215
final Path dir = path.getParent();
220216
final Path name = path.getFileName();
@@ -264,15 +260,17 @@ public static void deleteIfExistsQuietly(final Path path) {
264260
}
265261
}
266262

267-
/** @see SafeFiles#createAtomicFile(Path) */
263+
/**
264+
* @see SafeFiles#createAtomicFile(Path)
265+
* <p>NotThreadSafe
266+
*/
268267
@ParametersAreNonnullByDefault
269-
@NotThreadSafe
270268
private static class SafeFileOutputStream extends SafeOutputStream {
271-
@Nonnull private final Path path;
272-
@Nonnull private final Path tempFile;
269+
@NonNull private final Path path;
270+
@NonNull private final Path tempFile;
273271

274-
@Nonnull private final OutputStream out; // do not close this
275-
@Nonnull private final FileChannel fileChannel; // only close this
272+
@NonNull private final OutputStream out; // do not close this
273+
@NonNull private final FileChannel fileChannel; // only close this
276274

277275
private boolean closed = false;
278276

io/src/main/java/com/indeed/util/io/SafeOutputStream.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
// Copyright 2015 Indeed
22
package com.indeed.util.io;
33

4-
import javax.annotation.Nonnull;
5-
import javax.annotation.concurrent.NotThreadSafe;
4+
import org.checkerframework.checker.nullness.qual.NonNull;
5+
66
import java.io.Closeable;
77
import java.io.IOException;
88
import java.io.OutputStream;
99
import java.nio.ByteBuffer;
1010
import java.nio.channels.WritableByteChannel;
1111
import java.nio.file.Path;
1212

13-
/** @see SafeFiles#createAtomicFile(Path) */
14-
@NotThreadSafe
13+
/**
14+
* @see SafeFiles#createAtomicFile(Path)
15+
* <p>Not Thread Safe
16+
*/
1517
public abstract class SafeOutputStream extends OutputStream
1618
implements WritableByteChannel, Closeable {
1719
/**
@@ -25,7 +27,7 @@ public abstract class SafeOutputStream extends OutputStream
2527
* @throws IOException in the event that the buffer could not be written.
2628
*/
2729
@Override
28-
public abstract int write(@Nonnull final ByteBuffer src) throws IOException;
30+
public abstract int write(@NonNull final ByteBuffer src) throws IOException;
2931

3032
/**
3133
* Commit causes the current atomic file writing operation to conclude and the current temp file

io/src/main/java/com/indeed/util/io/checkpointer/FileBasedCheckpointer.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.google.common.base.Preconditions;
55
import com.indeed.util.io.BufferedFileDataOutputStream;
66
import com.indeed.util.serialization.Stringifier;
7+
import org.checkerframework.checker.nullness.qual.NonNull;
78

8-
import javax.annotation.Nonnull;
99
import java.io.BufferedReader;
1010
import java.io.File;
1111
import java.io.IOException;
@@ -23,17 +23,17 @@ public class FileBasedCheckpointer<T> implements Checkpointer<T> {
2323
private volatile T value;
2424

2525
public FileBasedCheckpointer(
26-
@Nonnull final File checkpointFile,
27-
@Nonnull Stringifier<T> stringifier,
28-
@Nonnull T defaultValue)
26+
@NonNull final File checkpointFile,
27+
@NonNull Stringifier<T> stringifier,
28+
@NonNull T defaultValue)
2929
throws IOException {
3030
this(checkpointFile.toPath(), stringifier, defaultValue);
3131
}
3232

3333
public FileBasedCheckpointer(
34-
@Nonnull final Path checkpointFilePath,
35-
@Nonnull Stringifier<T> stringifier,
36-
@Nonnull T defaultValue)
34+
@NonNull final Path checkpointFilePath,
35+
@NonNull Stringifier<T> stringifier,
36+
@NonNull T defaultValue)
3737
throws IOException {
3838
this.checkpointFilePath =
3939
Preconditions.checkNotNull(checkpointFilePath, "no checkpoint file");

log4j1dummyshim/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
plugins {
22
id 'java'
33
}
4+
5+
indeedOss.activateFeature 'java'

util-core/build.gradle

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ dependencies {
55
implementation project(':varexport')
66
implementation libs.guava
77
implementation libs.slf4jApi
8+
api libs.checkerQual
89

910
// This is a fake copy of the log4j1 Logger, which allows us to continue
1011
// accepting it in our deprecated method signatures without accidentially using
1112
// any of its functionality.
1213
compileOnly project(':log4j1dummyshim')
1314

14-
compileOnly libs.jsr305
15-
testCompileOnly libs.jsr305
16-
1715
testImplementation libs.junit
1816
}

0 commit comments

Comments
 (0)