From 1fcf6b07a764c57aff7435cffd620c4995d1db40 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 27 Sep 2020 00:01:07 +0200 Subject: [PATCH] Fix nullness errors reported by Eclipse 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 --- .../yang/binding/InstanceIdentifier.java | 24 +++++++++++-------- .../InstanceIdentifierBuilderImpl.java | 2 +- .../yang/binding/KeyedInstanceIdentifier.java | 5 ++-- .../yang/binding/InstanceIdentifierTest.java | 17 ++++++++++--- .../yang/binding/test/mock/Node.java | 4 +++- .../binding/test/mock/NodeAugmentation.java | 14 +++++++++++ 6 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeAugmentation.java diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java index 626aaf043a..d7edf40570 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java @@ -101,7 +101,7 @@ public class InstanceIdentifier implements Path @NonNull InstanceIdentifier verifyTarget(final Class target) { + public final @NonNull InstanceIdentifier verifyTarget(final Class<@NonNull N> target) { verify(target.equals(targetType), "Cannot adapt %s to %s", this, target); return (InstanceIdentifier) this; } @@ -217,7 +217,8 @@ public class InstanceIdentifier implements Path @Nullable InstanceIdentifier firstIdentifierOf(final Class type) { + public final @Nullable InstanceIdentifier 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 implements Path & DataObject, K extends Identifier> @Nullable K firstKeyOf( - final Class 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 implements Path> @NonNull InstanceIdentifier child(final Class container) { + public final > @NonNull InstanceIdentifier child( + final Class<@NonNull N> container) { return childIdentifier(Item.of(container)); } @@ -358,7 +360,7 @@ public class InstanceIdentifier implements Path & ChildOf, K extends Identifier> - @NonNull KeyedInstanceIdentifier child(final Class listItem, final K listKey) { + @NonNull KeyedInstanceIdentifier child(final Class<@NonNull N> listItem, final K listKey) { return (KeyedInstanceIdentifier) childIdentifier(IdentifiableItem.of(listItem, listKey)); } @@ -373,8 +375,9 @@ public class InstanceIdentifier implements Path & DataObject, N extends ChildOf> - @NonNull InstanceIdentifier child(final Class caze, final Class container) { + @NonNull InstanceIdentifier child(final Class<@NonNull C> caze, final Class<@NonNull N> container) { return childIdentifier(Item.of(caze, container)); } @@ -391,10 +394,11 @@ public class InstanceIdentifier implements Path & DataObject, K extends Identifier, N extends Identifiable & ChildOf> @NonNull KeyedInstanceIdentifier child( - final Class caze, final Class listItem, final K listKey) { + final Class<@NonNull C> caze, final Class<@NonNull N> listItem, final K listKey) { return (KeyedInstanceIdentifier) childIdentifier(IdentifiableItem.of(caze, listItem, listKey)); } @@ -408,7 +412,7 @@ public class InstanceIdentifier implements Path> @NonNull InstanceIdentifier augmentation( - final Class container) { + final Class<@NonNull N> container) { return childIdentifier(Item.of(container)); } @@ -558,7 +562,7 @@ public class InstanceIdentifier implements Path @NonNull InstanceIdentifier create(final Class type) { + public static @NonNull InstanceIdentifier create(final Class<@NonNull T> type) { return (InstanceIdentifier) create(ImmutableList.of(Item.of(type))); } @@ -872,7 +876,7 @@ public class InstanceIdentifier implements Path & ChildOf, K extends Identifier> - @NonNull InstanceIdentifierBuilder child(Class listItem, K listKey); + @NonNull InstanceIdentifierBuilder child(Class<@NonNull N> listItem, K listKey); /** * Append the specified listItem as a child of the current InstanceIdentifier referenced by the builder. This diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierBuilderImpl.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierBuilderImpl.java index 90a1ed7e6e..bb207ff52a 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierBuilderImpl.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierBuilderImpl.java @@ -71,7 +71,7 @@ final class InstanceIdentifierBuilderImpl implements Insta @Override public & ChildOf, K extends Identifier> InstanceIdentifierBuilderImpl - child(final Class listItem, final K listKey) { + child(final Class<@NonNull N> listItem, final K listKey) { return addNode(IdentifiableItem.of(listItem, listKey)); } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java index 8b9af1ca1b..38b61c39ac 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedInstanceIdentifier.java @@ -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 & DataObject, K e private static final long serialVersionUID = 2L; private final K key; - KeyedInstanceIdentifier(final Class type, final Iterable pathArguments, final boolean wildcarded, - final int hash, final K key) { + KeyedInstanceIdentifier(final Class<@NonNull T> type, final Iterable pathArguments, + final boolean wildcarded, final int hash, final K key) { super(type, pathArguments, wildcarded, hash); this.key = key; } diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java index 3a9d3752fd..a666235b30 100644 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java +++ b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifierTest.java @@ -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 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 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 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 nodeId = InstanceIdentifier.create(Nodes.class); + assertSame(nodeId, nodeId.verifyTarget(Nodes.class)); + assertThrows(VerifyException.class, () -> nodeId.verifyTarget(Node.class)); + } + } diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java index 2977a2d528..ce931158c4 100644 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java +++ b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java @@ -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, - ChildOf { + ChildOf, + Augmentable { } 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 index 0000000000..d59eee0b16 --- /dev/null +++ b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeAugmentation.java @@ -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 { + +} -- 2.36.6