Deprecate YangInstanceIdentifier.EMPTY 61/84061/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 28 Aug 2019 18:21:39 +0000 (20:21 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 29 Aug 2019 12:27:05 +0000 (14:27 +0200)
This runtime constant forces instantiation of a subclass, leading
to a SpotBugs warning. A static accessor works just as well --
hence YangInstanceIdentifier.empty()

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

13 files changed:
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DuplicateFinder.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/CursorAwareDataTreeModification.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/CursorAwareDataTreeSnapshot.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeConfiguration.java
yang/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifierTest.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeTip.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MandatoryLeafEnforcer.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodesTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/Bug4454Test.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataTreeCandidatesTest.java
yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/NormalizedNodeContext.java

index d7e6404200471c4e516ff38b06525d2b18f9f72a..f6b4721e4e145b20f35507ebd0a4bcc1fadc0aa5 100644 (file)
@@ -90,7 +90,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
 public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentifier>, Immutable, Serializable {
     /**
      * An empty {@link YangInstanceIdentifier}. It corresponds to the path of the conceptual root of the YANG namespace.
+     *
+     * @deprecated Use {@link #empty()} instead.
      */
+    @Deprecated
     public static final @NonNull YangInstanceIdentifier EMPTY = FixedYangInstanceIdentifier.EMPTY_INSTANCE;
 
     private static final AtomicReferenceFieldUpdater<YangInstanceIdentifier, String> TOSTRINGCACHE_UPDATER =
@@ -105,6 +108,16 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         this.hash = hash;
     }
 
+    /**
+     * Return An empty {@link YangInstanceIdentifier}. It corresponds to the path of the conceptual root of the YANG
+     * namespace.
+     *
+     * @return An empty YangInstanceIdentifier
+     */
+    public static @NonNull YangInstanceIdentifier empty() {
+        return FixedYangInstanceIdentifier.EMPTY_INSTANCE;
+    }
+
     abstract @NonNull YangInstanceIdentifier createRelativeIdentifier(int skipFromRoot);
 
     abstract @Nullable Collection<PathArgument> tryPathArguments();
@@ -170,7 +183,7 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
 
     public static @NonNull YangInstanceIdentifier create(final Iterable<? extends PathArgument> path) {
         if (Iterables.isEmpty(path)) {
-            return EMPTY;
+            return empty();
         }
 
         final HashCodeBuilder<PathArgument> hash = new HashCodeBuilder<>();
@@ -270,7 +283,7 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
      */
     public Optional<YangInstanceIdentifier> relativeTo(final YangInstanceIdentifier ancestor) {
         if (this == ancestor) {
-            return Optional.of(EMPTY);
+            return Optional.of(empty());
         }
         if (ancestor.isEmpty()) {
             return Optional.of(this);
@@ -293,7 +306,7 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
             return Optional.of(this);
         }
         if (!lit.hasNext()) {
-            return Optional.of(EMPTY);
+            return Optional.of(empty());
         }
 
         return Optional.of(createRelativeIdentifier(common));
index 364218cc1cf8561b0f47d0fdc683636f2f88aee3..ad4190e6872bafc5d612b9bd1d773017911330cf 100644 (file)
@@ -54,7 +54,7 @@ final class DuplicateFinder {
      */
     static Map<NormalizedNode<?, ?>, DuplicateEntry> findDuplicates(final NormalizedNode<?, ?> node) {
         final DuplicateFinder finder = new DuplicateFinder();
-        finder.findDuplicates(YangInstanceIdentifier.EMPTY, node);
+        finder.findDuplicates(YangInstanceIdentifier.empty(), node);
         return finder.identities;
     }
 }
index 73285963aa66f7a516228b9f070db5224c6bd480..3b0b743d35b0dc6ea03db9909411d4b00203b94e 100644 (file)
@@ -36,6 +36,6 @@ public interface CursorAwareDataTreeModification extends DataTreeModification, C
      */
     @Override
     default DataTreeModificationCursor openCursor() {
-        return openCursor(YangInstanceIdentifier.EMPTY).get();
+        return openCursor(YangInstanceIdentifier.empty()).get();
     }
 }
index 896a9003b55015b4109650a218782c9cc7f43785..10a6dfdefc0f692fc444232235fed581a8a3fe41 100644 (file)
@@ -34,7 +34,7 @@ public interface CursorAwareDataTreeSnapshot extends DataTreeSnapshot {
      * @throws IllegalStateException if there is another cursor currently open.
      */
     default DataTreeSnapshotCursor openCursor() {
-        return openCursor(YangInstanceIdentifier.EMPTY).get();
+        return openCursor(YangInstanceIdentifier.empty()).get();
     }
 
     @Override
index 1f3b590f86338ee98a7759f3cdeef7cde879a414..cfb2928ee46a8ed334ea8f78657100f1d84867c8 100644 (file)
@@ -89,7 +89,7 @@ public class DataTreeConfiguration implements Immutable {
             case OPERATIONAL:
                 return DEFAULT_OPERATIONAL;
             default:
-                return new DataTreeConfiguration(treeType, YangInstanceIdentifier.EMPTY, false, true);
+                return new DataTreeConfiguration(treeType, YangInstanceIdentifier.empty(), false, true);
         }
     }
 
@@ -112,7 +112,7 @@ public class DataTreeConfiguration implements Immutable {
 
         public Builder(final TreeType treeType) {
             this.treeType = requireNonNull(treeType);
-            this.rootPath = YangInstanceIdentifier.EMPTY;
+            this.rootPath = YangInstanceIdentifier.empty();
         }
 
         public Builder setUniqueIndexes(final boolean uniqueIndexes) {
index 5f88c958abea2afb849c12e7db748716b2dd7bb4..d3053e1b63f0504a48b8c2113393fa15fffebd68 100644 (file)
@@ -383,18 +383,18 @@ public class YangInstanceIdentifierTest {
             new NodeIdentifier(NODENAME2));
         assertEquals(fixed, serdes(fixed));
 
-        final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
+        final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
         assertEquals(stacked, serdes(stacked));
 
-        final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
-        assertSame(YangInstanceIdentifier.EMPTY, empty);
+        final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
+        assertSame(YangInstanceIdentifier.empty(), empty);
     }
 
     @Test
     public void testToOptimized() {
         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
             new NodeIdentifier(NODENAME2));
-        final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(NodeIdentifier.create(NODENAME1))
+        final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(NodeIdentifier.create(NODENAME1))
                 .node(NodeIdentifier.create(NODENAME2));
 
         assertSame(fixed, fixed.toOptimized());
@@ -407,21 +407,21 @@ public class YangInstanceIdentifierTest {
     @Test
     public void testGetParent() {
         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
-        final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
+        final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
         final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
 
-        assertNull(YangInstanceIdentifier.EMPTY.getParent());
-        assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
-        assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
+        assertNull(YangInstanceIdentifier.empty().getParent());
+        assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
+        assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
         assertSame(stacked, twoStacked.getParent());
     }
 
     @Test
     public void testIsEmpty() {
         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
-        final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
+        final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
 
-        assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
+        assertTrue(YangInstanceIdentifier.empty().isEmpty());
         assertFalse(fixed.isEmpty());
         assertFalse(stacked.isEmpty());
     }
index 18c1f1cefedfac2c81e2e3c300f5b78e70dca219..97d814f52dd3b6b040e2c21ae478f1c7f3feb3ce 100644 (file)
@@ -47,13 +47,13 @@ abstract class AbstractDataTreeTip implements DataTreeTip {
 
         final TreeNode currentRoot = getTipRoot();
         if (root.getOperation() == LogicalOperation.NONE) {
-            return new NoopDataTreeCandidate(YangInstanceIdentifier.EMPTY, root, currentRoot);
+            return new NoopDataTreeCandidate(YangInstanceIdentifier.empty(), root, currentRoot);
         }
 
         final Optional<TreeNode> newRoot = m.getStrategy().apply(m.getRootModification(), Optional.of(currentRoot),
             m.getVersion());
         checkState(newRoot.isPresent(), "Apply strategy failed to produce root node for modification %s", modification);
-        return new InMemoryDataTreeCandidate(YangInstanceIdentifier.EMPTY, root, currentRoot, newRoot.get());
+        return new InMemoryDataTreeCandidate(YangInstanceIdentifier.empty(), root, currentRoot, newRoot.get());
     }
 
     private static InMemoryDataTreeModification checkedCast(final DataTreeModification mod) {
index bbd229cb8371067da55367eb1ff105545e36bee9..dd23823d62e50497b60608f5b23525cbeaa9d3a3 100644 (file)
@@ -59,7 +59,7 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory {
         final DataTree ret = create(treeConfig, initialSchemaContext, false);
 
         final DataTreeModification mod = ret.takeSnapshot().newModification();
-        mod.write(YangInstanceIdentifier.EMPTY, initialRoot);
+        mod.write(YangInstanceIdentifier.empty(), initialRoot);
         mod.ready();
 
         ret.validate(mod);
index fc4e2b7e338c377d4f0e81ee03e0af88f4abd8d8..90ae47c9865183f29534d5ffa733894c9e5616ee 100644 (file)
@@ -47,7 +47,7 @@ final class MandatoryLeafEnforcer implements Immutable {
         }
 
         final Builder<YangInstanceIdentifier> builder = ImmutableList.builder();
-        findMandatoryNodes(builder, YangInstanceIdentifier.EMPTY, schema, treeConfig.getTreeType());
+        findMandatoryNodes(builder, YangInstanceIdentifier.empty(), schema, treeConfig.getTreeType());
         final ImmutableList<YangInstanceIdentifier> mandatoryNodes = builder.build();
         return mandatoryNodes.isEmpty() ? Optional.empty() : Optional.of(new MandatoryLeafEnforcer(mandatoryNodes));
     }
index 8b1dfe41c33bffb962fabb6bea89a358a3ed7ab8..788b2be3fe84a66770e143f40060bfac7f47bb58 100644 (file)
@@ -202,6 +202,6 @@ public class InstanceIdToNodesTest {
     @Test
     public void testEmptyInstanceIdentifier() {
         assertEquals(ImmutableNodes.containerNode(SchemaContext.NAME),
-            ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.EMPTY));
+            ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.empty()));
     }
 }
index b22facf5dda620fa402098e17c1c560ade6e0e09..e33347e08cfa42515ce0c8721e2ddd88a679ae6a 100644 (file)
@@ -343,7 +343,8 @@ public class Bug4454Test {
         inMemoryDataTree.commit(prepare);
 
         // Empty list should have disappeared, along with the container, as we are not enforcing root
-        final NormalizedNode<?, ?> data = inMemoryDataTree.takeSnapshot().readNode(YangInstanceIdentifier.EMPTY).get();
+        final NormalizedNode<?, ?> data = inMemoryDataTree.takeSnapshot()
+                .readNode(YangInstanceIdentifier.empty()).get();
         assertTrue(data instanceof ContainerNode);
         assertEquals(0, ((ContainerNode) data).getValue().size());
     }
index eb816d1c1596e21fb9d196f9bc117b208b87eb5f..669adee83248a84f09150588195cc64145741ef0 100644 (file)
@@ -144,7 +144,7 @@ public class DataTreeCandidatesTest extends AbstractTestModelTest {
         dataTree.validate(modification);
 
         final DataTreeCandidate candidate = dataTree.prepare(modification);
-        assertEquals(YangInstanceIdentifier.EMPTY, candidate.getRootPath());
+        assertEquals(YangInstanceIdentifier.empty(), candidate.getRootPath());
         final DataTreeCandidateNode node = candidate.getRootNode();
         assertEquals(ModificationType.UNMODIFIED, node.getModificationType());
 
@@ -170,7 +170,7 @@ public class DataTreeCandidatesTest extends AbstractTestModelTest {
 
         // The entire transaction needs to fizzle to a no-op
         final DataTreeCandidate candidate = dataTree.prepare(modification);
-        assertEquals(YangInstanceIdentifier.EMPTY, candidate.getRootPath());
+        assertEquals(YangInstanceIdentifier.empty(), candidate.getRootPath());
         final DataTreeCandidateNode node = candidate.getRootNode();
         assertEquals(ModificationType.UNMODIFIED, node.getModificationType());
 
index 8f1101414fa40ca1309dc34749f3b7ae0b6e45a3..6293ce260685ccab3a79fd85f847fc9f0c3f8578 100644 (file)
@@ -70,7 +70,7 @@ final class NormalizedNodeContext extends Context {
     }
 
     YangInstanceIdentifier getPath() {
-        return (parent == null ? YangInstanceIdentifier.EMPTY : parent.getPath()).node(node.getIdentifier());
+        return (parent == null ? YangInstanceIdentifier.empty() : parent.getPath()).node(node.getIdentifier());
     }
 
     DataSchemaContextNode<?> getSchema() {
@@ -152,7 +152,7 @@ final class NormalizedNodeContext extends Context {
         return Iterators.transform(collection.iterator(), this::createChild);
     }
 
-    static NormalizedNodeContext cast(@Nullable Context context) {
+    static NormalizedNodeContext cast(@Nullable final Context context) {
         verify(context instanceof NormalizedNodeContext);
         return (@NonNull NormalizedNodeContext) context;
     }