Use @Serial in util 08/102108/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 10 Aug 2022 19:59:37 +0000 (21:59 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 17 Aug 2022 07:28:29 +0000 (09:28 +0200)
This improves code safety quite a bit and allows us to perform a
long-needed audit.

Change-Id: I04161cfe8e6a367e1ae0d53a2628fbf72035ecde
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 14fb0b4eba9e86b7a6358f9c29527c9b9d1ec5f1)

common/util/src/main/java/org/opendaylight/yangtools/util/AbstractIdentifier.java
common/util/src/main/java/org/opendaylight/yangtools/util/AbstractStringIdentifier.java
common/util/src/main/java/org/opendaylight/yangtools/util/AbstractUUIDIdentifier.java
common/util/src/main/java/org/opendaylight/yangtools/util/ConstantArrayCollection.java
common/util/src/main/java/org/opendaylight/yangtools/util/ImmutableOffsetMap.java
common/util/src/main/java/org/opendaylight/yangtools/util/SharedSingletonMap.java
common/util/src/main/java/org/opendaylight/yangtools/util/SingletonSet.java
common/util/src/main/java/org/opendaylight/yangtools/util/concurrent/CachedThreadPoolExecutor.java
common/util/src/main/java/org/opendaylight/yangtools/util/concurrent/TrackingLinkedBlockingQueue.java
common/util/src/test/java/org/opendaylight/yangtools/util/concurrent/DeadlockDetectingListeningExecutorServiceTest.java
common/util/src/test/java/org/opendaylight/yangtools/util/concurrent/ReflectiveExceptionMapperTest.java

index 93c2da99b580b4a78dc013086158ded5bf09547d..85058df2f319cab74e5c8756cf9215e73867ae91 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.util;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
+import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Identifier;
 
@@ -17,11 +18,10 @@ import org.opendaylight.yangtools.concepts.Identifier;
  * An abstract {@link Identifier} backed by an immutable object. Subclasses have no control over {@link #hashCode()}
  * and {@link #equals(Object)}, hence they should not add any fields.
  *
- * @author Robert Varga
- *
  * @param <T> Object type
  */
 public abstract class AbstractIdentifier<T> implements Identifier {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull T value;
index 18f9ddc870bf024144950a7b9907dafa11d18e8d..90a3c061f3bf9b5aa47ff4072a4e1a47adac8298 100644 (file)
@@ -7,19 +7,17 @@
  */
 package org.opendaylight.yangtools.util;
 
-import com.google.common.annotations.Beta;
+import java.io.Serial;
 import java.util.UUID;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Identifier;
 
 /**
  * Utility {@link Identifier} backed by a {@link UUID}.
- *
- * @author Robert Varga
  */
-@Beta
 public abstract class AbstractStringIdentifier<T extends AbstractStringIdentifier<T>>
         extends AbstractIdentifier<String> implements Comparable<T> {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     protected AbstractStringIdentifier(final @NonNull String string) {
index 3251004f753c9f6a79d2e46da8bd29d36c46d18f..1de2304045a1bf4bce9d3354db422da3a1f3d5fa 100644 (file)
@@ -7,19 +7,17 @@
  */
 package org.opendaylight.yangtools.util;
 
-import com.google.common.annotations.Beta;
+import java.io.Serial;
 import java.util.UUID;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Identifier;
 
 /**
  * Utility {@link Identifier} backed by a {@link UUID}.
- *
- * @author Robert Varga
  */
-@Beta
 public abstract class AbstractUUIDIdentifier<T extends AbstractUUIDIdentifier<T>> extends AbstractIdentifier<UUID>
         implements Comparable<T> {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     protected AbstractUUIDIdentifier(final @NonNull UUID uuid) {
index d843a36ddede5ba1e507d69a9917261084c1c7d2..b3e7d616a96f3f2965e23ffacf9eee0ff03a9c96 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.util;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.UnmodifiableIterator;
+import java.io.Serial;
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
@@ -26,7 +27,9 @@ import org.eclipse.jdt.annotation.NonNull;
  * @param <E> the type of elements in this list
  */
 final class ConstantArrayCollection<E> implements Collection<E>, Serializable {
+    @Serial
     private static final long serialVersionUID = 1L;
+
     private final E @NonNull[] array;
 
     ConstantArrayCollection(final E @NonNull[] array) {
@@ -136,8 +139,7 @@ final class ConstantArrayCollection<E> implements Collection<E>, Serializable {
 
     @Override
     public boolean equals(final Object obj) {
-        return obj == this || obj instanceof ConstantArrayCollection
-                && Arrays.equals(array, ((ConstantArrayCollection<?>) obj).array);
+        return obj == this || obj instanceof ConstantArrayCollection<?> other && Arrays.equals(array, other.array);
     }
 
     @Override
index ae8182ea2a9690d75b63a5e80423fc2ba03ef27d..5c3a3235e2f271abd75dc51dd5ef3fa42c53bd57 100644 (file)
@@ -17,6 +17,7 @@ import com.google.common.collect.UnmodifiableIterator;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.Serial;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.AbstractMap.SimpleImmutableEntry;
@@ -46,6 +47,7 @@ import org.eclipse.jdt.annotation.Nullable;
 @Beta
 public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K, V>, Serializable {
     static final class Ordered<K, V> extends ImmutableOffsetMap<K, V> {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         Ordered(final ImmutableMap<K, Integer> offsets, final V[] objects) {
@@ -65,6 +67,7 @@ public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K
     }
 
     static final class Unordered<K, V> extends ImmutableOffsetMap<K, V> {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         Unordered(final ImmutableMap<K, Integer> offsets, final V[] objects) {
@@ -85,6 +88,7 @@ public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K
         }
     }
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     private final transient @NonNull ImmutableMap<K, Integer> offsets;
@@ -367,6 +371,7 @@ public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K
         }
     }
 
+    @Serial
     private void writeObject(final ObjectOutputStream out) throws IOException {
         out.writeInt(offsets.size());
         for (Entry<K, V> e : entrySet()) {
@@ -375,6 +380,7 @@ public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K
         }
     }
 
+    // FIXME: this is ugly, use an Externalizable proxy
     private static final Field OFFSETS_FIELD = fieldFor("offsets");
     private static final Field ARRAY_FIELD = fieldFor("objects");
 
@@ -399,6 +405,7 @@ public abstract class ImmutableOffsetMap<K, V> implements UnmodifiableMapPhase<K
         }
     }
 
+    @Serial
     @SuppressWarnings("unchecked")
     private void readObject(final @NonNull ObjectInputStream in) throws IOException, ClassNotFoundException {
         final int s = in.readInt();
index 004cbf3f0dc951cb00d62dbc2041ac8d1343c765..b1a6ee836b9e63272b2aa72209239bc541160bd3 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import java.io.Serial;
 import java.io.Serializable;
 import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.Iterator;
@@ -34,6 +35,7 @@ import org.eclipse.jdt.annotation.NonNull;
 @Beta
 public abstract class SharedSingletonMap<K, V> implements Serializable, UnmodifiableMapPhase<K, V> {
     static final class Ordered<K, V> extends SharedSingletonMap<K, V> {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         Ordered(final K key, final V value) {
@@ -51,6 +53,7 @@ public abstract class SharedSingletonMap<K, V> implements Serializable, Unmodifi
     }
 
     static final class Unordered<K, V> extends SharedSingletonMap<K, V> {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         Unordered(final K key, final V value) {
@@ -67,6 +70,7 @@ public abstract class SharedSingletonMap<K, V> implements Serializable, Unmodifi
         }
     }
 
+    @Serial
     private static final long serialVersionUID = 1L;
     private static final LoadingCache<Object, SingletonSet<Object>> CACHE = CacheBuilder.newBuilder().weakValues()
             .build(new CacheLoader<Object, SingletonSet<Object>>() {
index c14a6fe968fff71c1f3835777f877946ec15f236..79fb914156c9908222268ce557e28741255f7258 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Iterators;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.Serial;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Iterator;
@@ -28,9 +29,11 @@ import org.opendaylight.yangtools.concepts.Immutable;
  */
 @Beta
 public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     private static final SingletonSet<?> NULL_SINGLETON = new SingletonSet<>() {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         @Override
@@ -60,6 +63,7 @@ public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable
             return "[null]";
         }
 
+        @Serial
         private Object readResolve() {
             return NULL_SINGLETON;
         }
@@ -181,6 +185,7 @@ public abstract class SingletonSet<E> implements Set<E>, Immutable, Serializable
 
     @NonNullByDefault
     private static final class RegularSingletonSet<E> extends SingletonSet<E> {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         private final E element;
index ce8cb030cee17490a924fe85f0f602f363c67f10..e3f1f40f4ce5a0c960285e1a73832d9c199df553 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.Serial;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
@@ -129,7 +130,7 @@ public class CachedThreadPoolExecutor extends ThreadPoolExecutor {
      * threads are busy.
      */
     private static class ExecutorQueue extends SynchronousQueue<Runnable> {
-
+        @Serial
         private static final long serialVersionUID = 1L;
 
         private static final long POLL_WAIT_TIME_IN_MS = 300;
index 966dae7a2aebb0fa2149cd5828087b0715f8b4f5..3270777e7ee46bcc596a9cd1b66f3870abbcb3c8 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.util.concurrent;
 
 import com.google.common.annotations.Beta;
+import java.io.Serial;
 import java.util.Collection;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -22,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNull;
  * @param <E> the element t.ype
  */
 public class TrackingLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     @SuppressWarnings("rawtypes")
index e9962bfe18b03e9d5709afa1c13b5b2197f2f80d..6e5727c2e2b53a0bcd6aeddc8d8624a490355530 100644 (file)
@@ -21,6 +21,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.io.Serial;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -50,8 +51,8 @@ public class DeadlockDetectingListeningExecutorServiceTest {
     static final InitialInvoker EXECUTE = Executor::execute;
 
     public static class TestDeadlockException extends Exception {
+        @Serial
         private static final long serialVersionUID = 1L;
-
     }
 
     private static final Supplier<Exception> DEADLOCK_EXECUTOR_SUPPLIER = TestDeadlockException::new;
index 388b9ed8a6c4089bcd252d4922ad2c7e0572529b..9dda0bcb323c900a0cbae6dc824fea57a3ca1611 100644 (file)
@@ -10,11 +10,13 @@ package org.opendaylight.yangtools.util.concurrent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
+import java.io.Serial;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 
 public class ReflectiveExceptionMapperTest {
     static final class NoArgumentCtorException extends Exception {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         NoArgumentCtorException() {
@@ -22,6 +24,7 @@ public class ReflectiveExceptionMapperTest {
     }
 
     static final class PrivateCtorException extends Exception {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         private PrivateCtorException(final String message, final Throwable cause) {
@@ -30,6 +33,7 @@ public class ReflectiveExceptionMapperTest {
     }
 
     static final class FailingCtorException extends Exception {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         FailingCtorException(final String message, final Throwable cause) {
@@ -38,6 +42,7 @@ public class ReflectiveExceptionMapperTest {
     }
 
     public static final class GoodException extends Exception {
+        @Serial
         private static final long serialVersionUID = 1L;
 
         public GoodException(final String message, final Throwable cause) {