From afa0b96293a591232d3803f0f48e0bca67f5fb07 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 9 May 2019 13:17:23 +0100 Subject: [PATCH] Add utility method for null checks. --- .../bramble/api/nullsafety/NullSafety.java | 12 +++++++++++- .../bramble/api/transport/StreamContext.java | 5 +++-- .../bramble/api/transport/TransportKeySet.java | 5 +++-- .../bramble/transport/MutableTransportKeySet.java | 5 +++-- .../bramble/transport/TransportKeyManagerImpl.java | 4 ++++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java b/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java index 3aed01e5a..8e98561ee 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java @@ -6,10 +6,20 @@ import javax.annotation.Nullable; public class NullSafety { /** - * Stand-in for `Objects.requireNonNull()`. + * Stand-in for {@code Objects.requireNonNull()}. */ public static T requireNonNull(@Nullable T t) { if (t == null) throw new NullPointerException(); return t; } + + /** + * Checks that exactly one of the arguments is null. + * + * @throws AssertionError If both or neither of the arguments are null + */ + public static void requireExactlyOneNull(@Nullable Object a, + @Nullable Object b) { + if ((a == null) == (b == null)) throw new AssertionError(); + } } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StreamContext.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StreamContext.java index 0290d1eb8..c27abc891 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StreamContext.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/StreamContext.java @@ -9,6 +9,8 @@ import org.briarproject.bramble.api.plugin.TransportId; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireExactlyOneNull; + @Immutable @NotNullByDefault public class StreamContext { @@ -26,8 +28,7 @@ public class StreamContext { @Nullable PendingContactId pendingContactId, TransportId transportId, SecretKey tagKey, SecretKey headerKey, long streamNumber, boolean handshakeMode) { - if ((contactId == null) == (pendingContactId == null)) - throw new IllegalArgumentException(); + requireExactlyOneNull(contactId, pendingContactId); this.contactId = contactId; this.pendingContactId = pendingContactId; this.transportId = transportId; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeySet.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeySet.java index b5a22775f..7a3b1dc12 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeySet.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/TransportKeySet.java @@ -7,6 +7,8 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireExactlyOneNull; + /** * A set of keys for communicating with a given contact or pending contact * over a given transport. @@ -24,8 +26,7 @@ public class TransportKeySet { public TransportKeySet(KeySetId keySetId, @Nullable ContactId contactId, @Nullable PendingContactId pendingContactId, TransportKeys keys) { - if ((contactId == null) == (pendingContactId == null)) - throw new IllegalArgumentException(); + requireExactlyOneNull(contactId, pendingContactId); this.keySetId = keySetId; this.contactId = contactId; this.pendingContactId = pendingContactId; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/MutableTransportKeySet.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/MutableTransportKeySet.java index 89ef17726..55480107b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/MutableTransportKeySet.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/MutableTransportKeySet.java @@ -8,6 +8,8 @@ import org.briarproject.bramble.api.transport.KeySetId; import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireExactlyOneNull; + @NotThreadSafe @NotNullByDefault class MutableTransportKeySet { @@ -22,8 +24,7 @@ class MutableTransportKeySet { MutableTransportKeySet(KeySetId keySetId, @Nullable ContactId contactId, @Nullable PendingContactId pendingContactId, MutableTransportKeys keys) { - if ((contactId == null) == (pendingContactId == null)) - throw new IllegalArgumentException(); + requireExactlyOneNull(contactId, pendingContactId); this.keySetId = keySetId; this.contactId = contactId; this.pendingContactId = pendingContactId; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java index 7488d168c..ba31f851c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java @@ -36,6 +36,7 @@ import javax.annotation.concurrent.ThreadSafe; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireExactlyOneNull; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; import static org.briarproject.bramble.api.transport.TransportConstants.PROTOCOL_VERSION; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; @@ -136,6 +137,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { private void addKeys(KeySetId keySetId, @Nullable ContactId contactId, @Nullable PendingContactId pendingContactId, MutableTransportKeys keys) { + requireExactlyOneNull(contactId, pendingContactId); MutableTransportKeySet ks = new MutableTransportKeySet(keySetId, contactId, pendingContactId, keys); this.keys.put(keySetId, ks); @@ -184,6 +186,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { @Nullable private MutableTransportKeySet getOutgoingKeySet(@Nullable ContactId c, @Nullable PendingContactId p) { + requireExactlyOneNull(c, p); if (c == null) return pendingContactOutContexts.get(p); else return contactOutContexts.get(c); } @@ -475,6 +478,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { @Nullable PendingContactId pendingContactId, MutableIncomingKeys inKeys, long streamNumber, boolean handshakeMode) { + requireExactlyOneNull(contactId, pendingContactId); this.keySetId = keySetId; this.contactId = contactId; this.pendingContactId = pendingContactId;