Introduce DataNodeContainer.findDataChildByName() 16/64816/5
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 27 Oct 2017 16:28:13 +0000 (18:28 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 27 Oct 2017 22:25:21 +0000 (00:25 +0200)
This the primary, non-null returning replacement of getDataChildByName(),
which is turned into a deprecated default utility method. This forces
users to check the return, flusing out potential inconsistencies like
null nodes in collections.

Change-Id: I8e81044c21a9b5daaa63c3ba347aa13a4222ae44
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java
yang/yang-model-immutable/src/main/java/org/opendaylight/yangtools/yang/model/immutable/AbstractDataNodeContainer.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/AbstractSchemaContext.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaContextProxyTest.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveDocumentedDataNodeContainer.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveModule.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseShorthandImpl.java

index 40107f6265c62c8df8d0425d7cd5ab688e0ff10e..9222f3dbc59f13fadfbff4db49218cea3125a237 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.data.util;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -14,6 +16,7 @@ import com.google.common.collect.Maps;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -33,7 +36,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 
-
 /**
  * yang-data-util
  * org.opendaylight.yangtools.yang.data.util
@@ -165,14 +167,14 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public DataSchemaNode getDataChildByName(final QName name) {
+        public Optional<DataSchemaNode> findDataChildByName(final QName name) {
             switch (name.getLocalName()) {
                 case "input":
-                    return rpcDefinition.getInput();
+                    return Optional.of(rpcDefinition.getInput());
                 case "output":
-                    return rpcDefinition.getOutput();
+                    return Optional.of(rpcDefinition.getOutput());
                 default:
-                    return null;
+                    return Optional.empty();
             }
         }
 
@@ -224,8 +226,8 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public DataSchemaNode getDataChildByName(final QName name) {
-            return mapNodes.get(name);
+        public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+            return Optional.ofNullable(mapNodes.get(requireNonNull(name)));
         }
 
         @Override
index b6443311a6c1e56988636d9a585e1745474f56f0..ec4616fa4a1729a8bdc79e7b43c9e80880cb56a9 100644 (file)
@@ -12,6 +12,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -89,15 +90,15 @@ public final class RpcAsContainer implements ContainerSchemaNode {
     }
 
     @Override
-    public DataSchemaNode getDataChildByName(final QName name) {
+    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
         // FIXME: check QNameModule
         switch (name.getLocalName()) {
             case "input":
-                return delegate.getInput();
+                return Optional.of(delegate.getInput());
             case "output":
-                return delegate.getOutput();
+                return Optional.of(delegate.getOutput());
             default:
-                return null;
+                return Optional.empty();
         }
     }
 
index d07be7d64d8586a0cd3f8fd5c7af7f4aa0f5b262..308697a7cffd28aadf4f7070a94348d0db6e8e23 100644 (file)
@@ -8,7 +8,9 @@
 package org.opendaylight.yangtools.yang.model.api;
 
 import java.util.Collection;
+import java.util.Optional;
 import java.util.Set;
+import javax.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 
 /**
@@ -44,10 +46,24 @@ public interface DataNodeContainer {
      *
      * @param name
      *            QName of child
-     * @return child node of this DataNodeContainer if child with given name is
-     *         present, null otherwise
+     * @return child node of this DataNodeContainer if child with given name is present, null otherwise
+     *
+     * @deprecated Use {@link #findDataChildByName(QName)} instead.
+     */
+    @Deprecated
+    @Nullable default DataSchemaNode getDataChildByName(final QName name) {
+        return findDataChildByName(name).orElse(null);
+    }
+
+    /**
+     * Returns the child node corresponding to the specified name.
+     *
+     * @param name
+     *            QName of child
+     * @return child node of this DataNodeContainer if child with given name is present, empty otherwise
+     * @throws NullPointerException if name is null
      */
-    DataSchemaNode getDataChildByName(QName name);
+    Optional<DataSchemaNode> findDataChildByName(QName name);
 
     /**
      * Returns grouping nodes used ny this container.
index 030df61659b55424ec1c6cc76c8205646ad034c6..69380223335ee5447788e974b4d006f2522b7a11 100644 (file)
@@ -7,8 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.model.immutable;
 
+import static java.util.Objects.requireNonNull;
+
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -23,7 +26,7 @@ abstract class AbstractDataNodeContainer implements DataNodeContainer {
     }
 
     @Override
-    public final DataSchemaNode getDataChildByName(final QName name) {
-        return children().get(name);
+    public final Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        return Optional.ofNullable(children().get(requireNonNull(name)));
     }
 }
index 564ae331d79d634b2315de1d14468c4f938c22f2..b379152ee69a1be6ee8b4e86124225193eae564c 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.yangtools.yang.model.util;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.SetMultimap;
 import java.net.URI;
 import java.util.ArrayList;
@@ -199,14 +201,15 @@ public abstract class AbstractSchemaContext implements SchemaContext {
     }
 
     @Override
-    public DataSchemaNode getDataChildByName(final QName name) {
+    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        requireNonNull(name);
         for (Module module : getModules()) {
-            final DataSchemaNode result = module.getDataChildByName(name);
-            if (result != null) {
+            final Optional<DataSchemaNode> result = module.findDataChildByName(name);
+            if (result.isPresent()) {
                 return result;
             }
         }
-        return null;
+        return Optional.empty();
     }
 
     @Override
index 0f4e019b5cfa7263bf2ecec5d1db73823d8c4f81..7120e9d25cf459dfac911a239bfd768d6ab1f6a8 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.model.util;
 
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.HashMap;
@@ -38,7 +39,7 @@ public final class EffectiveAugmentationSchema implements AugmentationSchemaNode
 
     public EffectiveAugmentationSchema(final AugmentationSchemaNode augmentSchema,
             final Set<DataSchemaNode> realChildSchemas) {
-        this.delegate = Preconditions.checkNotNull(augmentSchema);
+        this.delegate = requireNonNull(augmentSchema);
         this.realChildSchemas = ImmutableSet.copyOf(realChildSchemas);
 
         final Map<QName, DataSchemaNode> m = new HashMap<>(realChildSchemas.size());
@@ -95,8 +96,8 @@ public final class EffectiveAugmentationSchema implements AugmentationSchemaNode
     }
 
     @Override
-    public DataSchemaNode getDataChildByName(final QName name) {
-        return mappedChildSchemas.get(name);
+    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        return Optional.ofNullable(mappedChildSchemas.get(requireNonNull(name)));
     }
 
     @Override
index d170d384d782646d3ebbd4fc443369f551170e58..a60ccfb13078a7332b17e0523d08b849fbab3041 100644 (file)
@@ -526,7 +526,7 @@ public class SchemaContextProxyTest {
 
         final QName qname = QName.create("config-namespace", "2016-08-11", "cont");
         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
-        doReturn(mockedContainer).when(moduleConfig).getDataChildByName(any(QName.class));
+        doReturn(Optional.of(mockedContainer)).when(moduleConfig).findDataChildByName(any(QName.class));
 
         final DataSchemaNode dataSchemaNode = filteringSchemaContextProxy.getDataChildByName(qname);
         assertTrue(dataSchemaNode instanceof ContainerSchemaNode);
index 6781120ac294fc70f8676be44c0fd38621035894..9cbb9c5766a24476882f25f8bc41a72e969a2c65 100644 (file)
@@ -7,12 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
@@ -121,10 +124,9 @@ abstract class AbstractEffectiveDocumentedDataNodeContainer<A, D extends Declare
     }
 
     @Override
-    public final DataSchemaNode getDataChildByName(final QName name) {
-        // Child nodes are keyed by their container name, so we can do a direct
-        // lookup
-        return childNodes.get(name);
+    public final Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        // Child nodes are keyed by their container name, so we can do a direct lookup
+        return Optional.ofNullable(childNodes.get(requireNonNull(name)));
     }
 
     @Override
index 0260a0243779b9ee05b62dbe16391e63361d0533..4067b95a42a691c2205ec686233f3cf0e5ca65ba 100644 (file)
@@ -7,8 +7,10 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
 
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -315,8 +317,8 @@ abstract class AbstractEffectiveModule<D extends DeclaredStatement<String>> exte
 
     @Override
     public Set<Module> getSubmodules() {
-        Preconditions.checkState(sealed,
-            "Attempt to get base submodules from unsealed submodule effective statement %s", getQNameModule());
+        checkState(sealed, "Attempt to get base submodules from unsealed submodule effective statement %s",
+            getQNameModule());
         return submodules;
     }
 
@@ -377,10 +379,9 @@ abstract class AbstractEffectiveModule<D extends DeclaredStatement<String>> exte
     }
 
     @Override
-    public final DataSchemaNode getDataChildByName(final QName name) {
-        // Child nodes are keyed by their container name, so we can do a direct
-        // lookup
-        return childNodes.get(name);
+    public final Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        // Child nodes are keyed by their container name, so we can do a direct lookup
+        return Optional.ofNullable(childNodes.get(requireNonNull(name)));
     }
 
     @Override
index 1cd8342f467a378eb7d0ac9a08f126956ca8f67b..35b3a41be956f68c0d569a32afd014e058facb24 100644 (file)
@@ -117,8 +117,8 @@ final class CaseShorthandImpl implements ChoiceCaseNode, DerivableSchemaNode {
     }
 
     @Override
-    public DataSchemaNode getDataChildByName(final QName name) {
-        return getQName().equals(name) ? caseShorthandNode : null;
+    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        return name.equals(getQName()) ? Optional.of(caseShorthandNode) : Optional.empty();
     }
 
     @Override