diff --git a/cffu-core/src/main/java/io/foldright/cffu/Cffu.java b/cffu-core/src/main/java/io/foldright/cffu/Cffu.java index 9fef6493b..eccea0c0d 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/Cffu.java +++ b/cffu-core/src/main/java/io/foldright/cffu/Cffu.java @@ -1,10 +1,11 @@ package io.foldright.cffu; -import edu.umd.cs.findbugs.annotations.*; +import edu.umd.cs.findbugs.annotations.CheckReturnValue; +import edu.umd.cs.findbugs.annotations.Nullable; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.jetbrains.annotations.Blocking; import org.jetbrains.annotations.Contract; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.*; import java.util.function.*; @@ -24,14 +25,11 @@ * @see CompletionStage * @see CompletableFuture */ -@ParametersAreNonnullByDefault -@ReturnValuesAreNonnullByDefault public final class Cffu implements Future, CompletionStage { - @NonNull private final CffuFactory fac; private final boolean isMinimalStage; - @NonNull + private final CompletableFuture cf; Cffu(CffuFactory cffuFactory, boolean isMinimalStage, CompletableFuture cf) { diff --git a/cffu-core/src/main/java/io/foldright/cffu/CffuFactory.java b/cffu-core/src/main/java/io/foldright/cffu/CffuFactory.java index f08466f99..0f6279df3 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/CffuFactory.java +++ b/cffu-core/src/main/java/io/foldright/cffu/CffuFactory.java @@ -1,16 +1,13 @@ package io.foldright.cffu; import edu.umd.cs.findbugs.annotations.CheckReturnValue; -import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault; import io.foldright.cffu.tuple.Tuple2; import io.foldright.cffu.tuple.Tuple3; import io.foldright.cffu.tuple.Tuple4; import io.foldright.cffu.tuple.Tuple5; import org.jetbrains.annotations.Contract; -import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.concurrent.ThreadSafe; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -43,10 +40,7 @@ * @see CompletableFuture */ @ThreadSafe -@ParametersAreNonnullByDefault -@ReturnValuesAreNonnullByDefault public final class CffuFactory { - @NonNull private final Executor defaultExecutor; private final boolean forbidObtrudeMethods; @@ -193,7 +187,6 @@ public Cffu runAsync(Runnable action, Executor executor) { * @see CompletableFuture#supplyAsync(Supplier) */ @CheckReturnValue(explanation = "should use the returned Cffu; otherwise, prefer method `runAsync`") - @SuppressWarnings("BoundedWildcard") public Cffu supplyAsync(Supplier supplier) { return supplyAsync(supplier, defaultExecutor); } @@ -209,7 +202,6 @@ public Cffu supplyAsync(Supplier supplier) { * @see CompletableFuture#supplyAsync(Supplier, Executor) */ @CheckReturnValue(explanation = "should use the returned Cffu; otherwise, prefer method `runAsync`") - @SuppressWarnings("BoundedWildcard") public Cffu supplyAsync(Supplier supplier, Executor executor) { return create(CompletableFuture.supplyAsync(supplier, executor)); } diff --git a/cffu-core/src/main/java/io/foldright/cffu/CffuFactoryBuilder.java b/cffu-core/src/main/java/io/foldright/cffu/CffuFactoryBuilder.java index 765061fc9..281fe3db9 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/CffuFactoryBuilder.java +++ b/cffu-core/src/main/java/io/foldright/cffu/CffuFactoryBuilder.java @@ -1,11 +1,8 @@ package io.foldright.cffu; -import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault; import io.foldright.cffu.spi.ExecutorWrapperProvider; import org.jetbrains.annotations.Contract; -import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.concurrent.ThreadSafe; import java.util.List; import java.util.ServiceLoader; @@ -25,10 +22,7 @@ * @see Cffu */ @ThreadSafe -@ParametersAreNonnullByDefault -@ReturnValuesAreNonnullByDefault public final class CffuFactoryBuilder { - @NonNull private final Executor defaultExecutor; private volatile boolean forbidObtrudeMethods = false; diff --git a/cffu-core/src/main/java/io/foldright/cffu/CffuState.java b/cffu-core/src/main/java/io/foldright/cffu/CffuState.java index 8a030adc1..2a6c382d4 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/CffuState.java +++ b/cffu-core/src/main/java/io/foldright/cffu/CffuState.java @@ -1,9 +1,7 @@ package io.foldright.cffu; -import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault; import org.jetbrains.annotations.Contract; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.Future; import static java.util.Objects.requireNonNull; @@ -17,8 +15,6 @@ * @see CompletableFutureUtils#state(Future) * @see Cffu#cffuState() */ -@ParametersAreNonnullByDefault -@ReturnValuesAreNonnullByDefault public enum CffuState { /** * The task has not completed. diff --git a/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java b/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java index 93391fd93..655239e0a 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java +++ b/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java @@ -1,7 +1,6 @@ package io.foldright.cffu; import edu.umd.cs.findbugs.annotations.Nullable; -import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault; import io.foldright.cffu.tuple.Tuple2; import io.foldright.cffu.tuple.Tuple3; import io.foldright.cffu.tuple.Tuple4; @@ -9,7 +8,6 @@ import org.jetbrains.annotations.Blocking; import org.jetbrains.annotations.Contract; -import javax.annotation.ParametersAreNonnullByDefault; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -28,8 +26,6 @@ * * @author Jerry Lee (oldratlee at gmail dot com) */ -@ParametersAreNonnullByDefault -@ReturnValuesAreNonnullByDefault public final class CompletableFutureUtils { //////////////////////////////////////////////////////////////////////////////// //# allOf*/mostResultsOfSuccess methods @@ -1355,6 +1351,7 @@ C peekAsync(C cf, BiConsumer action, Executor exec } @Nullable + @SuppressWarnings("SameReturnValue") private static T reportException(String msg, Throwable ex) { StringWriter sw = new StringWriter(4096); PrintWriter writer = new PrintWriter(sw); diff --git a/cffu-core/src/main/java/io/foldright/cffu/DelayExecutionHelpers.java b/cffu-core/src/main/java/io/foldright/cffu/DelayExecutionHelpers.java index 08f3b43df..43552b89f 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/DelayExecutionHelpers.java +++ b/cffu-core/src/main/java/io/foldright/cffu/DelayExecutionHelpers.java @@ -6,13 +6,15 @@ // below code is copied from CompletableFuture with small adoption //////////////////////////////////////////////////////////////////////////////// -import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.*; import java.util.function.BiConsumer; import java.util.function.Supplier; +import static java.util.Objects.requireNonNull; + /** * Singleton delay scheduler, used only for starting and cancelling tasks @@ -34,7 +36,7 @@ static ScheduledFuture delay(Runnable command, long delay, TimeUnit unit) { * @return a Future can be used to cancel the delayed task(timeout CF) * @see FutureCanceller */ - public static ScheduledFuture delayToTimoutCf(CompletableFuture cf, long delay, TimeUnit unit) { + static ScheduledFuture delayToTimoutCf(CompletableFuture cf, long delay, TimeUnit unit) { return delay(new CfTimeout(cf), delay, unit); } @@ -42,8 +44,8 @@ public static ScheduledFuture delayToTimoutCf(CompletableFuture cf, long d * @return a Future can be used to cancel the delayed task(complete CF) * @see FutureCanceller */ - public static ScheduledFuture delayToCompleteCf( - CompletableFuture cf, T value, long delay, TimeUnit unit) { + static ScheduledFuture delayToCompleteCf( + CompletableFuture cf, @Nullable T value, long delay, TimeUnit unit) { return delay(new CfCompleter<>(cf, value), delay, unit); } @@ -78,7 +80,7 @@ private static class DelayerHolder { private static final class DaemonThreadFactory implements ThreadFactory { @Override - public Thread newThread(@NonNull Runnable r) { + public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setDaemon(true); t.setName(THREAD_NAME_OF_CFFU_DELAY_SCHEDULER); @@ -108,10 +110,9 @@ final class DelayedExecutor implements Executor { } @Override - public void execute(@NonNull Runnable r) { - Delayer.delay(new TaskSubmitter(executor, r), delay, unit); + public void execute(Runnable r) { + Delayer.delay(new TaskSubmitter(executor, requireNonNull(r, "runnable is null")), delay, unit); } - } //////////////////////////////////////////////////////////////////////////////// @@ -154,7 +155,7 @@ final class CfTimeout implements Runnable { @Override public void run() { - if (cf != null && !cf.isDone()) + if (!cf.isDone()) cf.completeExceptionally(new TimeoutException()); } } @@ -167,16 +168,17 @@ public void run() { @SuppressWarnings("JavadocReference") final class CfCompleter implements Runnable { private final CompletableFuture cf; + @Nullable private final T value; - CfCompleter(CompletableFuture cf, T value) { + CfCompleter(CompletableFuture cf, @Nullable T value) { this.cf = cf; this.value = value; } @Override public void run() { - if (cf != null) cf.complete(value); + cf.complete(value); } } @@ -191,14 +193,15 @@ public void run() { */ @SuppressWarnings("JavadocReference") final class FutureCanceller implements BiConsumer { + @Nullable private final Future f; FutureCanceller(Future f) { - this.f = f; + this.f = requireNonNull(f); } @Override - public void accept(Object ignore, Throwable ex) { + public void accept(Object ignore, @Nullable Throwable ex) { if (ex == null && f != null && !f.isDone()) f.cancel(false); } @@ -210,7 +213,9 @@ public void accept(Object ignore, Throwable ex) { @SuppressFBWarnings("SE_BAD_FIELD") final class CfCompleterBySupplier extends ForkJoinTask implements Runnable, CompletableFuture.AsynchronousCompletionTask { + @Nullable private CompletableFuture dep; + @Nullable private Supplier fn; CfCompleterBySupplier(CompletableFuture dep, Supplier fn) { @@ -257,7 +262,9 @@ public void run() { @SuppressFBWarnings("SE_BAD_FIELD") final class CfExCompleterBySupplier extends ForkJoinTask implements Runnable, CompletableFuture.AsynchronousCompletionTask { + @Nullable private CompletableFuture dep; + @Nullable private Supplier fn; CfExCompleterBySupplier(CompletableFuture dep, Supplier fn) { diff --git a/cffu-core/src/main/java/io/foldright/cffu/package-info.java b/cffu-core/src/main/java/io/foldright/cffu/package-info.java index 4a81deff2..9f56cf9bf 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/package-info.java +++ b/cffu-core/src/main/java/io/foldright/cffu/package-info.java @@ -10,4 +10,13 @@ * @see io.foldright.cffu.CffuFactoryBuilder * @see io.foldright.cffu.CompletableFutureUtils */ +@DefaultAnnotation(NonNull.class) +@ParametersAreNonnullByDefault +@ReturnValuesAreNonnullByDefault package io.foldright.cffu; + +import edu.umd.cs.findbugs.annotations.DefaultAnnotation; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault;