From 058a4519564d427b23e3bad51938e936d98157df Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 11 Nov 2017 22:10:53 +0100 Subject: [PATCH] Move Utils.findNode() This is a plain lookup on SchemaNodeIdentifierBuildNamespace, move the method there so it can easily be maintained. Adjust call sites to it returning Optional. One call site relies on result being StatementContextBase -- rather than polluting the lookup method, guard the site. Change-Id: I0553710a79e5ca987d35d9fbedd13c164e78f244 Signed-off-by: Robert Varga --- .../SchemaNodeIdentifierBuildNamespace.java | 18 ++++++++++++++++++ .../stmt/anyxml/AnyxmlStatementSupport.java | 13 ++++--------- .../AbstractAugmentStatementSupport.java | 12 ++++++------ .../rfc7950/stmt/uses/UsesStatementImpl.java | 17 ++++++++++------- .../yang/parser/stmt/rfc6020/Utils.java | 12 ------------ 5 files changed, 38 insertions(+), 34 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/SchemaNodeIdentifierBuildNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/SchemaNodeIdentifierBuildNamespace.java index 37dc85c6c0..c26b9f7403 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/SchemaNodeIdentifierBuildNamespace.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/SchemaNodeIdentifierBuildNamespace.java @@ -7,9 +7,12 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.namespace; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.Beta; import java.util.Collection; import java.util.Iterator; +import java.util.Optional; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -33,6 +36,21 @@ public final class SchemaNodeIdentifierBuildNamespace super(SchemaNodeIdentifierBuildNamespace.class, (Class) ChildSchemaNodeNamespace.class); } + /** + * Find statement context identified by interpreting specified {@link SchemaNodeIdentifier} starting at specified + * {@link StmtContext}. + * + * @param root Search root context + * @param identifier {@link SchemaNodeIdentifier} relative to search root + * @return Matching statement context, if present. + * @throws NullPointerException if any of the arguments is null + */ + public static Optional> findNode(final StmtContext root, + final SchemaNodeIdentifier identifier) { + return Optional.ofNullable(root.getFromNamespace(SchemaNodeIdentifierBuildNamespace.class, + requireNonNull(identifier))); + } + @Override public Mutable> get(@Nonnull final SchemaNodeIdentifier key) { throw new UnsupportedOperationException("Direct access to namespace is not supported"); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java index 3d1ad2fe0a..e0af8827bd 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java @@ -20,12 +20,12 @@ import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.odlext.namespace.AnyxmlSchemaLocationNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; +import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; public final class AnyxmlStatementSupport extends AbstractQNameStatementSupport> { @@ -82,14 +82,9 @@ public final class AnyxmlStatementSupport extends private static Optional getAnyXmlSchema( final StmtContext> ctx, final SchemaNodeIdentifier contentSchemaPath) { - final StmtContext findNode = Utils.findNode(ctx.getRoot(), contentSchemaPath); - if (findNode != null) { - final EffectiveStatement anyXmlSchemaNode = findNode.buildEffective(); - if (anyXmlSchemaNode instanceof ContainerSchemaNode) { - return Optional.of((ContainerSchemaNode) anyXmlSchemaNode); - } - } - return Optional.empty(); + return SchemaNodeIdentifierBuildNamespace.findNode(ctx.getRoot(), contentSchemaPath) + .map(StmtContext::buildEffective) + .filter(ContainerSchemaNode.class::isInstance).map(ContainerSchemaNode.class::cast); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java index 49369108ae..3837c01a6a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java @@ -12,6 +12,7 @@ import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Collection; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; import org.opendaylight.yangtools.yang.common.QName; @@ -40,7 +41,6 @@ import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -147,9 +147,9 @@ abstract class AbstractAugmentStatementSupport extends AbstractStatementSupport< * Do not fail, if it is an uses-augment to an unknown node. */ if (YangStmtMapping.USES == augmentNode.getParentContext().getPublicDefinition()) { - final StatementContextBase targetNode = Utils.findNode(getSearchRoot(augmentNode), - augmentNode.getStatementArgument()); - if (targetNode != null && StmtContextUtils.isUnknownStatement(targetNode)) { + final Optional> targetNode = SchemaNodeIdentifierBuildNamespace.findNode( + getSearchRoot(augmentNode), augmentNode.getStatementArgument()); + if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) { augmentNode.setIsSupportedToBuildEffective(false); LOG.warn( "Uses-augment to unknown node {}. Augmentation has not been performed. At line: {}", @@ -164,8 +164,8 @@ abstract class AbstractAugmentStatementSupport extends AbstractStatementSupport< }); } - private static Mutable getSearchRoot(final Mutable augmentContext) { - final Mutable parent = augmentContext.getParentContext(); + private static StmtContext getSearchRoot(final StmtContext augmentContext) { + final StmtContext parent = augmentContext.getParentContext(); // Augment is in uses - we need to augment instantiated nodes in parent. if (YangStmtMapping.USES == parent.getPublicDefinition()) { return parent.getParentContext(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementImpl.java index 89649acd26..c04a210ffc 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementImpl.java @@ -7,9 +7,11 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.uses; +import com.google.common.base.Verify; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Collection; +import java.util.Optional; import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; @@ -27,6 +29,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -38,7 +41,6 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangValidationBundles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -189,17 +191,17 @@ final class UsesStatementImpl extends AbstractDeclaredStatement implement } private static void performRefine(final Mutable subStmtCtx, final StmtContext usesParentCtx) { - final Object refineArgument = subStmtCtx.getStatementArgument(); InferenceException.throwIf(!(refineArgument instanceof SchemaNodeIdentifier), subStmtCtx.getStatementSourceReference(), "Invalid refine argument %s. It must be instance of SchemaNodeIdentifier.", refineArgument); - final SchemaNodeIdentifier refineTargetNodeIdentifier = (SchemaNodeIdentifier) refineArgument; - final StatementContextBase refineTargetNodeCtx = InferenceException.throwIfNull( - Utils.findNode(usesParentCtx, refineTargetNodeIdentifier), subStmtCtx.getStatementSourceReference(), - "Refine target node %s not found.", refineTargetNodeIdentifier); + final Optional> optRefineTargetCtx = SchemaNodeIdentifierBuildNamespace.findNode( + usesParentCtx, (SchemaNodeIdentifier) refineArgument); + InferenceException.throwIf(!optRefineTargetCtx.isPresent(), subStmtCtx.getStatementSourceReference(), + "Refine target node %s not found.", refineArgument); + final StmtContext refineTargetNodeCtx = optRefineTargetCtx.get(); if (StmtContextUtils.isUnknownStatement(refineTargetNodeCtx)) { LOG.debug("Refine node '{}' in uses '{}' has target node unknown statement '{}'. " + "Refine has been skipped. At line: {}", subStmtCtx.getStatementArgument(), @@ -209,7 +211,8 @@ final class UsesStatementImpl extends AbstractDeclaredStatement implement return; } - addOrReplaceNodes(subStmtCtx, refineTargetNodeCtx); + Verify.verify(refineTargetNodeCtx instanceof StatementContextBase); + addOrReplaceNodes(subStmtCtx, (StatementContextBase) refineTargetNodeCtx); subStmtCtx.addAsEffectOfStatement(refineTargetNodeCtx); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java index a9417ca4d6..cb8d200546 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java @@ -11,16 +11,11 @@ import com.google.common.base.CharMatcher; import java.util.Collections; import java.util.List; import java.util.regex.Pattern; -import javax.annotation.Nullable; import org.antlr.v4.runtime.tree.TerminalNode; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser; import org.opendaylight.yangtools.yang.common.YangVersion; -import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; -import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; public final class Utils { private static final CharMatcher ANYQUOTE_MATCHER = CharMatcher.anyOf("'\""); @@ -106,11 +101,4 @@ public final class Utils { } } } - - @Nullable - public static StatementContextBase findNode(final StmtContext rootStmtCtx, - final SchemaNodeIdentifier node) { - return (StatementContextBase) rootStmtCtx.getFromNamespace(SchemaNodeIdentifierBuildNamespace.class, - node); - } } -- 2.36.6