Fix nullness errors reported by Eclipse 63/93163/1
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 26 Sep 2020 22:01:07 +0000 (00:01 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 19 Oct 2020 10:45:48 +0000 (12:45 +0200)
Eclipse provides a lot of noise around builders where we pass
down classes. This fixes them up by losening the contracts and
adding Class<@NonNull T> where generics are involved. Since we are
at it, also fixup the suite to generate fewer warnings.

JIRA: MDSAL-601
Change-Id: I7b21d88584a18cc1bed6ea776b22e82584484339
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 1fcf6b07a764c57aff7435cffd620c4995d1db40)

binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierBuilderImpl.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java
binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java
binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java
binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeAugmentation.java [new file with mode: 0644]

index 626aaf043ae23a92d3851a5df51fc06e34a41db7..d7edf405704af947a850da92e6803e7daca69006 100644 (file)
@@ -101,7 +101,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @throws NullPointerException if {@code target} is null
      */
     @SuppressWarnings("unchecked")
-    public final <N extends DataObject> @NonNull InstanceIdentifier<N> verifyTarget(final Class<N> target) {
+    public final <N extends DataObject> @NonNull InstanceIdentifier<N> verifyTarget(final Class<@NonNull N> target) {
         verify(target.equals(targetType), "Cannot adapt %s to %s", this, target);
         return (InstanceIdentifier<N>) this;
     }
@@ -217,7 +217,8 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return trimmed instance identifier, or null if the component type
      *         is not present.
      */
-    public final <I extends DataObject> @Nullable InstanceIdentifier<I> firstIdentifierOf(final Class<I> type) {
+    public final <I extends DataObject> @Nullable InstanceIdentifier<I> firstIdentifierOf(
+            final Class<@NonNull I> type) {
         int count = 1;
         for (final PathArgument a : pathArguments) {
             if (type.equals(a.getType())) {
@@ -242,7 +243,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      *         is not present.
      */
     public final <N extends Identifiable<K> & DataObject, K extends Identifier<N>> @Nullable K firstKeyOf(
-            final Class<N> listItem) {
+            final Class<@NonNull N> listItem) {
         for (final PathArgument i : pathArguments) {
             if (listItem.equals(i.getType())) {
                 @SuppressWarnings("unchecked")
@@ -341,7 +342,8 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if {@code container} is null
      */
-    public final <N extends ChildOf<? super T>> @NonNull InstanceIdentifier<N> child(final Class<N> container) {
+    public final <N extends ChildOf<? super T>> @NonNull InstanceIdentifier<N> child(
+            final Class<@NonNull N> container) {
         return childIdentifier(Item.of(container));
     }
 
@@ -358,7 +360,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      */
     @SuppressWarnings("unchecked")
     public final <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
-            @NonNull KeyedInstanceIdentifier<N, K> child(final Class<N> listItem, final K listKey) {
+            @NonNull KeyedInstanceIdentifier<N, K> child(final Class<@NonNull N> listItem, final K listKey) {
         return (KeyedInstanceIdentifier<N, K>) childIdentifier(IdentifiableItem.of(listItem, listKey));
     }
 
@@ -373,8 +375,9 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if any argument is null
      */
+    // FIXME: add a proper caller
     public final <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>>
-            @NonNull InstanceIdentifier<N> child(final Class<C> caze, final Class<N> container) {
+            @NonNull InstanceIdentifier<N> child(final Class<@NonNull C> caze, final Class<@NonNull N> container) {
         return childIdentifier(Item.of(caze, container));
     }
 
@@ -391,10 +394,11 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if any argument is null
      */
+    // FIXME: add a proper caller
     @SuppressWarnings("unchecked")
     public final <C extends ChoiceIn<? super T> & DataObject, K extends Identifier<N>,
         N extends Identifiable<K> & ChildOf<? super C>> @NonNull KeyedInstanceIdentifier<N, K> child(
-                final Class<C> caze, final Class<N> listItem, final K listKey) {
+                final Class<@NonNull C> caze, final Class<@NonNull N> listItem, final K listKey) {
         return (KeyedInstanceIdentifier<N, K>) childIdentifier(IdentifiableItem.of(caze, listItem, listKey));
     }
 
@@ -408,7 +412,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @throws NullPointerException if {@code container} is null
      */
     public final <N extends DataObject & Augmentation<? super T>> @NonNull InstanceIdentifier<N> augmentation(
-            final Class<N> container) {
+            final Class<@NonNull N> container) {
         return childIdentifier(Item.of(container));
     }
 
@@ -558,7 +562,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return InstanceIdentifier instance
      */
     @SuppressWarnings("unchecked")
-    public static <T extends DataObject> @NonNull InstanceIdentifier<T> create(final Class<T> type) {
+    public static <T extends DataObject> @NonNull InstanceIdentifier<T> create(final Class<@NonNull T> type) {
         return (InstanceIdentifier<T>) create(ImmutableList.of(Item.of(type)));
     }
 
@@ -872,7 +876,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
          * @throws NullPointerException if any argument is null
          */
         <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
-                @NonNull InstanceIdentifierBuilder<N> child(Class<N> listItem, K listKey);
+                @NonNull InstanceIdentifierBuilder<N> child(Class<@NonNull N> listItem, K listKey);
 
         /**
          * Append the specified listItem as a child of the current InstanceIdentifier referenced by the builder. This
index 90a1ed7e6e0be44f2c37e17a59e5c43ea7ba87d9..bb207ff52ad221bbe8162562f5a1d1d5dd1b427d 100644 (file)
@@ -71,7 +71,7 @@ final class InstanceIdentifierBuilderImpl<T extends DataObject> implements Insta
 
     @Override
     public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N>
-            child(final Class<N> listItem, final K listKey) {
+            child(final Class<@NonNull N> listItem, final K listKey) {
         return addNode(IdentifiableItem.of(listItem, listKey));
     }
 
index 8b9af1ca1b41bb88ed693fdb7ba48c38862a6ab5..38b61c39accd9c4bd1348dc0fa46feab3d461432 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.binding;
 
 import java.io.ObjectStreamException;
+import org.eclipse.jdt.annotation.NonNull;
 
 /**
  * An {@link InstanceIdentifier}, which has a list key attached at its last path element.
@@ -20,8 +21,8 @@ public class KeyedInstanceIdentifier<T extends Identifiable<K> & DataObject, K e
     private static final long serialVersionUID = 2L;
     private final K key;
 
-    KeyedInstanceIdentifier(final Class<T> type, final Iterable<PathArgument> pathArguments, final boolean wildcarded,
-        final int hash, final K key) {
+    KeyedInstanceIdentifier(final Class<@NonNull T> type, final Iterable<PathArgument> pathArguments,
+            final boolean wildcarded, final int hash, final K key) {
         super(type, pathArguments, wildcarded, hash);
         this.key = key;
     }
index 3a9d3752fd9db9db7e670a16b9e687afb5491a75..a666235b309c93d68320992d6306b7051f51e4e6 100644 (file)
@@ -11,9 +11,12 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
+import com.google.common.base.VerifyException;
 import com.google.common.collect.ImmutableList;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -25,6 +28,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdenti
 import org.opendaylight.yangtools.yang.binding.test.mock.FooChild;
 import org.opendaylight.yangtools.yang.binding.test.mock.InstantiatedFoo;
 import org.opendaylight.yangtools.yang.binding.test.mock.Node;
+import org.opendaylight.yangtools.yang.binding.test.mock.NodeAugmentation;
 import org.opendaylight.yangtools.yang.binding.test.mock.NodeChild;
 import org.opendaylight.yangtools.yang.binding.test.mock.NodeChildKey;
 import org.opendaylight.yangtools.yang.binding.test.mock.NodeKey;
@@ -143,7 +147,7 @@ public class InstanceIdentifierTest {
 
         assertFalse(instanceIdentifier1.equals(instanceIdentifier3));
         assertFalse(instanceIdentifier1.equals(instanceIdentifier4));
-        final InstanceIdentifier instanceIdentifier5 = InstanceIdentifier.create(Node.class);
+        final InstanceIdentifier<Node> instanceIdentifier5 = InstanceIdentifier.create(Node.class);
         final Field hashField = InstanceIdentifier.class.getDeclaredField("hash");
         hashField.setAccessible(true);
         hashField.set(instanceIdentifier5, instanceIdentifier1.hashCode());
@@ -153,7 +157,7 @@ public class InstanceIdentifierTest {
         assertNotNull(InstanceIdentifier.create(ImmutableList.copyOf(instanceIdentifier1.getPathArguments())));
         assertNotNull(InstanceIdentifier.create(Nodes.class).child(Node.class));
         assertNotNull(InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(5)));
-        assertNotNull(instanceIdentifier5.augmentation(DataObject.class));
+        assertNotNull(instanceIdentifier5.augmentation(NodeAugmentation.class));
         assertNotNull(instanceIdentifier1.hashCode());
         assertNotNull(instanceIdentifier1.toString());
 
@@ -177,7 +181,7 @@ public class InstanceIdentifierTest {
     @Test
     public void firstKeyOfTest() {
         final InstanceIdentifier<Node> instanceIdentifier =
-                InstanceIdentifier.builder(Nodes.class).child(Node.class,new NodeKey(10)).build();
+                InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(10)).build();
         final InstanceIdentifier<DataObject> instanceIdentifier1 = InstanceIdentifier.create(DataObject.class);
         assertNotNull(instanceIdentifier.firstKeyOf(Node.class));
         assertNull(instanceIdentifier1.firstKeyOf(Node.class));
@@ -261,4 +265,11 @@ public class InstanceIdentifierTest {
         assertTrue(builder3.hashCode() != builder4.hashCode());
     }
 
+    @Test
+    public void verifyTargetTest() {
+        final InstanceIdentifier<Nodes> nodeId = InstanceIdentifier.create(Nodes.class);
+        assertSame(nodeId, nodeId.verifyTarget(Nodes.class));
+        assertThrows(VerifyException.class, () -> nodeId.verifyTarget(Node.class));
+    }
+
 }
index 2977a2d528dcd690c9d47ada8fb805660bc699a9..ce931158c4c8c98717b02ef14cbf842301099e75 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.binding.test.mock;
 
+import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
@@ -14,6 +15,7 @@ import org.opendaylight.yangtools.yang.binding.Identifiable;
 public interface Node extends
     DataObject,
     Identifiable<NodeKey>,
-    ChildOf<Nodes> {
+    ChildOf<Nodes>,
+    Augmentable<Node> {
 
 }
diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeAugmentation.java b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeAugmentation.java
new file mode 100644 (file)
index 0000000..d59eee0
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.binding.test.mock;
+
+import org.opendaylight.yangtools.yang.binding.Augmentation;
+
+public interface NodeAugmentation extends Augmentation<Node> {
+
+}