From fcfb9bd360a007d6f68a63394681fa0c440896d9 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 27 Oct 2017 18:28:13 +0200 Subject: [PATCH] Introduce DataNodeContainer.findDataChildByName() 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 --- .../yang/data/util/ContainerSchemaNodes.java | 16 ++++++++------ .../yang/data/util/RpcAsContainer.java | 9 ++++---- .../yang/model/api/DataNodeContainer.java | 22 ++++++++++++++++--- .../immutable/AbstractDataNodeContainer.java | 7 ++++-- .../model/util/AbstractSchemaContext.java | 11 ++++++---- .../util/EffectiveAugmentationSchema.java | 9 ++++---- .../model/util/SchemaContextProxyTest.java | 2 +- ...tEffectiveDocumentedDataNodeContainer.java | 10 +++++---- .../effective/AbstractEffectiveModule.java | 15 +++++++------ .../rfc6020/effective/CaseShorthandImpl.java | 4 ++-- 10 files changed, 67 insertions(+), 38 deletions(-) diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java index 40107f6265..9222f3dbc5 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java @@ -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 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 findDataChildByName(final QName name) { + return Optional.ofNullable(mapNodes.get(requireNonNull(name))); } @Override diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java index b6443311a6..ec4616fa4a 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java @@ -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 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(); } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java index d07be7d64d..308697a7cf 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java @@ -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 findDataChildByName(QName name); /** * Returns grouping nodes used ny this container. diff --git a/yang/yang-model-immutable/src/main/java/org/opendaylight/yangtools/yang/model/immutable/AbstractDataNodeContainer.java b/yang/yang-model-immutable/src/main/java/org/opendaylight/yangtools/yang/model/immutable/AbstractDataNodeContainer.java index 030df61659..6938022333 100644 --- a/yang/yang-model-immutable/src/main/java/org/opendaylight/yangtools/yang/model/immutable/AbstractDataNodeContainer.java +++ b/yang/yang-model-immutable/src/main/java/org/opendaylight/yangtools/yang/model/immutable/AbstractDataNodeContainer.java @@ -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 findDataChildByName(final QName name) { + return Optional.ofNullable(children().get(requireNonNull(name))); } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/AbstractSchemaContext.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/AbstractSchemaContext.java index 564ae331d7..b379152ee6 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/AbstractSchemaContext.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/AbstractSchemaContext.java @@ -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 findDataChildByName(final QName name) { + requireNonNull(name); for (Module module : getModules()) { - final DataSchemaNode result = module.getDataChildByName(name); - if (result != null) { + final Optional result = module.findDataChildByName(name); + if (result.isPresent()) { return result; } } - return null; + return Optional.empty(); } @Override diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java index 0f4e019b5c..7120e9d25c 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java @@ -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 realChildSchemas) { - this.delegate = Preconditions.checkNotNull(augmentSchema); + this.delegate = requireNonNull(augmentSchema); this.realChildSchemas = ImmutableSet.copyOf(realChildSchemas); final Map 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 findDataChildByName(final QName name) { + return Optional.ofNullable(mappedChildSchemas.get(requireNonNull(name))); } @Override diff --git a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaContextProxyTest.java b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaContextProxyTest.java index d170d384d7..a60ccfb130 100644 --- a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaContextProxyTest.java +++ b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaContextProxyTest.java @@ -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); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveDocumentedDataNodeContainer.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveDocumentedDataNodeContainer.java index 6781120ac2..9cbb9c5766 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveDocumentedDataNodeContainer.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveDocumentedDataNodeContainer.java @@ -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 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 diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveModule.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveModule.java index 0260a02437..4067b95a42 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveModule.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AbstractEffectiveModule.java @@ -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> exte @Override public Set 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> 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 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 diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseShorthandImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseShorthandImpl.java index 1cd8342f46..35b3a41be9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseShorthandImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseShorthandImpl.java @@ -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 findDataChildByName(final QName name) { + return name.equals(getQName()) ? Optional.of(caseShorthandNode) : Optional.empty(); } @Override -- 2.36.6