From ceb42f132220c71c7ad9a2948b24ee4f9e7df8e0 Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Sun, 30 Sep 2018 09:33:42 +0100 Subject: [PATCH] EverythingIsNonNull annotation (#4286) Adds an annotation EverythingIsNonNull, and fixes some nullability on public API. --- .../okhttp3/dnsoverhttps/package-info.java | 2 +- .../java/okhttp3/logging/package-info.java | 2 +- .../okhttp3/internal/sse/RealEventSource.java | 2 +- .../okhttp3/internal/sse/package-info.java | 2 +- .../main/java/okhttp3/sse/package-info.java | 2 +- .../internal/sse/EventSourceRecorder.java | 2 +- .../okhttp3/tls/HandshakeCertificates.java | 5 ++- .../java/okhttp3/tls/HeldCertificate.java | 13 ++++--- .../main/java/okhttp3/tls/package-info.java | 3 ++ .../src/main/java/okhttp3/package-info.java | 3 ++ .../src/main/java/okhttp3/Authenticator.java | 2 +- okhttp/src/main/java/okhttp3/Cookie.java | 6 +-- okhttp/src/main/java/okhttp3/RealCall.java | 3 +- okhttp/src/main/java/okhttp3/Request.java | 6 +-- okhttp/src/main/java/okhttp3/Response.java | 14 +++---- .../src/main/java/okhttp3/ResponseBody.java | 4 +- .../annotations/EverythingIsNonNull.java | 39 +++++++++++++++++++ .../src/main/java/okhttp3/package-info.java | 2 +- 18 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 okhttp-tls/src/main/java/okhttp3/tls/package-info.java create mode 100644 okhttp-urlconnection/src/main/java/okhttp3/package-info.java create mode 100644 okhttp/src/main/java/okhttp3/internal/annotations/EverythingIsNonNull.java diff --git a/okhttp-dnsoverhttps/src/main/java/okhttp3/dnsoverhttps/package-info.java b/okhttp-dnsoverhttps/src/main/java/okhttp3/dnsoverhttps/package-info.java index 1469a3bfa..54da565bc 100644 --- a/okhttp-dnsoverhttps/src/main/java/okhttp3/dnsoverhttps/package-info.java +++ b/okhttp-dnsoverhttps/src/main/java/okhttp3/dnsoverhttps/package-info.java @@ -1,3 +1,3 @@ /** A DNS over HTTPS implementation for OkHttp. */ -@javax.annotation.ParametersAreNonnullByDefault +@okhttp3.internal.annotations.EverythingIsNonNull package okhttp3.dnsoverhttps; diff --git a/okhttp-logging-interceptor/src/main/java/okhttp3/logging/package-info.java b/okhttp-logging-interceptor/src/main/java/okhttp3/logging/package-info.java index 39904701c..62d0ff576 100644 --- a/okhttp-logging-interceptor/src/main/java/okhttp3/logging/package-info.java +++ b/okhttp-logging-interceptor/src/main/java/okhttp3/logging/package-info.java @@ -1,3 +1,3 @@ /** An OkHttp interceptor which logs HTTP request and response data. */ -@javax.annotation.ParametersAreNonnullByDefault +@okhttp3.internal.annotations.EverythingIsNonNull package okhttp3.logging; diff --git a/okhttp-sse/src/main/java/okhttp3/internal/sse/RealEventSource.java b/okhttp-sse/src/main/java/okhttp3/internal/sse/RealEventSource.java index be60122fa..320ddddd9 100644 --- a/okhttp-sse/src/main/java/okhttp3/internal/sse/RealEventSource.java +++ b/okhttp-sse/src/main/java/okhttp3/internal/sse/RealEventSource.java @@ -35,7 +35,7 @@ public final class RealEventSource private final Request request; private final EventSourceListener listener; - private Call call; + private @Nullable Call call; public RealEventSource(Request request, EventSourceListener listener) { this.request = request; diff --git a/okhttp-sse/src/main/java/okhttp3/internal/sse/package-info.java b/okhttp-sse/src/main/java/okhttp3/internal/sse/package-info.java index 5993b09cd..afcf5f4f9 100644 --- a/okhttp-sse/src/main/java/okhttp3/internal/sse/package-info.java +++ b/okhttp-sse/src/main/java/okhttp3/internal/sse/package-info.java @@ -1,3 +1,3 @@ /** Private support classes for server-sent events. */ -@javax.annotation.ParametersAreNonnullByDefault +@okhttp3.internal.annotations.EverythingIsNonNull package okhttp3.internal.sse; diff --git a/okhttp-sse/src/main/java/okhttp3/sse/package-info.java b/okhttp-sse/src/main/java/okhttp3/sse/package-info.java index 6777492c9..2a5f88388 100644 --- a/okhttp-sse/src/main/java/okhttp3/sse/package-info.java +++ b/okhttp-sse/src/main/java/okhttp3/sse/package-info.java @@ -1,3 +1,3 @@ /** Support for server-sent events. */ -@javax.annotation.ParametersAreNonnullByDefault +@okhttp3.internal.annotations.EverythingIsNonNull package okhttp3.sse; diff --git a/okhttp-sse/src/test/java/okhttp3/internal/sse/EventSourceRecorder.java b/okhttp-sse/src/test/java/okhttp3/internal/sse/EventSourceRecorder.java index 2d2c8afce..cf4afd4ec 100644 --- a/okhttp-sse/src/test/java/okhttp3/internal/sse/EventSourceRecorder.java +++ b/okhttp-sse/src/test/java/okhttp3/internal/sse/EventSourceRecorder.java @@ -49,7 +49,7 @@ public final class EventSourceRecorder extends EventSourceListener { } @Override - public void onFailure(EventSource eventSource, Throwable t, @Nullable Response response) { + public void onFailure(EventSource eventSource, @Nullable Throwable t, @Nullable Response response) { Platform.get().log(Platform.INFO, "[ES] onFailure", t); events.add(new Failure(t, response)); } diff --git a/okhttp-tls/src/main/java/okhttp3/tls/HandshakeCertificates.java b/okhttp-tls/src/main/java/okhttp3/tls/HandshakeCertificates.java index 015eb81ed..34e9e9a49 100644 --- a/okhttp-tls/src/main/java/okhttp3/tls/HandshakeCertificates.java +++ b/okhttp-tls/src/main/java/okhttp3/tls/HandshakeCertificates.java @@ -22,6 +22,7 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.annotation.Nullable; import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; @@ -110,8 +111,8 @@ public final class HandshakeCertificates { } public static final class Builder { - private HeldCertificate heldCertificate; - private X509Certificate[] intermediates; + private @Nullable HeldCertificate heldCertificate; + private @Nullable X509Certificate[] intermediates; private final List trustedCertificates = new ArrayList<>(); diff --git a/okhttp-tls/src/main/java/okhttp3/tls/HeldCertificate.java b/okhttp-tls/src/main/java/okhttp3/tls/HeldCertificate.java index 68f16db23..5f4b56096 100644 --- a/okhttp-tls/src/main/java/okhttp3/tls/HeldCertificate.java +++ b/okhttp-tls/src/main/java/okhttp3/tls/HeldCertificate.java @@ -32,6 +32,7 @@ import java.util.Date; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; import javax.security.auth.x500.X500Principal; import okio.ByteString; import org.bouncycastle.asn1.ASN1Encodable; @@ -203,14 +204,14 @@ public final class HeldCertificate { private long notBefore = -1L; private long notAfter = -1L; - private String cn; - private String ou; + private @Nullable String cn; + private @Nullable String ou; private final List altNames = new ArrayList<>(); - private BigInteger serialNumber; - private KeyPair keyPair; - private HeldCertificate signedBy; + private @Nullable BigInteger serialNumber; + private @Nullable KeyPair keyPair; + private @Nullable HeldCertificate signedBy; private int maxIntermediateCas = -1; - private String keyAlgorithm; + private @Nullable String keyAlgorithm; private int keySize; public Builder() { diff --git a/okhttp-tls/src/main/java/okhttp3/tls/package-info.java b/okhttp-tls/src/main/java/okhttp3/tls/package-info.java new file mode 100644 index 000000000..061e524be --- /dev/null +++ b/okhttp-tls/src/main/java/okhttp3/tls/package-info.java @@ -0,0 +1,3 @@ +/** OkHttp Transport Layer Security (TLS) library. */ +@okhttp3.internal.annotations.EverythingIsNonNull +package okhttp3.tls; diff --git a/okhttp-urlconnection/src/main/java/okhttp3/package-info.java b/okhttp-urlconnection/src/main/java/okhttp3/package-info.java new file mode 100644 index 000000000..1ded0dc6e --- /dev/null +++ b/okhttp-urlconnection/src/main/java/okhttp3/package-info.java @@ -0,0 +1,3 @@ +/** Support for JDK provider APIs. */ +@okhttp3.internal.annotations.EverythingIsNonNull +package okhttp3; diff --git a/okhttp/src/main/java/okhttp3/Authenticator.java b/okhttp/src/main/java/okhttp3/Authenticator.java index c8b2451b7..016d48200 100644 --- a/okhttp/src/main/java/okhttp3/Authenticator.java +++ b/okhttp/src/main/java/okhttp3/Authenticator.java @@ -62,7 +62,7 @@ import javax.annotation.Nullable; public interface Authenticator { /** An authenticator that knows no credentials and makes no attempt to authenticate. */ Authenticator NONE = new Authenticator() { - @Override public Request authenticate(Route route, Response response) { + @Override public Request authenticate(@Nullable Route route, Response response) { return null; } }; diff --git a/okhttp/src/main/java/okhttp3/Cookie.java b/okhttp/src/main/java/okhttp3/Cookie.java index fbfa99c26..7a4f24ba2 100644 --- a/okhttp/src/main/java/okhttp3/Cookie.java +++ b/okhttp/src/main/java/okhttp3/Cookie.java @@ -458,10 +458,10 @@ public final class Cookie { * #domain() domain} values must all be set before calling {@link #build}. */ public static final class Builder { - String name; - String value; + @Nullable String name; + @Nullable String value; long expiresAt = HttpDate.MAX_DATE; - String domain; + @Nullable String domain; String path = "/"; boolean secure; boolean httpOnly; diff --git a/okhttp/src/main/java/okhttp3/RealCall.java b/okhttp/src/main/java/okhttp3/RealCall.java index 808b3dc7b..9bd403a72 100644 --- a/okhttp/src/main/java/okhttp3/RealCall.java +++ b/okhttp/src/main/java/okhttp3/RealCall.java @@ -18,6 +18,7 @@ package okhttp3; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import javax.annotation.Nullable; import okhttp3.internal.NamedRunnable; import okhttp3.internal.cache.CacheInterceptor; import okhttp3.internal.connection.ConnectInterceptor; @@ -38,7 +39,7 @@ final class RealCall implements Call { * There is a cycle between the {@link Call} and {@link EventListener} that makes this awkward. * This will be set after we create the call instance then create the event listener instance. */ - private EventListener eventListener; + private @Nullable EventListener eventListener; /** The application's original request unadulterated by redirects or auth headers. */ final Request originalRequest; diff --git a/okhttp/src/main/java/okhttp3/Request.java b/okhttp/src/main/java/okhttp3/Request.java index 7ffb00c1a..df0bebd02 100644 --- a/okhttp/src/main/java/okhttp3/Request.java +++ b/okhttp/src/main/java/okhttp3/Request.java @@ -35,7 +35,7 @@ public final class Request { final @Nullable RequestBody body; final Map, Object> tags; - private volatile CacheControl cacheControl; // Lazily initialized. + private volatile @Nullable CacheControl cacheControl; // Lazily initialized. Request(Builder builder) { this.url = builder.url; @@ -117,10 +117,10 @@ public final class Request { } public static class Builder { - HttpUrl url; + @Nullable HttpUrl url; String method; Headers.Builder headers; - RequestBody body; + @Nullable RequestBody body; /** A mutable map of tags, or an immutable empty map if we don't have any. */ Map, Object> tags = Collections.emptyMap(); diff --git a/okhttp/src/main/java/okhttp3/Response.java b/okhttp/src/main/java/okhttp3/Response.java index 95d246c95..9c4951e6a 100644 --- a/okhttp/src/main/java/okhttp3/Response.java +++ b/okhttp/src/main/java/okhttp3/Response.java @@ -54,7 +54,7 @@ public final class Response implements Closeable { final long sentRequestAtMillis; final long receivedResponseAtMillis; - private volatile CacheControl cacheControl; // Lazily initialized. + private volatile @Nullable CacheControl cacheControl; // Lazily initialized. Response(Builder builder) { this.request = builder.request; @@ -302,16 +302,16 @@ public final class Response implements Closeable { } public static class Builder { - Request request; - Protocol protocol; + @Nullable Request request; + @Nullable Protocol protocol; int code = -1; String message; @Nullable Handshake handshake; Headers.Builder headers; - ResponseBody body; - Response networkResponse; - Response cacheResponse; - Response priorResponse; + @Nullable ResponseBody body; + @Nullable Response networkResponse; + @Nullable Response cacheResponse; + @Nullable Response priorResponse; long sentRequestAtMillis; long receivedResponseAtMillis; diff --git a/okhttp/src/main/java/okhttp3/ResponseBody.java b/okhttp/src/main/java/okhttp3/ResponseBody.java index 73c6b93aa..9b06b6ea8 100644 --- a/okhttp/src/main/java/okhttp3/ResponseBody.java +++ b/okhttp/src/main/java/okhttp3/ResponseBody.java @@ -102,7 +102,7 @@ import static okhttp3.internal.Util.UTF_8; */ public abstract class ResponseBody implements Closeable { /** Multiple calls to {@link #charStream()} must return the same instance. */ - private Reader reader; + private @Nullable Reader reader; public abstract @Nullable MediaType contentType(); @@ -241,7 +241,7 @@ public abstract class ResponseBody implements Closeable { private final Charset charset; private boolean closed; - private Reader delegate; + private @Nullable Reader delegate; BomAwareReader(BufferedSource source, Charset charset) { this.source = source; diff --git a/okhttp/src/main/java/okhttp3/internal/annotations/EverythingIsNonNull.java b/okhttp/src/main/java/okhttp3/internal/annotations/EverythingIsNonNull.java new file mode 100644 index 000000000..e97bb4d9c --- /dev/null +++ b/okhttp/src/main/java/okhttp3/internal/annotations/EverythingIsNonNull.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2018 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package okhttp3.internal.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +/** + * Extends {@code ParametersAreNonnullByDefault} to also apply to Method results and fields. + * + * @see javax.annotation.ParametersAreNonnullByDefault + */ +@Documented +@Nonnull +@TypeQualifierDefault({ + ElementType.FIELD, + ElementType.METHOD, + ElementType.PARAMETER +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EverythingIsNonNull { } diff --git a/okhttp/src/main/java/okhttp3/package-info.java b/okhttp/src/main/java/okhttp3/package-info.java index a34c5bbf8..725b05436 100644 --- a/okhttp/src/main/java/okhttp3/package-info.java +++ b/okhttp/src/main/java/okhttp3/package-info.java @@ -1,3 +1,3 @@ /** An HTTP+HTTP/2 client for Android and Java applications. */ -@javax.annotation.ParametersAreNonnullByDefault +@okhttp3.internal.annotations.EverythingIsNonNull package okhttp3;