Add ValidatedTreeNode 79/107679/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 3 Sep 2023 21:10:01 +0000 (23:10 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Sep 2023 08:38:33 +0000 (10:38 +0200)
We need to @SuppressFBWarnings a use of Optional<TreeNode> being
nullable. Replace Optional with a dedicated record, which provides
adaptation.

Change-Id: Idcd57cc899cacb09d7bec1711d0d084027716734
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
data/yang-data-tree-ri/pom.xml
data/yang-data-tree-ri/src/main/java/module-info.java
data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/AbstractValidation.java
data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/ModifiedNode.java
data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/ValidatedTreeNode.java [new file with mode: 0644]

index a056bb7963ddbec25e355829d14aa74e29b2bd5f..146469be37d6facd9b2e505aaebe548cd894ecd9 100644 (file)
     <description>${project.artifactId}</description>
 
     <dependencies>
-        <dependency>
-            <groupId>com.github.spotbugs</groupId>
-            <artifactId>spotbugs-annotations</artifactId>
-            <optional>true</optional>
-        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
index ef48028197cd30b471386c3271c83b5d3c958bd2..0bef77e1cefb8f6c2bc3b5876fd2d9db96c284f7 100644 (file)
@@ -25,7 +25,6 @@ module org.opendaylight.yangtools.yang.data.tree {
     requires org.slf4j;
 
     // Annotations
-    requires static com.github.spotbugs.annotations;
     requires static org.eclipse.jdt.annotation;
     requires static org.kohsuke.metainf_services;
     requires static org.osgi.service.component.annotations;
index 1055cbc09aa837a211269fec3d7a9dc293453ca0..38907df628e74f583565ad9a65e83ad1883605df 100644 (file)
@@ -63,20 +63,22 @@ abstract sealed class AbstractValidation extends ModificationApplyOperation
     @Override
     final Optional<? extends TreeNode> apply(final ModifiedNode modification,
             final Optional<? extends TreeNode> storeMeta, final Version version) {
-        Optional<? extends TreeNode> ret = modification.getValidatedNode(this, storeMeta);
-        if (ret == null) {
-            // This might also mean the delegate is maintaining validation
-            if (delegate instanceof AbstractValidation) {
-                ret = modification.getValidatedNode(delegate, storeMeta);
-                if (ret != null) {
-                    return ret;
-                }
-            }
+        var validated = modification.validatedNode(this, storeMeta);
+        if (validated != null) {
+            return validated.toOptional();
+        }
 
-            // Deal with the result moving on us
-            ret = delegate.apply(modification, storeMeta, version);
-            ret.ifPresent(meta -> enforceOnData(meta.getData()));
+        // This might also mean the delegate is maintaining validation
+        if (delegate instanceof AbstractValidation) {
+            validated = modification.validatedNode(delegate, storeMeta);
+            if (validated != null) {
+                return validated.toOptional();
+            }
         }
+
+        // Deal with the result moving on us
+        final var ret = delegate.apply(modification, storeMeta, version);
+        ret.ifPresent(meta -> enforceOnData(meta.getData()));
         return ret;
     }
 
@@ -91,7 +93,7 @@ abstract sealed class AbstractValidation extends ModificationApplyOperation
         }
 
         if (delegate instanceof AbstractValidation) {
-            checkApplicable(path, verifyNotNull(modified.getValidatedNode(delegate, current)));
+            checkApplicable(path, verifyNotNull(modified.validatedNode(delegate, current)).toOptional());
             return;
         }
 
index 8d8315d0c09431c9efd0f745544cd3244248ee61..688510fc66cee33eae8a9a3ca9226c20686468f6 100644 (file)
@@ -12,7 +12,6 @@ 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.util.Collection;
 import java.util.Map;
 import java.util.Optional;
@@ -61,7 +60,7 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode<Modif
     // Internal cache for TreeNodes created as part of validation
     private ModificationApplyOperation validatedOp;
     private Optional<? extends TreeNode> validatedCurrent;
-    private Optional<? extends TreeNode> validatedNode;
+    private ValidatedTreeNode validatedNode;
 
     private ModifiedNode(final PathArgument identifier, final Optional<? extends TreeNode> original,
             final ChildTrackingPolicy childPolicy) {
@@ -340,7 +339,7 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode<Modif
             final Optional<? extends TreeNode> node) {
         validatedOp = requireNonNull(op);
         validatedCurrent = requireNonNull(current);
-        validatedNode = requireNonNull(node);
+        validatedNode = new ValidatedTreeNode(node);
     }
 
     /**
@@ -352,9 +351,7 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode<Modif
      * @return {@code null} if there is a mismatch with previously-validated node (if present) or the result of previous
      *         validation.
      */
-    @SuppressFBWarnings(value = "NP_OPTIONAL_RETURN_NULL",
-            justification = "The contract is package-internal and well documented, we do not need a separate wrapper")
-    @Nullable Optional<? extends TreeNode> getValidatedNode(final ModificationApplyOperation op,
+    @Nullable ValidatedTreeNode validatedNode(final ModificationApplyOperation op,
             final Optional<? extends TreeNode> current) {
         return op.equals(validatedOp) && current.equals(validatedCurrent) ? validatedNode : null;
     }
diff --git a/data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/ValidatedTreeNode.java b/data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/ValidatedTreeNode.java
new file mode 100644 (file)
index 0000000..3b942d9
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2023 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.data.tree.impl;
+
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.data.tree.impl.node.TreeNode;
+
+@SuppressWarnings("null")
+record ValidatedTreeNode(@Nullable TreeNode treeNode) {
+    ValidatedTreeNode(final Optional<? extends TreeNode> optional) {
+        this(optional.orElse(null));
+    }
+
+    @NonNull Optional<TreeNode> toOptional() {
+        return Optional.ofNullable(treeNode);
+    }
+}